==与equals的区别
==:既可以比较基本数据类型,也可以比较引用数据类型
当比较基本数据类型时,比较字面值
当比较引用数据类型时,即比较引用地址
equals:通常默认用来比较对象的地址值
但是,具体看对象是否对object类中的equals方法进行重写(覆盖),比如(String)
public class equals {
public static void main(String[] args) {
String s1 = "aaa";
String s2 = "aaa";
String s3 = s1;
String s4 = new String("aaa");
String s5 = new String("aaa");
System.out.println(s1==s2);//true
System.out.println(s2==s3);//true
System.out.println(s4==s5);//false 比较的是引用地址 所以返回false
System.out.println("----------------");
//比较堆
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
System.out.println(s3.hashCode());
System.out.println(s4.hashCode());
System.out.println(s5.hashCode());
System.out.println("----------------");
//比较栈
System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(System.identityHashCode(s3));
System.out.println(System.identityHashCode(s4));
System.out.println(System.identityHashCode(s5));
System.out.println("-----------------");
System.out.println(s1.equals(s2));//true
System.out.println(s2.equals(s3));//true
System.out.println(s4.equals(s5));//true 比较的是两者的内容 所以返回true
}
}
结果:
//静态声明
String str2 = "abc";//保存在常量池
String str3 = "abc";//保存在常量池
//动态声明
String str4 = new String("abc");//保存在堆内存中,指向的是str4的应用地址
String str5 = new String("abc");//保存在堆内存中,指向的是str5的应用地址
String两种不同创建方法内存模型:
1.静态创建时:String的值保存在常量池,如果字面值相同,引用地址也相同
2.动态创建时:String的值保存在堆内存中 ,即使字面值相同,引用地址也不会相同
== 与equals的比较:
1.使用equals的比较,先比较引用地址,如果相等,返回true,如果地址值不相等,判断字面是否一致,一致返回true,否则返回false
2.使用==比较,比较引用地址