Java相关知识(二)

Object有哪些公用方法?

1.clone()方法:保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
2.getClass()方法:final方法,获得运行时类型。
3.toString()方法:该方法用的比较多,一般子类都有覆盖。
4.finalize()方法:该方法用于在垃圾收集器回收前调用,做一些释放清理资源工作,因为无法确定该方法什么时候调用,所以很少使用。
6.equals()方法:非常重要的一个方法,一般子类都会重写该方法。
7.hashCode():用于哈希查找,可以减少在查找中使用equals()的次数,重写equals()方法一般都要重写hashCode()方法。
8.wait()方法:使当前线程等待该对象的锁(等待锁定池),当前线程必须是该对象的拥有者,wait()方法一直等待,直到调用notify()/notifyAll()方法被唤醒重新回到对象锁定池当中等待接受任务。
9.notify()/notifyAll()方法:该方法唤醒在该对象上等待的某个线程。

epuals()和==的区别?

关于变量之间的比较,可以分为基本类型变量的比较和引用类型之间的比较。

对于基本类型来说,它们存储在jvm的栈当中,因此比较的是变量的内容,也就是比较的是变量的值。
image

对于引用数据类型来说,因为对象的内容存储在jvm的堆中,栈中只是存储对象的引用(地址),无论是==还是equals比较的都是栈中的内容,即对象的引用,也就是比较的是两个对象的地址。但是根据创建对象的方式不同可以部分两种情况:

1.使用表达式创建对象:


image

2.使用new方法创建对象:
image

到这里也许你会有疑问了?
1.为什么表达式创建和new创建,会让==比较产生不同的结果

因为jvm在程序运行的时候会创建一个缓冲池,当使用表达式创建的时候,程序会在缓冲池当中寻找与其相同值的对象,如果找到,就把这个对象的地址赋给当前创建的对象,因此c和d都指向了c的引用,所以这里在使用==的时候返回true。而当用new创建对象的时候,是堆中重新分配内存,因此栈中的引用是不相同的,所以a和b是内容的值相同引用的栈的地址不同,所以a==b返回false.
2.既然equals比较的是引用,那么a.equals(b)为什么返回true。这里是因为integer里。重写的equals方法!


image

创建一个类验证一下:
image

当自定义Value类中没有重写equals方法时,调用equals方法返回结果为false,说明此时比较的并不只是内容。
重写equals方法:
image

你可能感兴趣的:(Java相关知识(二))