一些总结

ArrayList和vector的区别
Vector它支持线程的同步,是线程安全的,由于线程的同步必然要影响性能,因此,访问它比访问ArrayList慢。当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍;而ArrayList只增加50%的大小,ArrayList有利于节约内存空间。

jdk1.7和jdk1.8HashMap的变化
HashMap是一种由数组和链表组合构成的数据结构。数组里面每个地方都存了Key-Value的实例,在Java7叫Entry在Java8中叫Node。
Java7使用头插法,Java8使用尾插法。
为什么改用尾插法?这里要提到Hashmap的扩容机制,扩容有两个因素:Capacity(HashMap当前长度)和 LoadFactor(负载因子,默认值0.75f),当存入的数据大于HashMap当前长度乘以负载因子的时候,首先会创建一个新的Entry空数组,长度是原数组的2倍,接着遍历原Entry数组,把所有的Entry重新Hash到新数组。 在Java7多线程环境下HashMap容易出现死循环,原因是使用头插法,扩容转移后会导致链表的顺序倒置,形成环形链表。于是,在Java8之后,都是采用尾插法了。使用尾插法,在扩容时会保持链表元素原本的顺序,就不会出现链表成环的问题。
【Hash的公式:index = HashCode(Key) & (Length - 1)】

为什么重写equals方法的时候需要重写hashCode方法?
Ojbect类中有两个方法equals和hashCode,这两个方法都是用来比较两个对象是否相等的。
未重写equals方法时,是继承了Object的equals方法,与==完全等价,那里的equals是比较两个对象的内存地址。重写hashCode方法,可以用来保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值