文章目录
1. java中的数据类型
java的数据类型大概可以分为两类:
1.1 基本类型
byte,short,char,int,long,float,double,boolean。
变量的初始化:不需要使用new关键字
int a; // 开辟了一个名为a的内存空间
int a = 1; // 开辟了一个名为a的内存空间并赋值为1
他们之间的比较,应用双等号(==),比较的是他们的值。
1.2 类
如array, String等都是类。
类的初始化:
int[] a; // 声明了数组变量a,它是**指向某个数组的引用(指针)。**
int[] a = new int[10]; //声明了数组引用a, 并在内存中开辟了一个10 int大小的数组,并让a指向此内存空间
当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址)。
注:对于第二种类型,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。因为每new一次,都会重新开辟堆内存空间。
2. Object.equals && Object.hahscode
Object.equals的实现:
Object a = new Object();
Object b = new.Object();
a.equals(b); 等价于 return (a == b);
也就说看两者的内存地址是否相等。
Object.hashcode的实现:
根据源码,Object.hashcode的计算方法有好几种,但是都遵循以下规范:
- 同一对象(内存地址相同)的hashcode一定相同, 不同地址的两个对象的hashCOde极大概率不同。
3.一般的equals方法和hashCode方法
3.1两者的关系
若在Object的子类中对equals方法进行了重写,则必须对equals方法也重写,以保证当equals方法返回true时,两个对象调用hashcode方法的返回值一定相等。(为了hashset里两个相等对象一定寻到的是同一位置)
3.2方法的重写
String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。它们不再根据内存地址而是根据内容来判断两者是否相等。因此hashcode方法也重写了,两个内容相等的String 、Math、Integer、Double等对象的hashcode一定相等。
3.3Integer.hashCode和Double.hashCode
如果要返回int / double等基本类型的hashcode,需要先转换为对应的封装类。
double a = 1;
((Double) a).hashCode();
而Integer和Double类提供了静态方法可以不用进行类型转换直接返回。
double a = 1.0;
Double.hashCode(a);
4. Objects.hashCode与Objects.hash
Objects类提供操作对象的一组静态方法。
Objects.hashCode(a) **等价于a.hashCode(), 也可以直接用于int,double等基本类型。**另外当a == null, 返回0, 十分安全。
如果某个类的hashCode要由它的几个实例域一起决定,可以调用Obects.hash(a, b, c, …). 它对Object.hashCode(a), Object.hashCode(b)…进行组合。