在java中都经常遇到过==和equals之间的比较,下面说一下我对两个之间比较的浅显的看法
综述: java中变量的类型分为基本数据类型和引用类型,它们在用==和equals的时候比较的内容是不一样的。
1.==比较的是值,它可以用作比较基本数据类型和引用类型的变量,对于基本类型它比较的是值是否相等,而对于引 用类型的变量它们比较的是所指向对象的地址是否相同。
2.equal:用于比较引用型变量所指向的地址的内容是否相同,不能用于比较基本数据类型。
// ==和equals
public class Demo01 {
public static void main(String[] args) {
// ==用于基本数据类型的比较
int n = 1;
int m = 1;
System.out.println(n == m);
String str = new String("hello");
String str1 = new String("hello");
String str2 = new String("hello");
// ==用于引用类型的比较
System.out.println(str1 == str2);
// equals用于引用类型的地址指向值比较
System.out.println(str1.equals(str2));
str1 = str;
str2 = str;
System.out.println(str1 == str2);
//注意
String s1 = "a";
String s2 = "a";
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
true
false
true
true
true
true
扩:在上面例子中注意最后一个,当你new str/str1/str2的时候它们都在堆中分配了一段内存空间去存放你所要初始化的值。str/str1/str2都是一个新的对象它们指向的地址都是不同的,而你s1=a和s2=a的时候就并不一样了,当我们执行
"String s1 = "a" "(只是针对我的这段代码),首先jvm会到常量池中去寻a这个值,如果没有就在常量池中创建一个值a,然s1的指向这个a,然后执行 String s2 = "a"; jvm在常量池中找到了值a,就不会创建a这个值,直接将s2指向a,这样他们的值和地址就都是相同的。
如有问题之处,还望多多指教!!!