HashMap、ArrayList、Set、LinkedHashMap的使用及区别

今天是 2017年 农历新年之后的 上班第一周的 最后一个工作日,好久没写博客了,考虑到 过段时间想 换一家公司,是该好好复习一下,正好在回顾一下项目中 遇到的问题。接下来就来说一说 java开发中 常用到的 几种 集合列表。首先,先看一下这张关系图:

   

List、Map、Set都是接口类,它们的 实现类分别是 ArrayList、HashMap、HashSet,当我们新建一个集合列表的时候,也都是 new 的它们各自的具体实现类,而非接口类本身;那么下面我们就对 这三类常用的集合 做一个介绍。

首先是HashMap, 它基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。就是说,HashMap 保存数据时,采用了键值对的 映射关系 来处理数据,但是它处理数据的顺序是不确定的。另外,HashMap不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问。还有就是HashMap它没有实现 Iterable迭代器接口 ,而且保存数据的 时候键值不是从下标index=0开始的,无法直接使用增强型for循环;那么如何对Map列表进行遍历呢?常用方法如下:

Map<String, String> map = new HashMap<String, String>();
  map.put("1", "value1");
  map.put("2", "value2");
  map.put("3", "value3");

for (Map.Entry<String, String> entry : map.entrySet()) {
  System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
  }

其次是ArrayList,它是List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。假如需要添加大量元素,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量(这个根据实际数据量来操作)。同时,ArrayList它也不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问。ArrayList是可以直接使用增强型for循环来遍历这个列表元素的。

再者就是HashSet了,此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。HashSet不是同步的。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问。

LinkedHashMapMap 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭

代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入 键,则插入顺序不受影响。(如果在调用 m.put(k, v) 前 m.containsKey(k)

返回了 true,则调用时会将键 k 重新插入到映射 m 中。)HashMap和LinkedHashMap区别在于HashMap是无序的,LinkedHashMap是有序的。

猜你喜欢

转载自blog.csdn.net/liu_guizhou/article/details/54970673