Java中比拟对象是否雷同最罕用的形式就是equals和'=='.很显然这是不同的.

首先咱们要理解一下JVM的根本结构.此处波及到的次要是jvm的虚拟机栈和堆heap..Java文件通过编译之后生成Class文件.Class文件通过类加载器Class Loader将资源放入JVM不同区域.栈区保留对象援用地址和根本类型变量(int,boolean..),而堆区保留具体对象信息.

1.==

首先.如果比拟的是根本类型变量,间接比拟栈区的值,很显然相等

int a = 1int b = 1return a==b

如果比拟的是包装类,间接new一个对象,比拟堆地址,不相等

Integer a = new Integer(1)Integer a2 = new Integer(1)

间接定义Integer对象时,编译器会调用valueOf()主动装箱(反编译后果).当值在-128和127之外时,间接new一个对象.很显然堆地址不同.

Integer a =1;low=-128 high=127public 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来判断两个对象是否相等.