皮皮安学Java第十二天
写在前面
今天没实战,花了一下午把Java常用类看完了。闲聊结束。
今日所学
equals()方法
与==的区别
-
==判断是否引用同一个对象,比较的栈中的值。
-
equals如果没有被重写,则默认和==无区别。
-
如果重写了equals,则按重写后的比较规则进行判断。
说明:
自定义类可以重写equals方法来实现对特定字段等值的判断。
可以通过开发工具快速重写equals方法。hashCode()方法
返回对象的hashCode值,及哈希值。
1.hashCode是为了支持数据结构的哈希表。
2.如果没有重写该方法,默认返回对象的地址。
3.重写equals()方法时,务必重写hashCode方法。
特性:
- 多次调用同一个hashCode值都是一样。
- 如果两个对象的equals比较为true,则两个对象的hashCode值也应该相同。
- hashCode值应该相同。
- 如果两个对象equals比较为false,不强制要求两个hashCode值不相同,但是不同对象的hashCode值可以提升哈希表的性能。
toString()方法
将对象转换为字符串表示形式。
当直接输出对象时,会自动调用对象的toString()方法,及本质上输出的是toString()方法的返回值。
如果没有重写该方法,默认返回值。
类名@十六进制的hashCode值
通过重写该方法,输出对象时可以返回更加易读的信息,便于查看结果,一般用于测试。
clone()方法
用于克隆的要求
对象被克隆的要求
必须重写克隆方法,且要调用super.clone()方法。
类必须实现Cloneable接口,表示该类对象可被克隆。
浅克隆和深克隆
浅克隆(浅复制)
从Object继承的clone()方法默认浅克隆。
从Object()继承的clone()方法默认是浅克隆,只克隆对象本身,不克隆它所引用的对象,即只克隆第一层。
所有的对其他克隆的引用仍然指向原来对象。
深克隆(深复制)
- 把要克隆的对象所引用的其他对象都克隆一遍。
- 所有的对其他对象的引用都将指向被克隆的新对象。
- 需要自己实现对所有引用其他对象进行再次克隆。
finalize()
该方法不需要手动调用,由垃圾回收器自动调用。
垃圾回收机制:
JVM中存在有一个守护线程,叫做gc:garbage collector 垃圾回收器
gc的作用:
每个对象上,都会存在一个int类型的变量,叫做引用计数器。
每当有一个引用指向该对象,引用计数+1.
每当有一个引用不在指向该对象,引用计数-1。
当引用值为0时,JVM中的gc认为该对象为垃圾。
gc在会在合适的时机对改对象进行回收。
当对象被gc回收时,gc会自动调用finalize()方法。
可以通过执行System.gc()建议JVM进行垃圾回收。