== 是比较堆区地址
equals:
- 每一个简单类都有继承了Object类的equals方法,实现:只是简单的return (this == obj);
- java工具类Objects有一个equals(Object a, Object b)方法,实现:return (a == b) || (a != null && a.equals(b)); 追加了a,b为空的情况
重写equals()的规范
需要注意的是,在Java规范中,它对equals()方法的使用必须要遵循如下几个规则:
1、自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
2、对称性:对于任何非空引用值 x 和 y,当且仅当y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
3、传递性:对于任何非空引用值 x、y 和z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回false,前提是对象上 equals 比较中所用的信息没有被修改
5、对于任何非空引用值 x,x.equals(null) 都应返回false。
compareTo方法,一般都是实现comparable接口,重写它的方法。重写中判断的方式一般是先判断两个地址是否相同即==,然后再判断hashcode快速定位两个对象在散列存储结构中位置相同,最后再仔细判断其内容是否相同(如果是int直接==,如果是string,会先转成字符数组逐个比较)
map的put和get原理。map可以看成就是一个数组,每个数组元素都是一个链表。首先将k,v封装成node对象中作为map的基本元素。
- 当put一个node对象时,会调用k的hashCode()方法算出hash值,然后通过哈希表函数/哈希算法,将hash值转成数组下标,下标位置上的链表如果没有任何值就放到链表中;如果链表中有值,就会将k和链表上每个节点的k进行equals,如果equals都是false,就加进去,如果equals有true就覆盖。
- 当get一个node对象时同理,先用k算出下标,再和链表上每个k进行equals,true就返回,都是false就返回null