01-知识点
一.hashCode、equals、== 的区别
1.java官方推荐重写equals方法时也要重写hashCode方法。
如果2个对象的equals比较时为true,则hashCode也要相同,
如果2个对象的hashCode相同时,equals方法可以不同,
因为hashCode底层是hash算法,hash算法的原则就是,如果2个输入相同,则输出一定相同;
反之如果输出相同,输入则未必相同,比如md5算法。如果输入不同,输出相同就叫做hash冲突。
2.Object类中的hashCode、equals、toString 方法
hashCode:为native方法,具体实现和JVM厂商有关
equals: 用==比较的是内存地址值
toString: 打印的是类名和hashCode的16进制值
3.个人理解:
(1):如果一个对象继承自Object类并且没有重写hashCode、equals、toString方法,
hashCode的返回值就是该对象的内存地址值,注意Object中的hashCode方法为native方法。具体实现和JVM厂商有关。
(2):hashCode是对象的hashCode方法,equals方法是对象的equals方法,== 比较的是对象的内存地址值。
4.hashMap的存取原理:
(1):hashMap要求key值不能相同,一般意义上比较相同应该是要比较equals方法,但是如果hashMap在
put元素的时候每个已经放入的key都和新key比较equals方法的话,当hashMap中键值对比较多情况下,
效率非常低。既然是hashMap,底层实现其实是散列表,用的算法就是hash。当往hashMap中put值时:
首先计算key的hashCode方法的返回值,在散列表中查找有没有,没有,则为新元素,因为hashCode不同,
则equals一定不同,直接添加新元素;如果相同,再比较2个对应key的元素的equals方法,
如果相同,则为相同元素,替换value值,如果equals不同,则key不同,当新元素添加。
由上可知,hashMap中的所有key的equals方法一定不同,hashCode方法可能相同
5.java中equals方法的几个特性
自反性:对任意引用值X,x.equals(x)的返回值一定为true.
对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 二.java 中基本类型的比较为值比较
三.java 中字符串的比较
四.java中int、Integer的比较
五.java 字符串拼接效率StringBuilder>StringBuffer>String
六.HashMap、HashTable、ConcurrentHashMap的区别与联系
七.return 和 finally的执行先后问题
Last updated