String 变量相加 地址值比较的问题 java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 System.out.println(s3==("你"+"好吗")); //这个是trueString对象会维护一个对象池!如果像String s3 = "你好吗";这样赋值就会先从对象池中找!如果找到就直接返回引用!所以第一个是true!第二个我也不大懂可能就像你老师说的那样吧!但是s4+s5和s3的hash值是相同的啊?迷茫啊! System.out.println(s3==("你"+"好吗")); 这个java变为字节码直接优化了s3=="你好吗"; 常量字符串都是相等的。所以返回为true。System.out.println(s4+s5==s3); s4+s5没有优化,使用StringBuilder进行+运算,返回的是一个New String()对象。所以不等。 像是 "你"+"好吗" 在编译阶段就已经确定了,它是不可变的(字符串是不可变类,从创建到销毁始终保持不变)。而s4+s5是不确定的,因为s4和s5可以改变指向。老师说的是对的 s3 == "你"+"好吗"为true是因为在字符串池中找到了"你好吗"这个字符串字符串对象相加会生成新的字符串对象,而不是查找字符串池,所以对象的引用不同,结果为falsepackage csdn;public class test { public static void main(String[] args) { String str1 = "你好吗"; String str2 = "你好" + "吗"; String str3 = new String(str1); String str4 = str1 + ""; System.out.println(str1 == str2); System.out.println(str1 == str3); System.out.println(str1 == str4); } public static void print() { System.out.println("call print()"); }} 第二个因为String变量相加要新开辟一段内存来使用StringBuilder来实现,所以分配在堆上,而s3在栈上,所以肯定false啊而且,即使hashcode一样,两个string也不一定等("buzzards" 和 "righto" ) 1.设s45=s4+s5局部变量s4,s5存储的是堆中两个拘留字符串对象的地址。而当执行s4+s5时,JVM首先会在堆中创建一个StringBuilder类(继承AbstractStringBuilder,底层是用char数组装字符的),同时用s4指向的拘留字符串对象完成初始化,然后调用append方法完成对s5所指向的拘留字符串的合并操作,接着调用StringBuilder的toString()方法在堆中创建一个String对象,最后将刚生成的String对象的堆地址存放在局部变量s45中。而局部变量s3存储的是常量池中"你好吗"所对应的拘留字符串对象的地址。 s45与s地址当然不一样了。 2."你"+"好吗"会直接在编译期就合并成常量"你好吗", 因此相同字面值常量"你好吗"所对应的是同一个拘留字符串对象,自然地址也就相同。 老师说的是对的如果你给s4 , s5 前面加上final 修饰的话final String s4 ="你";final String s5 ="好吗";那么 s4 和 s5 就相当于是常量了,就不会再变那么 s4+s5 在编译期就完成了,第二个等式 就true了 Java求最大值编译之后出现找不到符号 想对LinkedHashSet 排序 应该用什么函数 Collections.sort为什么没用? 关于Timestamp的问题 Nokia手机,N90或者N70,如何读取存储卡的0扇区数据? 现在作swing有发展前景吗? swt问题请教!! 用java写记事本 geyf(其实我也不会) 及各位大侠,请再帮忙指点一下迷津!!! 我想在应用程序中播放声音, 欢迎讨论Websphere和Weblogic的支持率? 这儿我用Debug看了,貌似进入死循环了 JAVA多线程锁问题
//这个是true
String对象会维护一个对象池!如果像String s3 = "你好吗";这样赋值就会先从对象池中找!如果找到就直接返回引用!所以第一个
是true!
第二个我也不大懂可能就像你老师说的那样吧!但是s4+s5和s3的hash值是相同的啊?迷茫啊!
System.out.println(s3==("你"+"好吗")); 这个java变为字节码直接优化了s3=="你好吗"; 常量字符串都是相等的。所以返回为true。System.out.println(s4+s5==s3); s4+s5没有优化,使用StringBuilder进行+运算,返回的是一个New String()对象。所以不等。
字符串对象相加会生成新的字符串对象,而不是查找字符串池,所以对象的引用不同,结果为false
package csdn;public class test {
public static void main(String[] args) {
String str1 = "你好吗";
String str2 = "你好" + "吗";
String str3 = new String(str1);
String str4 = str1 + "";
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str1 == str4);
} public static void print() {
System.out.println("call print()");
}
}
而且,即使hashcode一样,两个string也不一定等("buzzards" 和 "righto" )
2."你"+"好吗"会直接在编译期就合并成常量"你好吗", 因此相同字面值常量"你好吗"所对应的是同一个拘留字符串对象,自然地址也就相同。
如果你给s4 , s5 前面加上final 修饰的话
final String s4 ="你";
final String s5 ="好吗";
那么 s4 和 s5 就相当于是常量了,就不会再变
那么 s4+s5 在编译期就完成了,第二个等式 就true了