1.Set接口
1)HashSet
特点:去重,不保证元素顺序
HashSet 底层实现是使用HashMap完成,具有类似的特点
官方类都重写了equals和hashcode方法可以正常比较类的值是否相等,而自定义类没有重写equals和hashcode方法,所以比较是否相等,无法去重;、,若想要去重,必须重写equals和hashcode方法。
使用HashSet集合时的注意事项:
1、应保证元素已经重写hashCode()方法和equals()。
2、如未重写,将会存入重复数据
2)TreeSet
特点:去重,自然排序升序
2.Map接口
Collection集合添加完成元素使用add()、Map集合使用put(); Map集合主要是根据key进行数据维护,很少遍历;
·
1)HashMap
HashMap去重 根据Key是否相同,跟value内容无关;
HashSet与HashMap当数据重复时,保留后添加的数据;
·
HashMap的两种遍历方法
HashMap分别遍历Key,Value
1)key
2)value
·
HashMap扩容机制
HashMap默认长度16,永远存不满,每到75%,都会链表扩大当前长度的2倍
当向hashmap集合添加key/val时,会对key 进行hashcode()调用,生成一个哈希值,再使用哈希值(无符号整数) 进行求余操作 16(当前容量)
当再次添加key/val时,再次计算当前key存储位置,有两种可能性:
1、存储位置为空,直接将entry(key/value)
2、哈希冲突问题,多个key求取的hash值相同。
最好情况,不冲突(考验hash()方法,算法要尽可能的减少hash冲突)
JDK1.7之前的存储结构:
Jdk1.8的存储结构:
当哈希冲突之后,冲突的entry(key)数量>8个,会对该链表数据进行重构(红黑树)
00000010 2
<< >> 移位
2 << 2 00001000 8
<< : 左移运算符,num <<1,相当于num乘以2
>> : 右移运算符,num >>1,相当于num除以2
如果以快的速度完成除2操作(乘法)
10 >> 1 5
HashMap实现原理,如何保证HashMap的线程安全?
StringBuffer StringBuilder
HashTable早 HashMap(晚)
自行保证线程安全(线程同步)
·
链表与红黑树的性能比较:
链表:维护数据性能最佳,但查询性能较差。
红黑树:维护数据性能较差,但查询性能最好。