今天碰到了一个类重写了equal与hashcode的类。
不解,百度,发现了一个知识漏洞

1.
Java中判断两个变量是否相等有两种方式:一种是利用==运算符,另一种是利用equals方法。如果变量是基本类型,那么使用==和使用equals会得到相同的结果,都是判断变量的值是否相对。如果变量是引用类型,==运算符判断变量是否指向同一引用对象,equals判断变量”值”是否相等。Java值类型对应的包装类(Boolean、Byte、Short、Integer、Long、Float、Double、Charcater)可以利用==运算符进行值判断。

int inta = 65;
float floata = 65.0f;
Integer intb = 65;
Float floatb = 65.0f;
//inta == floata根据值判断,结果是true
System.out.println("inta == floata:" + (inta == floata));       
//inta == intb根据值判断,结果是true
System.out.println("inta == intb:" + (inta == intb));
//inta == floatb根据值判断,结果是true
System.out.println("inta == floatb:" + (inta == floatb));

String stra = "测试";
String strb = new String("测试");
String strc = new String("测试");
String strd = "测试";
//stra和strb指向不同的对象,结果是false
System.out.println("stra == strb:" + (stra == strb));
//stra和strd指向同一个对象,结果是true
System.out.println("stra == strd:" + (stra == strd));
//strb和strc指向不同的对象,结果是false
System.out.println("strb == strc:" + (strb == strc));
//strb和strc的值一样,结果是true
System.out.println("strb equals strc:" + (strb.equals(strc)));
//stra和strb的值一样,结果是true
System.out.println("stra equals strb:" + (stra.equals(strb)));

2.

于是继续探究基本类型都有什么

数据类型 大小 范围 默认值

byte(字节) 8 -128 - 127 0
shot(短整型) 16 -32768 - 32768 0
int(整型) 32 -2147483648-2147483648 0
long(长整型) 64 -9233372036854477808-9233372036854477808 0
float(浮点型) 32 -3.40292347E+38-3.40292347E+38 0.0f
double(双精度) 64 -1.79769313486231570E+308-1.79769313486231570E+308 0.0d
char(字符型) 16 ‘ \u0000 - u\ffff ’ ‘\u0000 ’
boolean(布尔型) 1 true/false false

3
那么为什么基本类型可以直接=,但是非基本类型就要new呢?

举一个简单的例子:String str1 = “x” ; String str2 = “x” ; String str3 = new String(“x”) ;

String本身就是一个对象而不是基本数据类型,String的变量名是对String类的引用。其它那些Stirng Literals Pool就不讲了,我只是简单地讲下上面的过程,希望对大家用少用

在声名str1的时候,由于还有没等于”x”的对象,所以就创建了一个新的对象;在声名str2的时候,由于有了等于”x”的对象,所以系统就将其值取出直接返回给str2,所以str1和str2变量名都是作为”x”对象的引用。当然new String()就实列一个新的对象了。到了这里大家还会认为”String型”吗?==============================================再讲一下“==”和“equals”的用法!(会更理解上面所说的)== 对象的比较好像也就是地址的比较equals对象值的比较所以str1 == str2 返回True,str1 == str3 返回False, str1.equals(str3)返回True。==============================================

4
还是有些不解,为什么string就不是基本类型呢?

基础类型与引用类型的区别是,基础类型只表示简单的字符或数字,引用类型可以是任何复杂的数据结构
基本类型仅表示简单的数据类型,引用类型可以表示复杂的数据类型,还可以操作这种数据类型的行为
java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,而对于引用类型变量,他仅仅是一个指向堆区中某个实例的指针。