String str="hello";
String s1="hel"+"lo";
String s2="hel";
String s3="lo";
System.out.println(str==s1);
System.out.println(str==(s2+s3));
为什么结果不一样呢 ??
而分别是 true false;
加号起的作用不一样吗??还是别的什么原因??
String s1="hel"+"lo";
String s2="hel";
String s3="lo";
System.out.println(str==s1);
System.out.println(str==(s2+s3));
为什么结果不一样呢 ??
而分别是 true false;
加号起的作用不一样吗??还是别的什么原因??
要输出就System.out.println(str);
在String的初始化时,系统会先查找是否已经存在相同的String,如果存在了,直接指向到这个String,所以str和S1会相等,第一个是true.
而在s2+s3在并不会这样,而是直接重新new一个String,这个String值是"hello",但是他是新生成的,地址和str指向的肯定不一样,所以第二个是false.
我记得一本书上说的 凡是 + 号创建的对象都不是共享的
String str="hello"; //编译的时候就是str = "hello" 保存在字符串池中
String s1="hel"+"lo"; //编译的时候就是s1 = "hello" 指向字符串里的str
String s2="hel"; //编译的时候就是s2 = "hel"
String s3="lo"; //编译的时候就是s3 = "lo"
s2+s3 //编译的时候 不知道s2+s3是多少 只有在运行完之后才知道是hello
String s1="hel"+"lo"; 编译后就变成了String s1="hello";
所以出现了你看到的结果
==比较应用类型的变量,比较的是引用是否相同,即是否引用同一个对象
s1,str这种引号括起来的字符串直接量(或者叫规范化字符串),或者是+号连接起来的
在编译的时候,已经在class文件的CONSTANT_STRING_INFO表中了,也就是俗称的字符串常量池了
在class文件加载的时候,这些对象会被创建,而s2+s3是在运行到那一句时,临时创建的
所以前一个为true,后一个为false
详细的可以看我的另外一片帖子,我对String的一些见解
http://topic.csdn.net/u/20080725/04/97b56b19-cd16-4167-9a31-7c5201974627.html
6楼是我的总结,发贴的时候走了些误区
String s1="hel"+"lo"; //后面两个不是变量是两个常量
String s2="hel";
String s3="lo";
System.out.println(str==s1);
System.out.println(str==(s2+s3).intern()); //最后相加是s2、s3是变量在运行时刻才能知道,也就是s2+s3是在堆里创建的
这个是String Pool问题!
当然用 equals也行!
http://blog.csdn.net/songshuxing/archive/2008/08/08/2786565.aspx
我这有!如果还不清楚看看吧
StringBuffer a=new StringBuffer("a");
StringBuffer b=new StringBuffer("a");
System.out.println(a==b);
System.out.println(a.equals(b));
输入是false false;
第二个是false为什么?
没覆写equals()的话就是比较reference而不是内容,因为Object中equals()比较的是reference可能是StringBuffer中没有覆写equals()???
不敢确定
又好象在哪看过,类库中的类都有覆写equals()
==比较的是地址
equals是比较内容是否相等.
你把System.out.println(str==(s2+s3));
改成System.out.println(str.equals(s2+s3));
==通常是比较HashCode值
==是判断两个字符串的值是否相等,equals()是判断两个字符串的内容是否相等。
有的时候==是不可以用的,当字符串是经过运算得来的时候,==很可能失效。
一般采用equals()方法,其实还有其他方法,具体的看java 核心技术。