Java基础复习之集合篇(2)

集合是干什么的?

集合又叫容器,就是Java里面用来承载数据的数据结构。所有Java开发者设计了很多容器适应不同的数据要求。所以他们各自都有自己优缺点。

集合有哪些大的种类

集合类在java.util包中,有三种:
1.Set(集)
2.List(列表,包含Queue)
3.Map(映射)
这三个种类中,只有Map是单独的,其他两个都实现了Collection接口。

我们先总体总结以下常见集合的特点。

在这里插入图片描述

在这里插入图片描述

HashMap(高频)

  • HashMap是通过键的hashCode来进行存储的,大多数情况下,可以快速的定位到,所有访问速度也很快,但进行遍历的话,顺序是不确定的。
  • HashMap最多只允许一条记录的key为null,允许多条记录的value为null.
  • 在多线程情况下,HashMap是允许多个线程对其进行操作的,所有线程不安全。我们可以使用Collection的synchronizedMap方法实现线程安全,或者使用ConcurrentHashMap这个线程安全的map类。
  • HashMap的中每一条键值对数据是代表一个嵌套类Entry实例,该类结构如下。在jdk1.7之前HashMap是使用数组加单向链表的方式实现的,定义一个16位数组,通过哈希算法对哈希值进行计算返回一个0-15的数组,然后存储到数组下。
static class Entry<K,V>{
	final K key;//键名
	V value;//值
	Entry<K,V> next;//指向下一个嵌套类实例
	int hash;//哈希值
}
  • jdk1.8后加入了红黑树,当单向链表的个数超过8时,会自动转换成红黑树,这样就可以将之前的查找时间复杂度从O(n)变成O(logn)了。

ConcurrentHashMap

  • ConcurrentHashMap是比HashMap实现线程安全的,ConcurrentHashMap是由多个Segment组成的。
  • Segment是一段,一部分的意思,所有有的时候也叫分段锁。
  • ConcurrentHashMap本质就是一个Segment数组,但Segment通过继承ReentrantLock来加锁,所以每次加锁操作的是一个Segment对象,但此时是线程安全的,所以实现了全局的线程安全。
  • ConcurrentHashMap初始化容量后不可扩容,而且默认是一个16长度的Segment数组,也就是说默认是有16个Segment对象。这个数量可以指定。
  • 每一个Segment对象下相对于是一个HashMap结构

LinkedhashMap

  • 它是HashMap的一个子类,保存了记录的插入顺序。

HashMap和Hasntable的区别

1.两者父类不同,HashMap继承了AbstractMap类,Hashtable继承了Dictionary类。
2.对外提供的接口不一样:Hashtabel多提供了两个方法,分别是:elments() 和contains()。
elments() 方法返回此Hashtable中的value的枚举。contains()方法判断该Hashtable是否包含传入的value
3.Hashtable的key和value都不能位null
4.Hashtable是线程安全的,HashMap是线程不安全的
5.初始容量大小和扩容大小不一样。
计算hash值的方法不一样。

归纳

List集合是想存储所有数据,无论是否相同并且是有序的存储,类似原封不动的将数据保存起来
Set是把数据不重复的装起来,不管先后顺序,但也有个别实现类实现了顺序。
Map是通过键值对的方式把数据存储起来,但也是不允许键重复的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值