声明
1)该文章整理自网上的大牛和专家无私奉献的资料,具体引用的资料请看参考文献。
2)本文仅供学术交流,非商用。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。
4)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。大家都共享一点点,一起为祖国科研的推进添砖加瓦。
类的结构图
1.Object的构造方法
只有一个构造方法,也就是默认的构造方法,public修饰的无参构造,可以创建Object类的对象
2.registerNatives()方法
private static native void registerNatives();
static {
registerNatives();
}
含义:本地注册的意思
作用:加载本地方法
分析:
该方法由static修饰,为静态方法,说明在类加载的时候便会加载
该方法由private修饰,说明该方法只能在类的内部调用,或通过
该方法由native修饰,native表示该方法的实现java本身并没有完成,而是有c/c++来完成,形成.dll文件。
静态代码块,在类加载初始化的时候执行registernatives方法
3.getClass()方法
public final native Class<?> getClass();
作用:获取一个类的定义信息(也就是一个类的class对象),一般用于反射中,通过class对象去访问其全部信息
分析
native修饰,本地方法
public修饰,由于object为所有类的父类,所以任何对象都可调用getClass方法
final修饰,不可被重写
4.hashCode()方法
public native int hashCode();
分析
public修饰,公共,适合任何对象
native修饰且无{},没有实现,即调用本地c/c++实现
返回值int,由数据判断对象是否相同
没有使用final修饰,说明是可以被重写的
HashCode
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,也就是哈希码
哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。
在Java中,哈希码代表对象的特征。
HashCode拓展
1.Object类的hashCode返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2.String类的hashCode根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同
3.Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,
//例如:
Integer i1=new Integer(100);
//i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
由此可以看出Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。
注意
一般新建对象的时候最好重写hashcode与equals方法
两个内容相同,内存地址不同的对象,调用object类中的hashCode方法,返回的hashCode不相同
5.equals(odject obj)方法
public boolean equals(Object obj) {
return (this == obj);
}
作用
判断两个对象是否相同
分析
public修饰,因为object是所有类的父类,说明,任何对象都会有equals()方法
返回值为boolean
形参是Object类型,说明可以为使用任何对象
代码块
retur (this==obj)
这里this代码调用该方法的对象,obj表示需要判断的对象
这里它们使用的==来进行比较,比较的是两个对象的地址值
注意
一般来说,在使用的时候,都会进行重写
一般来说,在重写equals的时候,都会重写hashCode方法
在eclipse或idea中提供有重写的快捷方式
如何重写equals方法
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
6.clone()方法
protected native Object clone() throws CloneNotSupportedException;
protected:表示可以在同类中,或者子类的方法中使用,因为object是所有类的父类,
所以对象如果要使用clone()方法的话,只能重写后才可以使用,例如下,eclipse中有
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
native:表示java调用非java代码的接口,是一个其他语言实现的方法。
Object:返回值:表示可以返回任何值,所以需要强转
作用:快速克隆出另一个对象
使用
重写clone()方法
否则无法调用,因为object中clone方法中protected修饰的
实现CloneAble()接口
否则会抛出CloneNotSupporteddException;异常
使用对象调用clone()方法
7.toString()方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//public:任何对象可以调用
//返回值String:返回一个由 getClass().getName() + "@" + Integer.toHexString(hashCode());
// 组成的一个字符串,实质为 包名(非全限定).类名@十六进制的hashCode值
//参数:无
作用:快速克隆出另一个对象
使用
重写clone()方法
否则无法调用,因为object中clone方法中protected修饰的
实现CloneAble()接口
否则会抛出CloneNotSupporteddException;异常
使用对象调用clone()方法
使用
使用对象直接输出,都会调用toString方法,若对象本身的类没有,则会调用Object类中的toString方法
一般来说,一个对象都应该重写该方法
8.notify()方法
public final native void notify();
//public:任何对象可调用
//final:不可被重写
//native:调用的是本地实现
//void:无返回值
作用
随机选择一个使用了wait()方法的线程,赋予其对象锁,并解除其阻塞状态
9.notifyAll()方法
public final native void notifyAll();
//public:任何对象可调用
//final:不可被重写
//native:调用的是本地实现
//void:无返回值
作用
唤醒在该对象上调用wait()方法等待的所有线程
10.wait(long timeout)方法
public final native void wait(long timeout) throws InterruptedException;
//public:任何对象可调用
//final:不可被重写
//native:调用的是本地实现
//void:无返回值
//参数 long timeout :输入一个long类型的超时时间,毫秒,等待的时间,可选,不填则默认为0。
作用
使线程主动释放对象锁,并进入等待状态,直到notigy()或者notifyAll()唤醒或超过指定时间指定的等待时间
在调用wait()方法前,线程获得该对象的对象锁
wait方法执行前,该对象立即释放持有的对象锁
11.wait(long timeout,int nanos)
public final void wait(long timeout, int nanos) throws InterruptedException {
if(timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException("nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
//timeout -- 最大等待时间(毫秒)。
//nanos -- 附加时间在毫微秒范围0-999999。
作用
进入等待,经过timeout 超时后,若未被唤醒,则自动唤醒。相对wait(long timeout) 更加精确时间。
12.wait()方法
源码
public final void wait() throws InterruptedException {
wait(0);
}
作用
直接使该线程进行等待状态
13.finalized()方法
protected void finalize() throws Throwable { }
作用
在gc回收对象之前执行一些清除操作,比如说一些IO流对象和外部的连接尚未关闭,这个时候如果gc对这个对象 进行回收,那么finalize可以保证这个对象被回收之前其与外部的一些连接正常关闭。
使用时机
当jvm内存中的对象已经没有引用指向它的时候,此时GC垃圾回收器会自动调用该对象的finalized()方法
在GC垃圾回收器,调用某个对象的finalized()方法后,jvm会再一次执行检查该对象是否还存在其他引用
使用方法
类重写finalized()方法
对象调用此方法
看源码解答问题
equals() 的作用是什么?
1:equals()方法用来比较的是两个对象的内容是否相等
equals() 与 == 的区别是什么?
1:equals()方法用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断;
2:"==" 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。
hashCode() 的作用是什么?
1:hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
2:如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
3:如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
4:两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。
wait()方法与sleep()方法的区别
https://www.cnblogs.com/loren-Yang/p/7538482.html
为什么重写了equals就必须重写hashCode
https://zhidao.baidu.com/question/646965569075124765.html
关于Hashcode
https://baijiahao.baidu.com/s?id=1561228085482413&wfr=spider&for=pc
HashMap的实现原理
https://www.cnblogs.com/chengxiao/p/6059914.html