Java 中比拟对象是否雷同最罕用的形式就是 equals 和 ’==’. 很显然这是不同的.
首先咱们要理解一下 JVM 的根本结构. 此处波及到的次要是 jvm 的虚拟机栈和堆 heap..Java 文件通过编译之后生成 Class 文件.Class 文件通过类加载器 Class Loader 将资源放入 JVM 不同区域. 栈区保留对象援用地址和根本类型变量 (int,boolean..), 而堆区保留具体对象信息.
1.==
首先. 如果比拟的是根本类型变量, 间接比拟栈区的值, 很显然相等
int a = 1
int b = 1
return a==b
如果比拟的是包装类, 间接 new 一个对象, 比拟堆地址, 不相等
Integer a = new Integer(1)
Integer a2 = new Integer(1)
间接定义 Integer 对象时, 编译器会调用 valueOf() 主动装箱 ( 反编译后果). 当值在 -128 和 127 之外时, 间接 new 一个对象. 很显然堆地址不同.
Integer a =1;
low=-128 high=127
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
而之内的范畴, 翻译一下就是首次应用的时候会初始化缓存生成对象. 堆地址曾经固定了, 天然 -127-128 之间的 Integer 能够间接比拟.
其余的也相似可自行查看.
/**
* Cache to support the object identity semantics of autoboxing for values between
* -128 and 127 (inclusive) as required by JLS.
*
* The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
* During VM initialization, java.lang.Integer.IntegerCache.high property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
如果比拟的是非根本变量, 则比拟他们的栈区所指向的堆地址. 两次 String 生成了两个 String 类的实例, 很显然他们指向的堆地址是不一样的.
String a ="1"; String b = "1";
2.equals
java.lang.Object 是 Java 根类. 如果一个类没有指定父类, 默认继承 Object 类. 比拟堆指向地址.
public boolean equals(Object obj) {return (this == obj); }
当然, 大部分类都重写的 equals 办法.
demo:String.class
1. 首先和本身比拟必定是 true
2.instanceof 判断入参对象是否是 String.class 实例
3. 比拟字符串长度是否雷同
4. 从字符串头部开始比拟每一位是否雷同
public boolean equals(Object anObject) {if (this == anObject) {return true;}
if (anObject instanceof String) {String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
3.hashcode
hashcode 能够了解为一个加密算法依据值得到一个密文来大抵确定一个对象 . 同一个对象的 hashcode 必定雷同然而哈希码雷同的不肯定是同一个对象.
hashcode 次要使用在在散列如 HashMap,HashSet 中.
罕用的数据结构如:
- 数组, 基于索引的有序数据结构, 间断的内存空间, 因而查问很快. 数组初始化固定长度, 数组插入数据时, 批改速度不尽人意.
- 链表, 基于指针, 不间断内存空间, 插入迅速, 然而查找迟缓.
散列联合了数组和列表. 如果呈现哈希碰撞, 在同一个地位应用链表或红黑树解决抵触. 因而不言而喻, 不能拿 hashcode 来判断两个对象是否相等.