Java中判断两个对象是否相等
2017-03-29 17:45
597 查看
在Java中我们如果想确定两个对象是否相等,有不少种方法,这里将会简要解释
对于基本数据类型,我们可以直接用“==”进行判断,相等则返回true,反之则返回false。
对与引用类型的比较
假设有两个引用对象obj1,obj2, obj1==obj2 判断是obj1,obj2这两个引用变量是否相等,即它们所指向的对象是否为同一个对象。言外之意就是要求两个变量所指内存地址相等的时候,才能返回true,每个对象都有自己的一块内存,因此必须指向同一个对象才返回ture。而在object中默认的equal()也是比较引用变量
3.Java提供了基础类型后,为了仍然保持强对象的要求,又引入了它们的包装类,包装类重写了部分方法,以至于产生了一些有趣的效果
1).
同样是进行初始化,不同的方式产生了不同的效果
下面是JDK中的Integer部分源码
通过以上例子以及源码,我们可以知道:
Integer作为包装类在初始化时,若参数在[-127,128]内,将自动调用在cache数组的一个对象;
此时由于参数不在此范围,故需new 一个新对象,两次对象不同,引用比较为false
2).在使用equal进行比较时
JDK源码:
通过以上例子以及源码,我们可以知道:
而equals参数接受一个Object对象,所以1就被自动装箱成了Integer.valueOf(1),我们看一下Long的equals的实现。如果传进来的是Long型的,那么就比较值,如果传进来的是其他类型,直接返回false
3).
Interger等包装类在使用hashcode()时,是根据类中包含的值生成哈希码。即两个相同大小的integer值,那么它的hashCode也是相等的。
而Object类中的hashCode则和之前的不一样了,是根据对象的内存地址经过哈希算法之后获取到的哈希码,由于每个对象的内存地址不相同,所以hashCode是不同的。
所以当我们用哈希码去比较时,要记得哈希码不相同则对象肯定不相等,哈希码相同时,对象不一定相等。
对于基本数据类型,我们可以直接用“==”进行判断,相等则返回true,反之则返回false。
对与引用类型的比较
假设有两个引用对象obj1,obj2, obj1==obj2 判断是obj1,obj2这两个引用变量是否相等,即它们所指向的对象是否为同一个对象。言外之意就是要求两个变量所指内存地址相等的时候,才能返回true,每个对象都有自己的一块内存,因此必须指向同一个对象才返回ture。而在object中默认的equal()也是比较引用变量
public boolean equals(Object obj) { return (this == obj); }
3.Java提供了基础类型后,为了仍然保持强对象的要求,又引入了它们的包装类,包装类重写了部分方法,以至于产生了一些有趣的效果
1).
同样是进行初始化,不同的方式产生了不同的效果
Integer a = 10; Integer b = 10; System.out.println(a == b);//true Integer a = 200; Integer b = 200; System.out.println(a == b);//false Integer a = 10; Integer b = new Integer(10); System.out.println(a == b);//false
下面是JDK中的Integer部分源码
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); assert IntegerCache.high >= 127; } private IntegerCache() {} }
通过以上例子以及源码,我们可以知道:
Integer作为包装类在初始化时,若参数在[-127,128]内,将自动调用在cache数组的一个对象;
此时由于参数不在此范围,故需new 一个新对象,两次对象不同,引用比较为false
2).在使用equal进行比较时
System.out.println(new Integer(1).equals(1)); // true System.out.println(((Long)1L) == 1); // true System.out.println(new Long(1).equals(1)); // false System.out.println(new Long(1).equals(1L));//true
JDK源码:
Integer public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; } Long public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; }
通过以上例子以及源码,我们可以知道:
而equals参数接受一个Object对象,所以1就被自动装箱成了Integer.valueOf(1),我们看一下Long的equals的实现。如果传进来的是Long型的,那么就比较值,如果传进来的是其他类型,直接返回false
3).
Interger等包装类在使用hashcode()时,是根据类中包含的值生成哈希码。即两个相同大小的integer值,那么它的hashCode也是相等的。
而Object类中的hashCode则和之前的不一样了,是根据对象的内存地址经过哈希算法之后获取到的哈希码,由于每个对象的内存地址不相同,所以hashCode是不同的。
所以当我们用哈希码去比较时,要记得哈希码不相同则对象肯定不相等,哈希码相同时,对象不一定相等。
相关文章推荐
- 判断java中两个对象是否相等
- 判断java中两个对象是否相等
- java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
- java中判断两个对象是否相等
- java中判断两个对象是否相等的方法和代码
- 判断java中两个对象是否相等
- Java 中判断两个对象是否相等
- java 判断两个对象是否相等 equals 和 hashcode() 的必要性
- 判断java中两个对象是否相等
- java积累---------java判断两个set里的对象值完全相同----两个set中的值是否相等
- java 判断两个对象是否相等 equals 和 hashcode() 的必要性
- java integer对象判断两个数字是否相等
- Java中如何判断两个对象是否相等(Java equals and ==)
- 判断java中两个对象是否相等
- 学习体会:在JAVA中如何判断两个对象是否相等
- 在java的集合中是怎么判断两个对象是否相等的?(重要!)
- 判断java中两个对象是否相等
- 直接比较两个对象是否相等返回false和List中判断是否包含某个对象的问题
- Java 判断两个字符串是否相等
- java中一切皆对象——判断字符串是否相等的方式