List Set Map的数据结构

List、Set和Map都是接口(Interface),其中Collection是所有集合类的接口,Set和List也都实现该接口

LIst

 List比较常用的有ArrayList和LinkedList,还有一个比较类似的Vector

ArrayList

ArrayList是线程不安全的,在不考虑线程安全的情况下查询速度比较快的。ArrayList插入数据可以重复,性能上要比Vector(是线程安全的)好一些,但是删除就比较慢,因为底层的数据结构是数组

Vector

基于数组(Array)的List,Vector其实是对数组的动态扩充,底层的数据结构使用的是数组结构(数组长度是可变的百分之百延长)。Vector是线程同步(sychronized)的,线程安全的。但是使用效率上就不如ArrayList了

LinkedList

LinkedList不同于前面两个,是基于链表实现的双向链表数据结构。 

包括(

1、节点本身的数据(data)

2、前一个节点的信息(previousNode)

3、下一个节点的信息(nextNode)

因为是基于链表的数据结构,所以插入删除比较快,查询慢

Set

Set是一种不包含重复的元素的无序Collection。 一般使用的有HashSet和TreeSet。List的数据结构是链表和数组,但是set的数据结构是哈希表

HashSet

HashSet是根据hashCode来决定存储位置的,是通过HashMap实现的,所以对象必须实现hashCode()方法,存储的数据无序不能重复,可以存储null

LinkedHashSet

是HashSet的一个子类,格按照放入顺序排列,如果你想让取出元素的顺序和插入元素的顺序完全相同,那么就使用LinkedHashSet代替HashSet。

TreeSet

它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。TreeSet是根据二叉树实现的,也就是TreeMap,,放入数据不能重复且不能为null,可以重写comparator()方法来确定元素大小,从而进行升序排序

 

Map

Map 是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射

一个 Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的

Map有两种比较常用的实现:HashMap和TreeMap 还有一个hashtable

HashMap

HashMap的数据结构,在JDK8之前,是数组+链表。在JDK8后中,当长度大于8的时候,会自动变成数组+红黑树。, 原因是:

基于一个数组以及多个链表的实现,hash值冲突的时候,就将对应节点以链表的形式存储。

这样子的HashMap性能上就抱有一定疑问,如果说成百上千个节点在hash时发生碰撞,存储一个链表中,那么如果要查找其中一个节点,那就不可避免的花费O(N)的查找时间,这将是多么大的性能损失。这个问题终于在JDK8中得到了解决。再最坏的情况下,链表查找的时间复杂度为O(n),而红黑树一直是O(logn),这样会提高HashMap的效率

HashMap和Hashtable的区别

1.两者最主要的区别在于Hashtable是线程安全,而HashMap则非线程安全
Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,我们平时使用时若无特殊需求建议使用HashMap

2.HashMap可以使用null作为key,而Hashtable则不允许null作为key

3.HashMap是对Map接口的实现,HashTable实现了Map接口和Dictionary抽象类

4.HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75
5.HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1

HashMap、LinkedMap、TreeMap的区别

(1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。
(2)HashtableHashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。
(3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。
(4)TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过序的。TreeMap的键和值都不能为空。

如何决定选用HashMap还是TreeMap

TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,考虑此。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值