晋南讲堂之Java集合(Collection)与映射(Map)

Java集合和映射的框架图

Alt
(备注:本图片摘自菜鸟教程(https://www.runoob.com/java/java-collections.html),个人理解Java中接口和接口之间使用的是继承(extends)关系,在UML图中,泛化关系就是我们常说的继承关系,所以接口之间感觉应该是“实线+空心三角形”连接,而实现类和接口之间是实现(implements)关系,所以用“虚线+空心三角形”,所以上图依鄙人之愚见存在一定的问题。)

1. Collection<E>

1.1 List

       List接口常用的实现类有ArrayListLinkedListVector等。List允许集合中有null相同的元素
       (1)  ArrayList其底层实现为一个可变长度的数组,既然是数组那么就满足数组的一切特性,其查找效率快,增删速度慢,线程不安全。初始容量为10个对象空间,满时以1.5倍扩容。
       (2)  LinkedList其底层实现为一个双向链表,尽管查找时使用了二分查找,但与ArrayList比较而言,其查找效率慢增删速度快(增删只使用常量时间),线程不安全
       (3)  Vector其底层实现为一个数组,这点与ArrayList相同,关键不同的地方在于其是线程安全的。
(备注:线程安全即拥有同步的机制,反之。通俗的讲,当有多个程序段同时执行某个方法,或对某个变量进行操作,它们只能依次轮流去执行,最终得到正确的结果。操作银行账户是个很好的例子。)

1.2 Set

       Set接口常用的实现类有HashSetTreeSet等,它和List的不同之处在于List是一个有序的容器,而Set是无序的。
       (1)  针对HashSet,我们先分析其源代码,我们会发现它的底层是一个HashMap的实例。如下图,HashSet的构造方法默认先new一个HashMap出来。而HashMap的底层是哈希表。每次放入一个对象都会调用hashCode()方法和equals()方法,先按照一定的规则计算这个对象的哈希值,然后调用equals()方法判断集合中有无该哈希值,如果有,则添加,反之。如果放入的是“5、1、2、3、4”这样的对象,则输出是“1、2、3、4、5”感觉像是排序了,但如果想得到正确的自然排序建议使用TreeSetHashSet集合只能放一个null,是线程不安全的。
在这里插入图片描述
       (2)  针对TreeSet其底层实现为一个TreeMap的实例,源码如下。而TreeMap的底层是数据结构是红黑树。添加至TreeSet中的对象如果没有实现特定的比较器,则默认使用自然比较器TreeSet集合中不能添加null(博主亲测),是线程不安全的。
在这里插入图片描述
(备注:我们这里所说的有序容器和无序容器和大多数初学者所想象的不一样,这也是最容易迷惑的地方。如果元素放进去是什么顺序,拿出来还是什么顺序,则称这个容器是有序的。而众所周知Set会对放入其中的元素改变一下顺序,所以称之为无序的。)

2. Map<K,V>

       Map中所存放的对象为键(key)–值(value)对

2.1. HashMap

       HashMap底层数据结构为哈希表(至于哈希表是什么?博主在后续的博文中会详解),该映射的key只能放一个nullvalue也可以是null,是线程不安全的。

2.2. TreeMap

       TreeMap底层数据结构是红黑树,会对键(Key)进行自然排序,所以key不允许有nullvalue可以是null,是线程不安全的。

2.3. Hashtable

  HashtableHashMap相似,主要的不同点在于它是线程安全的,其次是keyvalue都不能添加null

3. 总结

容器底层数据结构有序容器自然排序线程安全允许重复元素或键(key)null(空值)
ArrayList可变长数组有序不支持不安全允许允许
LindkedList双向链表有序不支持不安全允许允许
Vector可变长数组有序不支持安全允许允许
HashSetHashMap实例支撑无序不支持不安全不允许只能放一个
TreeSetTreeMap实例支撑无序支持不安全不允许不允许
HashMap哈希表无序不支持不安全不允许key只能有一个
TreeMap红黑树无序支持不安全不允许key不允许,value允许
Hashtable哈希表无序不支持安全不允许key和value都不允许
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值