A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 傲鸽 中级黑马   /  2013-7-1 22:06  /  2612 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Test {
  2.                 public static void main(String[] args) {
  3.                         String s = "abc";
  4.                         s.substring(1);
  5.                         s.replace("bc", "xyz");
  6.                        System.out.println(s);
  7.                        String value = new String ("abc");
  8.                        System.out.println(s == value);
  9.                 }
  10.        }
复制代码
写出以下代码执行结果,分析为什么?

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

8 个回复

倒序浏览
本帖最后由 肥猫 于 2013-7-1 22:37 编辑

首先,你那个substring用法错了.举个例子应该这么用substring(1,3);
第二Srting类其大多数方法都是final的,并不将子字符串返回覆盖原字符串,这里你重新给S赋值就行了s =s.replace("bc","xyz");当然要是你够犀利完全可以玩转StringBuffer.
第三,假设你不需要原字符串改变,只是想问两个ABC为啥返回false,那么原因在于value后面那个new.哈哈同一个问题说多了就没意思了.

评分

参与人数 1黑马币 +3 收起 理由
神之梦 + 3 。。。。。。。。。

查看全部评分

回复 使用道具 举报
输出结果
abc
false
首先字符串被定义后是不能改变的,System.out.println(s);  输出的是abc
s.replace("bc", "xyz");  s中的内容是不会替换的,而是返回新的被替换的字符串。
若String  s1 =s.replace("bc", "xyz");  System.out.println(s1);  输出的是axyz
String value = new String ("abc"); 虽然value和s内容一样,但不是一个对象,所以返回false
若用s1.equals(s) 是比较内容,则返回true。
下面的话希望能解决楼主疑惑:程序在运行的时候会创建一个字符串缓冲池。当使用 s = "abc" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象。在第一次创建后,s先被放到了池中,如果后面创建s1= "abc",程序找到了具有相同值的 s,然后将s1引用s所引用的对象,这时s和s1引用同一个对象,s==s1为true。楼主程序中,使用了 new 操作符,他明白的告诉程序:“我要一个新的!不要旧的!”与是一个新的"abc"Sting对象被创建在内存,这时s和s1引用不同一个对象,s==s1就会为false。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 很给力!

查看全部评分

回复 使用道具 举报
肥猫 发表于 2013-7-1 22:16
首先,你那个substring用法错了.举个例子应该这么用substring(1,3);
第二Srting类其大多数方法都是final的, ...

哥们,你第一点记错了,substring那么用没问题
回复 使用道具 举报
神之梦 发表于 2013-7-1 22:40
哥们,你第一点记错了,substring那么用没问题

那么用没效果的,没重新给S赋值,而且,你提醒我我又去查了API,这是说明:
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。
示例:

"hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"

参数:
beginIndex - 起始索引(包括)。
endIndex - 结束索引(不包括)。
回复 使用道具 举报
输出: abc     false
s.substring(1);  s.replace("bc", "xyz"); 这两个方法都是返回一个新的string(也就是结果) ,s并没有改变。
Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。s 和 value 的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。
回复 使用道具 举报
肥猫 发表于 2013-7-1 22:47
那么用没效果的,没重新给S赋值,而且,你提醒我我又去查了API,这是说明:
返回一个新字符串,它是此字符串的 ...

API中有只传一个参数的substring方法,我明白哥们的意思,我也只是跟哥们说下,substring方法是可以只传一个参数的,没别的意思
String substring(int beginIndex)
          返回一个新的字符串,它是此字符串的一个子字符串。
回复 使用道具 举报
神之梦 发表于 2013-7-1 22:59
API中有只传一个参数的substring方法,我明白哥们的意思,我也只是跟哥们说下,substring方法是可以只传 ...

哦,呵呵,是我会错意了,真不好意思.,.~~:loveliness:
回复 使用道具 举报
肥猫 发表于 2013-7-1 23:04
哦,呵呵,是我会错意了,真不好意思.,.~~

没事,因为substring方法有只传一个参数的和可以传两参数的,开始以为是哥们记错了,嘿嘿
多多交流:handshake
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马