1.Object
类中有哪几个方法?
2.hashCode
方法有什么用?
3.hashCode()
和equals()
的区别?
如果你不是很清楚请往下看
首先有一下几个方法
屏幕快照 2019-07-22 上午9.10.17.png-
hashCode()
和equals()
函数用来判断对象是否相同 wait()
-
toString()
和gtClass()
clone()
-
finalize()
用于垃圾回收 -
registerNatives()
本地注册
1 hashCode和equals函数用来判断对象是否相同
首先参考一下别人的博客:http://blog.csdn.net/hla199106/article/details/46907725
1.1 ==
- 基本数据类型:比较的是它们的值。
- 引用类型(类、接口、数组):比较的是它们内存中存在的地址。
***
对象是放在堆栈中的,栈中存放的是对象的引用(地址),由此可见==是对栈中的值进行比较的。如果要对栈中的对象内容进行比较的话,就要重写equals()
方法了
1.2 equals()
先看一下默认的方法,判断是不是同一个对象
public boolean equals(Object obj) {
return (this == obj);
}
以下是String的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = length();
if (n == anotherString.length()) {
int i = 0;
while (n-- != 0) {
if (charAt(i) != anotherString.charAt(i))
return false;
i++;
}
return true;
}
}
return false;
}
判断流程为:
即String中equals方法判断相等的步骤是:
1、若A==B 即是同一个String对象 返回true
2、若对比对象是String类型则继续,否则返回false
3、判断A、B长度是否一样,不一样的话返回false
4、逐个字符比较,若有不相等字符,返回false
重新实现equals()
方法需要满足以下5个特性:自反,对称,传递,一致,非空性
。
1.3 、hashcode()
hashCode() 方法返回的就是一个数值,从方法名称上可以看出,其目的就是生成一个hash码,hash码的主要用途就是在对对象进行散列的时候作为key输入,据此可以推断出我们需要每个对象的hash码尽可能不相同,这样才可能保证散列的存取性能。哈希算法也称为散列算法,是将数据依特定的算法直接指定到一个地址上。
初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
1.4 hashcode() 和 equals() 的区别
1、如果两个对象equals(),Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
2 wait(),wait(long),wait(long,int),notify(),notifyAll()
这几个函数体现的是Java的多线程机制
在使用的时候要求在synchronize语句中使用
wait()用于让当前线程失去操作权限,当前线程进入等待序列
notify()用于随机通知一个持有对象的锁的线程获取操作权限
notifyAll()用于通知所有持有对象的锁的线程获取操作权限
wait(long) 和wait(long,int)用于设定下一次获取锁的距离当前释放锁的时间间隔
3 toString()和getClass()
toString()
返回一个String对象,用来标识自己
如Object默认
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
getClass()
返回一个Class对象。
4 clone()
使用clone方法的几个条件:
1)在派生类中实现Cloneable借口。
2)为了获取对象的一份拷贝,我们可以利用Object类的clone方法。
3)在派生类中覆盖积累的clone方法,声明为public。
4)在派生类的clone方法中,调用super.clone()。
具体:http://www.cnblogs.com/gw811/archive/2012/10/07/2712252.html
5 finalize()用于在垃圾回收
6 registerNatives() 本地注册
native修饰的方法表示本地方法(跟系统有关,也可以理解为这个方法不是在java中实现的),据说这个方法在一个名为java.dll的动态库文件中。Object类中第40行(我的是jdk1.8)开始的 static{ registerNatives(); } 表示的是在类被加载时,调用 registerNatives()方法进行一些跟系统有关的方法调用,而这个方法的实现就在java.dll中(里面会根据不同系统来执行不同的底层操作)。
网友评论