s1 != s2, 如果使用new 则JVM不论内存有没有都会创建一个新的String对象 所以s1 != s2;
s1 = s5, 在编译时s5 后面的字面量会被优化成一个“Programming” 所以s1 = s5;
s1 != s6, 是因为非常量字会串相加时,由于相加的变量中存放的是字符串的地址引用,因为在编译时无法确切地知道其他具体的值,也就没有办法对其进行优化处理
intern 部分可以参考http://blog.csdn.net/u012941811/article/details/52415133
你是要打算问什么关于String类的问题
运行结果和你用的java 版本有关
参考:http://blog.csdn.net/u012941811/article/details/52415133
首先就java7,8来说, 你想判等需要用str0.equal(str1) 来实现,至于原因,我就不说了。
1.String是个不可变类,每次使用+返回的都是一个新的String;
2.equals是比较内存中的String内容,==是比较地址.
运行结果和你用的java 版本有关
参考:http://blog.csdn.net/u012941811/article/details/52415133
String重写了Object的equals方法,不再是==
1.String是个不可变类,每次使用+返回的都是一个新的String;
2.equals是比较内存中的String内容,==是比较地址.
首先 你要明白
1· String 不是基本数据类型。
2· 用 == 进行 非基本数据类型 的 数据对比 对比的是引用。
3· String 一般情况下是存放在字符串池中,而且是唯一的。如果你重新定义一个字符串,但是都是相同的字符串,JVM会给它持有相同的引用,并不会新创建字符串。(NEW 不在范围内)。
equals是内容比较,==是地址比较
intern()方法:
首先明确:使用引号声明的字符串都是会直接在字符串常量池中生成的,而 new 出来的 String 对象是放在堆空间中的,所以两者的内存地址肯定是不相同的。
String s1="programming"; 生成了常量池中的“programming” 和堆空间中的字符串对象。
s6.intern(), 这一句的作用是s6对象去常量池中寻找后发现"programming"已经存在于常量池中了,则让s6引用指向了常量池中的"programming".
所以System.out.println(s1==s6.intern());地址相同输出true;
而s2是new出来的,s2.intern(),这一句的作用是s2对象去常量池中寻找后发现"programming"已经存在于常量池中了,则返回了常量池中的"programming".所以System.out.println(s2==s2.intern());前后地址变不同了,则输出false;(个人浅见)
equals是比较内存中的String内容,==是比较地址
他们的物理地址不同,不是一个对象,并不能认为是完全的相等(“==”)