String
hashCode()
每从前向后 每个字符的ascii码×31+后面一个字符的ascii码,一次迭代
1 | |
equals()
比较字符串的内容是否相同
重写equals方法,就要重写hashcode方法,因为俩个对象equals为True,那么x.hashcode()==y.hashcode()也必须为True;如果俩个对象的hashcode不相同,那么equals也一定为False。在Object类中,equals和==是完全一致的,也就是默认情况下,equals就是比较俩个对象的内存地址,但是,一些类可以重写equals方法,比如说String类,equals方法是用于判断俩个字符串的值是否相同,但是默认的hashcode使用的是对象的地址进行计算所得的值,如果不修改hashcode,那么俩个内容相同的字符串,由于在内存中的地址不同,则hashcode就不相同。
针对Map类,在使用put方法或者隔天方法对Map容器进行操作时,都需要根据键对象的hashcode计算存储位置,如果重写了equals方法,导致俩个对象的equals结果为True,但是没有重写hashcode,导致hashcode比较结果为False,比如,在HashMap中,get方法如下
1 | |
其中·hash(key)·就是使用key的hashcode。
1 | |
StringBuilder
StringBuffer
toStringCache
返回最后一次toString的缓存值,和之前的toString中共享char[]内存,节省内存空间
newCapacity(int var1)
将当前容量翻倍并加2,如果超过2^31-1,则OOM,如果大于2^31-1-8,则设置为2^31-1-8,数组需要8字节存储数组长度
capacity()
初始化时存放int则容量就是int的长度,存放String或者CharSequence的时候,会加16作为容量
HashTable
初始容量和加载因子
默认的初始容量是11,加载因子是0.75,表示当元素个数超过容量的0.75的时候,进行扩容,2×原容量+1。加载因子过大,则会导致单个链表的查询时间过长,加载因子过小,会导致占用过多的空间。
数据结构
继承自Dictionary,实现了Map接口。
成员变量如下:
1 | |
散列冲突:当不同的key产生相同的索引时,就叫哈希碰撞。
将hashtable视为一串槽,当没有哈希碰撞的时候,直接将键值对插入槽中,当发生哈希碰撞但是key不同,在当前槽中建立链接到这个键值对的链接,如下,假设1和4的哈希值一直,则将(4,14)插入后hashtable的结构如下
1 | |
hash
1 | |
put
1 | |
HashMap
扰动函数hash
1 | |