乐趣区

关于java:list-set-map区别

list set map 区别

  • List 特点:元素有放入程序,元素可反复的。
  • Set 特点:元素无放入程序,元素不可反复,反复元素会笼罩掉。
  • Map 提供了一个更通用的元素存储办法。Map 汇合类用于存储元素对(称作 ” 键 ” 和 ” 值 ”),其中每个键映射到一个值。

一、List 接口
List 是一个继承于 Collection 的接口,即 List 是汇合中的一种。List 是有序的队列,List 中的每一个元素都有一个索引;第一个元素的索引值是 0,往后的元素的索引值顺次 +1。和 Set 不同,List 中容许有反复的元素。实现 List 接口的汇合次要有:ArrayList、LinkedList、Vector、Stack。

ArrayList
ArrayList 是一个动静数组,也是咱们最罕用的汇合。它容许任何合乎规定的元素插入甚至包含 null。每一个 ArrayList 都有一个初始容量:
private static final int DEFAULT_CAPACITY = 10;
随着容器中的元素一直减少,容器的大小也会随着减少。在每次向容器中减少元素的同时都会进行容量查看,当快溢出时,就会进行扩容操作。所以如果咱们明确所插入元素的多少,最好指定一个初始容量值,防止过多的进行扩容操作而浪费时间、效率。
size、isEmpty、get、set、iterator 和 listIterator 操作都以固定工夫运行。add 操作以摊派的固定工夫运行,也就是说,增加 n 个元素须要 O(n) 工夫(因为要思考到扩容,所以这不只是增加元素会带来摊派固定工夫开销那样简略)。
ArrayList 擅长于随机拜访。同时 ArrayList 是非同步的。

LinkedList
同样实现 List 接口的 LinkedList 与 ArrayList 不同,ArrayList 是一个动静数组,而 LinkedList 是一个双向链表。所以它除了有 ArrayList 的基本操作办法外还额定提供了 get,remove,insert 办法在 LinkedList 的首部或尾部。
因为实现的形式不同,LinkedList 不能随机拜访,它所有的操作都是要依照双重链表的须要执行。在列表中索引的操作将从结尾或结尾遍历列表(从凑近指定索引的一端,节约一半工夫)。这样做的益处就是能够通过较低的代价在 List 中进行插入和删除操作。
与 ArrayList 一样,LinkedList 也是非同步的。如果多个线程同时拜访一个 List,则必须本人实现拜访同步。一种解决办法是在创立 List 时结构一个同步的 List:
List list = Collections.synchronizedList(new LinkedList(…));

Vector
与 ArrayList 类似,然而 Vector 是同步的。所以说 Vector 是线程平安的动静数组。它的操作与 ArrayList 简直一样。

Stack
Stack 继承自 Vector,实现一个后进先出的堆栈。Stack 提供 5 个额定的办法使得 Vector 得以被当作堆栈应用。根本的 push 和 pop 办法,还有 peek 办法失去栈顶的元素,empty 办法测试堆栈是否为空,search 办法检测一个元素在堆栈中的地位。Stack 刚创立后是空栈。

二、Set 接口
Set 是一个继承于 Collection 的接口,Set 是一种不包含反复元素的 Collection。它维持它本人的外部排序,所以随机拜访没有任何意义。与 List 一样,它同样运行 null 的存在然而仅有一个。因为 Set 接口的特殊性,所有传入 Set 汇合中的元素都必须不同,对于 API 方面。Set 的 API 和 Collection 齐全一样。实现了 Set 接口的汇合有:HashSet、TreeSet、LinkedHashSet、EnumSet。

HashSet
HashSet 堪称查问速度最快的汇合,因为其外部是以 HashCode 来实现的。汇合元素能够是 null, 但只能放入一个 null。它外部元素的程序是由哈希码来决定的,所以它不保障 set 的迭代程序;特地是它不保障该程序恒久不变。

