完全一样,比较字符串equals与== 完全没有区别吗?
闭关修行中......
String a1="a"; String a2="a"; String b1=new String("b"); String b2=new String("b"); System.out.println(a1 == a2); System.out.println(a1.equals(a2)); System.out.println(b1 == b2); System.out.println(b1.equals(b2));
结果:
true true false true
==比较的是变量指向对象是否一致,之所以s与s2相等是因为jvm进行优化,两个变量指向一个对象。equal比较的是对象中保存的字符串是否相同。
有些问题 ,其实源码里有最好的答案
public boolean equals(Object anObject) { //如果引用的是同一个对象,返回真 if (this == anObject) { return true; } //如果不是String类型的数据,返回假 if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; //如果char数组长度不相等,返回假 if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; //从后往前单个字符判断,如果有不相等,返回假 while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } //每个字符都相等,返回真 return true; } } return false;
== 运算符测试两个引用是否指向同一个对象。如果要测试两个不同的对象是否相等,必须使用 equals() 方法。
如果有兴趣了解更多,可以看一下我写的一篇文章。Java快速扫盲指南
感觉你提问很有问题,你是如何从贴出的代码中得到文字描述的结论的?我这里大概猜测一下你的意图,勉强回答一下。在java中,==和equal方法是不同的,简要描述如下:
==
==用于判断两个引用是否指向相同的对象,如 Object a = new Object(); Object b = a; a == b; // ==> true
equal
equal方法用于判断两个对象是否相等。这个方法在顶级类Object中就已经定义了,在Object中该方法的实现就是用的==来比较引用是否相等。任何子类如果想使用equal方法,最好覆写Object的equal方法,提供自己的相等逻辑。如下定义一个Person类。
public class Person { private String name; private int age; // ... @Override public boolean equal(Object o) { if(o instanceof Person) { return o.getName().equal(name) && o.getAge() == age; } else { return false; } } }
s 和 s2 都是直接引用的常量 "12",编译器会优化代码,只创建一个 "12" String 对象,由两个变量来引用,所以 s == s2。但是如果你的另一个 "12" 是由其它方式创建的,比如 new String("12"),或者 "1234".substring(0, 2),你就会发现 == 不好使了,而 equals 是对内容进行比较。看 equals 的原码你会发现它也是先使用 == 比较引用的
s
s2
new String("12")
"1234".substring(0, 2)
equals
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
new出来就不一样了
首先要考虑equals跟==的作用:==相当于是比较两个对象的引用,而equals方法是Object类中定义的,String类对其进行了重写,源代码可以看楼上的分析,首先也使用==比较了引用,之后比较内容。我们在比较两个字符串时,大多是想比较内容,所以使用equals方法。如果你使用==,IDE其实是会抛一个警告的。
那么为什么你这里的==与equals方法效果一样呢,就要看使用“=”创建字符串对象与使用new创建字符串的区别。不知道有没有去了解过字符串池,我的理解也不深,需要的话可以自己看看。第一次使用“=”创建字符串对象时,会查看字符串池中有没有“12”,如果没有,那么就添加一个到池中,然后把引用返回给s;之后再创建s2时,发现池中有,那么直接将这个引用赋给s2,所以s和s2的引用是相同的,造成==比较为true。可以用new的方式创建字符串,然后看看效果:
String s1 = "12"; String s2 = "12"; String s3 = new String("12"); System.out.println(s1 == s2);//true System.out.println(s1.equals(s2));//true System.out.println(s1 == s3);//false System.out.println(s1.equals(s3));//true
使用new关键字创建字符串对象时,每次都会新创建一个对象,然后把引用赋给变量。
都说的不错,建议你搜索字符串常量池,会让你有深刻体会的
题主你的s1和s2内容是一样的,你这种赋值方式是这样的,首先s1会将字符串“……”放到JVM虚拟机的常量池中,第二次赋值s2的时候会优先判断常量池中是否包含这个字符串,如果有就指向他。所以即使你用==也会相等。如果你s2使用new string(123),这时引用地址不同了,就不相等了。手机码字不容易。
结果:
==比较的是变量指向对象是否一致,之所以s与s2相等是因为jvm进行优化,两个变量指向一个对象。
equal比较的是对象中保存的字符串是否相同。
有些问题 ,其实源码里有最好的答案
== 运算符测试两个引用是否指向同一个对象。如果要测试两个不同的对象是否相等,必须使用 equals() 方法。
如果有兴趣了解更多,可以看一下我写的一篇文章。Java快速扫盲指南
感觉你提问很有问题,你是如何从贴出的代码中得到文字描述的结论的?
我这里大概猜测一下你的意图,勉强回答一下。
在java中,==和equal方法是不同的,简要描述如下:
==
==用于判断两个引用是否指向相同的对象,如
Object a = new Object();
Object b = a;
a == b; // ==> true
equal
equal方法用于判断两个对象是否相等。这个方法在顶级类Object中就已经定义了,在Object中该方法的实现就是用的==来比较引用是否相等。任何子类如果想使用equal方法,最好覆写Object的equal方法,提供自己的相等逻辑。如下定义一个Person类。
s
和s2
都是直接引用的常量 "12",编译器会优化代码,只创建一个 "12" String 对象,由两个变量来引用,所以 s == s2。但是如果你的另一个 "12" 是由其它方式创建的,比如new String("12")
,或者"1234".substring(0, 2)
,你就会发现==
不好使了,而equals
是对内容进行比较。看equals
的原码你会发现它也是先使用==
比较引用的new出来就不一样了
首先要考虑equals跟==的作用:
==相当于是比较两个对象的引用,而equals方法是Object类中定义的,String类对其进行了重写,源代码可以看楼上的分析,首先也使用==比较了引用,之后比较内容。
我们在比较两个字符串时,大多是想比较内容,所以使用equals方法。如果你使用==,IDE其实是会抛一个警告的。
那么为什么你这里的==与equals方法效果一样呢,就要看使用“=”创建字符串对象与使用new创建字符串的区别。
不知道有没有去了解过字符串池,我的理解也不深,需要的话可以自己看看。
第一次使用“=”创建字符串对象时,会查看字符串池中有没有“12”,如果没有,那么就添加一个到池中,然后把引用返回给s;之后再创建s2时,发现池中有,那么直接将这个引用赋给s2,所以s和s2的引用是相同的,造成==比较为true。
可以用new的方式创建字符串,然后看看效果:
使用new关键字创建字符串对象时,每次都会新创建一个对象,然后把引用赋给变量。
都说的不错,建议你搜索字符串常量池,会让你有深刻体会的
题主你的s1和s2内容是一样的,
你这种赋值方式是这样的,
首先s1会将字符串“……”放到JVM虚拟机的常量池中,
第二次赋值s2的时候会优先判断常量池中是否包含这个字符串,如果有就指向他。
所以即使你用==也会相等。
如果你s2使用new string(123),这时引用地址不同了,就不相等了。
手机码字不容易。