今天看到一道面试题object对象包含哪些方法。
刚好没事看看呢看源码。
object对象包含方法大部分都为本地方法【使用C语言写的一些方法】,其中大部分是不可覆盖的;
本地方法中最重要的为
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;
其他不常用的有
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final native Class<? extends Object> getClass();
类方法主要有
public boolean equals(Object obj)
public String toString()
方法就不一一介绍了,但这些方法中最让我注意到的是
public native int hashCode();
public boolean equals(Object obj)
为什么这两个会引起我注意,因为String对象运行的结果与其他对象运行的结果不一致。
对于对象来说equals代表的对象相等【及内存地址的相等】。
从源码中我们也可以看出是对象的比较。
public boolean equals(Object obj) {
return (this == obj);
}
但是我们总会问这样的问题。
String str1= "abc";
String str2= new String( "abc" );
System.out.println( str1.equals( str2 ) );//值为到底为什么。
也行你会说这为两个不同的对象为不等,因为对象的object的equals对象的比较,所以为false。
也行别人也会说告诉你的true,原因就是实验出来的。
到底结果如何,这里我们要注意对与object的equals方法,在子类中可以被覆盖的。
我们再看String的方法发现String对象覆盖object对象的equals方法
public boolean equals(Object anObject) {
//先比较对象是否相等
if (this == anObject) {
return true;
}
//如果为String对象,比较String对象的字符串值
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
从源码中可以看出String对象的equals方法比较了对象,当对象不相等时再比较字符串的值;
可以看出上述的值为true。
hashcode()方法为获取对象的hash值【及对象的地址值】。
对于非重载的hashCode对象hashCode值一定不同,不一对象hashcode肯定不同
而对于String来说情况就不一样了,先看源码。
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
发现时有字符串是有字符串中的值计算出来的,所以对于两个不同String对象,String字符串值相同时hashCode方法所得到的值是相同。
String str1= new String("abc");
String str2= new String("abc");
System.out.println( str1.hashCode() );
System.out.println( str2.hashCode() );
值都为96354
这里我们也要注意到对象基本类型的包装类如integer,Double,Float等都已经重载了hashcode及equals方法。
这里我列举integer的equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
这里我们发现它是先判断是否为integer类型然后再做数值比较
那我们看一下示例
Long l = new Long( 9 );
Integer i= new Integer( 9 );
Integer i1= new Integer( 9 );
System.out.println(i.equals( 9 ));
System.out.println(i.equals( l ));
System.out.println(i.equals( i1 ));
System.out.println(i==9);
System.out.println(i==i1);
System.out.println(9==l);
结果会怎么样
从上面可以可以看出结果了
System.out.println(i.equals( 9 ));//true
System.out.println(i.equals( l ));//false l为long类型
System.out.println(i.equals( i1 ));//true
System.out.println(i==9);//true
System.out.println(i==i1);//false i与i1为不同的对象
System.out.println(9==l);//ture
但是注意三个的hashcode是相同的
System.out.println(i.hashCode());//9
System.out.println(i1.hashCode());//9
System.out.println(l.hashCode());//9
其实很多的东西只有看源码就能理解相应的原理及产生原因。所以有机会多看看java的底层源码。
分享到:
相关推荐
重写equals和hashcode方法,学习和进步
Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)
本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。
但是为什么JavaDoc明确的告诉我们, hashCode()和equals()要一起重写呢?原因是因为,在Java自带的容器HashMap和HashSet中, 都需同时要用到对象的hashCode()和equals()方法来进行判断,然后再插入删除元素,这点...
如果一个类的hashCode()方法没有遵循上述要求,那么,当这个类的两个实例对象用equals()方法比较的结果相等时,他们本来应该无法被同时存储进set集合
NULL 博文链接:https://alpha2009.iteye.com/blog/570322
1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子
这里是一个文档,里边讲解了hashCode与equals方法使用,大家要是不明白,可以去看看
在Java中,equals和hashCode方法是Object中提供的两个方法,这两个方法对以后的学习有很大的帮助,本文就深度来去讲解这两个方法。下面小编带大家来一起学习吧
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
本篇文章详细介绍了Java中的equals和hashCode方法详解,Object 类是所有类的父类,非常具有实用价值,需要的朋友可以参考下。
今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
本文中详细的阐述了Java中经常遇到的equals、hashcode以及“==”号三者之间的区别
NULL 博文链接:https://jackosn-liao.iteye.com/blog/528757
关于重写equals,hashcode以及compareTo方法!
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
EqualsVerifier可用于Java单元测试中,以验证是否满足类中equals和hashCode方法的约定。 Maven坐标为: < dependency> < groupId>nl.jqno.equalsverifier</ groupId> < artifactId>equalsverifier</ artifactId> ...
举例分析 equals 和 hashcode 方法,hashcode应该怎么样生成 8个基本类型与基本对象的比较:byte与Byte shot与Short int与Integer long与Long float与Float double与Double char与Character
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
jv-equals-hashcode 给定的类—矩形。 覆盖它的方法equals()和hashCode()所以equals()通过其字段(颜色,宽度和长度equals()比较Rectangle对象。 还要确保hashCode()遵循equals和hashcode之间的约定。