TreeSet
TreeSet 是二叉树实现的,基于 TreeMap,生成一个总是处于排序状态的 set,外部以 TreeMap 来实现,不容许放入 null 值。它是应用元素的天然程序对元素进行排序,或者依据创立 Set 时提供的 Comparator 进行排序,具体取决于应用的构造方法。

LinkedHashSet
LinkedHashSet 汇合同样是依据元素的 hashCode 值来决定元素的存储地位,然而它同时应用链表保护元素的秩序。这样使得元素看起 来像是以插入程序保留的,也就是说,当遍历该汇合时候,LinkedHashSet 将会以元素的增加程序拜访汇合的元素。LinkedHashSet 在迭代拜访 Set 中的全副元素时,性能比 HashSet 好,然而插入时性能略微逊色于 HashSet。

三、Map 接口

Map 与 List、Set 接口不同,它是由一系列键值对组成的汇合,提供了 key 到 Value 的映射。在 Map 中它保障了 key 与 value 之间的一一对应关系。也就是说一个 key 对应一个 value,所以它不能存在雷同的 key 值,当然 value 值能够雷同。实现 map 的汇合有:HashMap、HashTable、TreeMap、WeakHashMap。

HashMap
以哈希表数据结构实现,查找对象时通过哈希函数计算其地位,它是为疾速查问而设计的,其外部定义了一个 hash 表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中寄存的索引,如果有抵触,则应用散列链表的模式将所有雷同哈希地址的元素串起来,可能通过查看 HashMap.Entry 的源码它是一个单链表构造。

HashTable
也是以哈希表数据结构实现的,解决抵触时与 HashMap 也一样也是采纳了散列链表的模式。HashTable 继承 Dictionary 类,实现 Map 接口。其中 Dictionary 类是任何可将键映射到相应值的类(如 Hashtable)的形象父类。每个键和每个值都是一个对象。在任何一个 Dictionary 对象中,每个键至少与一个值相关联。Map 是”key-value 键值对”接口。HashTable 采纳”拉链法”实现哈希表不过性能比 HashMap 要低。

TreeMap
有序散列表,实现 SortedMap 接口,底层通过红黑树实现。

WeakHashMap
谈 WeakHashMap 前先看一下 Java 中的援用(强度顺次递加)

  1. 强援用:广泛对象申明的援用,存在便不会 GC
  2. 软援用:有用但并非必须,产生内存溢出前,二次回收
  3. 弱援用:只能生存到下次 GC 之前,无论是否内存足够
  4. 虚援用:惟一目标是在这个对象被 GC 时能收到一个零碎告诉

以弱键实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再失常应用时,将主动移除其条目。更准确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的抛弃,这就使该键成为可终止的,被终止,而后被回收。抛弃某个键时,其条目从映射中无效地移除,因而,该类的行为与其余的 Map 实现有所不同。null 值和 null 键都被反对。该类具备与 HashMap 类类似的性能特色, 并具备雷同的效力参数初始容量和加载因子。像大多数汇合类一样,该类是不同步的。

四、总结
1、List、Set 都是继承自 Collection 接口,Map 则不是

2、List 特点:元素有放入程序,元素可反复,Set 特点:元素无放入程序,元素不可反复,反复元素会笼罩掉,(留神:元素尽管无放入程序,然而元素在 set 中的地位是有该元素的 HashCode 决定的,其地位其实是固定的,退出 Set 的 Object 必须定义 equals() 办法,另外 list 反对 for 循环,也就是通过下标来遍历,也能够用迭代器,然而 set 只能用迭代,因为他无序,无奈用下标来获得想要的值。)

3、Set 和 List 比照:
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素地位扭转。
List:和数组相似,List 能够动静增长,查找元素效率高,插入删除元素效率低,因为会引起其余元素地位扭转。

4、Map 适宜贮存键值对的数据

5、线程平安汇合类与非线程平安汇合类 :
· LinkedList、ArrayList、HashSet 是非线程平安的,Vector 是线程平安的;
· HashMap 是非线程平安的,HashTable 是线程平安的;

附: StringBuilder 是非线程平安的,StringBuffer 是线程平安的。

退出移动版