public class stringTest {
public static void main(String[] args) {
String s1="a"+"b";
String s2=new String(s1);
if(s1==s2)
标记:System.out.println("== is succeeded");
if (s1.equals(s2))
System.out.println("equals() is succeeded");
}}
做了标记的语句不执行,请问这个是为什么?
public static void main(String[] args) {
String s1="a"+"b";
String s2=new String(s1);
if(s1==s2)
标记:System.out.println("== is succeeded");
if (s1.equals(s2))
System.out.println("equals() is succeeded");
}}
做了标记的语句不执行,请问这个是为什么?
String s2=new String(s1);
==比对引用
s1="ab",它是在编译期,在系统的字符串常量池里面新建了一个字符串常量"ab",并且将这个地址赋给s1
s2=new String(s1),它是先查看字符串常量池中有无和"ab"一样的字符串常量(显然有的)。然后在运行期在堆上创建一个引用s2,所以s1和s2仅仅字面上一样。也就是说,s1.equals(s2)返回true,但是,他们地址,一个指向内存的字符串常量区(属于栈),一个指向堆内存某块,当然他们地址不可能相同了,而==是比较地址的,所以s1==s2 返回false
标记:System.out.println("== is succeeded");
s1和s2在内存中的地址不同~你用==来比较~他们俩的内容虽然一样~不过因为内存地址不一样~所以被认为不是一个内容~
标记的也就不会执行了~
而用equals()是比较里面的内容~跟==比较的不一样~ 所以会执行~
这个贴里讲的很清楚了!!!~~~~~~~~
同一个对象可以有不同的名称
就像一个人一样 一个人可以叫张三 ,他还可以叫 小四
就看名字不看具体对某个人的话
能知道张三 和小四 是一个人吗
而 equals() 的话是调用 hashcode() 方法看他们是否指向同一个对象
如果是的话就是一个人
不是就不是一个人了。
public static void main(String args[]) { String s1="a"+"b";
String s2=new String(s1);
if(s1==s2)
back:System.out.println("== is succeeded");
if (s1.equals(s2))
System.out.println("equals() is succeeded");
}
}
简单的说吧,你可以先这么记
== 比2个String是否是同一个对象,如果是返回true,否则返回false
.equals() 比的是2个String的内容
正解!
字符串 有个自动扣留功能,即如果几个字符串一样,那么不会从新开心的空间,而是将几个引用同时指向该字符串对象,但是使用new操作符产生的字符串对象不行,因为new产生的对象存储在堆里面;
所以==是不能成立的,所以不执行,使用equals可以执行!
String s2=new String(s1); 这里s1和s2的内容虽然是一样的,但仅仅是内容一样,他们的引用是不一样的,