Value value = new Value();
Value value2 = new Value();
value.i = value2.i = 100;
//equals()方法默认是比较对象内存地址的引用,如果需要比较两个对象的值是否相同,
//需要新类重写equals()方法
System.out.println(value.equals(value2));//false
String str = new String();
String str1 = new String();
str = "string";
str1 = "string";
/**
* (我的理解)
* String str = new String();在内存中创建以str对象,并为其在堆中分配空间
* String str1 = new String();在内存中创建以str1对象,并为其在堆中分配空间
* str = "string";在堆中产生一个值为“string”的对象,str指向这个对象
* str1 = "string";str1也指向这个对象
* 因此str和str1的引用地址相同
* 疑问:
* str = "string";
* str1 = "string";
* 这里应该在堆中产生两个值为“string”的对象,并为其在堆中分配空间
* 那str和str1的引用地址就不相同。为什么在堆中只产生一个值为“string”的对象???
*/
System.out.println(str.equals(str1));//true
System.out.println(str == str1);//true
/**
* 只有用new了,才在堆中分配空间,创建对象
* String str2 = new String("string1");
* String str3 = new String("string1");
* 虽然值是一样的,但是在堆中存在两个对象,因此str2和str3的引用地址不相同
*/
String str2 = new String("string1");
String str3 = new String("string1");
//比较对象的引用
System.out.println(str2 == str3);//false
//比较对象的值,String重写了equals()
System.out.println(str2.equals(str3));//true
String str4;
String str5;
str4 = "string";
str5 = "string";
System.out.println(str4 == str5);//true
System.out.println(str4.equals(str5));//true