public static void main(String[] args) {
String str0 = new String("HelloWord"); // 堆区
String str1 = "HelloWord"; // 常量区
String str2 = "HelloWord";
String str3 = new String("HelloWord");
String str4 = "Hello";
String str5 = "World";
String str6 = str4 + str5;
String str7 = str4 + "World";
System.out.println("------ == ------");
System.out.println(str0 == str1); // false
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str6); // false
System.out.println(str1 == str7); // false
System.out.println(str6 == str7); // false
System.out.println("------ equal ------");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str1.equals(str6)); // false
System.out.println(str1.equals(str7)); // false
System.out.println(str6.equals(str7)); // true
System.out.println("------ hashcode ------");
System.out.println(str0.hashCode()); // 在堆量里边,str0,str1,str2,str3的hashcode相等
System.out.println(str1.hashCode()); // 在常量里边,str1,str2,str3的hashcode相等
System.out.println(str2.hashCode()); // 在常量里边,但str1 == str2为false,str1.equal(str2)为true;
System.out.println(str3.hashCode()); // 在堆里边,但str1 == str3为false,str1.equal(str3)为true;
System.out.println(str6.hashCode()); // 在常量里边,str6和str7hashcode相等
System.out.println(str7.hashCode()); // 在常量里边,但str6 == str7为false,str6.equal(str7)为true;
/**
* 结论:hashcode和对象的内存地址没有必然关系,不是hashcode相等,他们的内存地址就一定相等
* 1:由此可见新new 的两个对象他们存在于堆内存里面他们的hashcode值是一样的,
* 但是通过==去判断两个对象是否是同一对象的时候,返回结果确实false,
* 由此可以证明hashcode和对象的内存地址没有必然关系
* 2:还能看出来常量区的"HelloWord"一直是同一个,所以常量区的内存地址是一样的
*/
}
Java的equal 、 == 、hashcode、内存地址
最新推荐文章于 2024-05-28 10:00:00 发布