【Java】集合类详解

引言:java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。本文主要介绍java map的初始化、用法、map的四种常用的遍历方式、map的排序以及常用api。

java集合框架图

java集合框架图
不清楚集合之间的关系请先看下:【Java】集合类说明及区别

list,set,map对比

接口 子接口 是否有序 是否允许元素重复
Collection
List ArrayList
LinkedList
Vector
Set AbstractSet
HashSet
TreeSet 是 (用二叉排序树)
Map AbstractMap 使用key-value来映射和存储数据,key必须唯一,value可以重复
HashMap
TreeMap 是(用二叉排序树) 使用key-value来映射和存储数据,key必须唯一,value可以重复

Map介绍

类型介绍

 Java 自带了各种 Map 类。这些 Map 类可归为三种类型:

1. 通用Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现

HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、	WeakHashMap、ConcurrentHashMap

2. 专用Map,通常我们不必亲自创建此类Map,而是通过某些其他类对其进行访问

java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、	java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults

3. 一个用于帮助我们实现自己的Map类的抽象类

AbstractMap

类型区别

1.HashMap

最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。

2.TreeMap

能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。 

3.Hashtable

与 HashMap类似,不同的是:key和value的值均不允许为null;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。 

4.LinkedHashMap

保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空,非同步的。 

其他

keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。

用法示例

以HashMap为例:
构造数据:

Map<String,Object> res = new HashMap<String,Object>();
res.put("d","h");
res.put("c","g");
res.put("b","f");
res.put("a","e");

1.增强型for循环遍历

keySet()遍历
System.out.println("keySet()-For循环");
for(String s : res.keySet()){
     System.out.println(s+":"+res.get(s));
}

输出:

keySet()-For循环
a:e
b:f
c:g
d:h
entrySet()遍历
System.out.println("entrySet()-For循环");
for(Map.Entry<String,Object> entry : res.entrySet()){
     System.out.println(entry.getKey()+":"+entry.getValue());
}

输出:

entrySet()-For循环
a:e
b:f
c:g
d:h

2.Iterator迭代器遍历

keySet()遍历
System.out.println("keySet()-Iterator迭代器");
Iterator <String> it = res.keySet().iterator();
while (it.hasNext()){
    String key = it.next();
    System.out.println(key+":"+res.get(key));
}

输出:

keySet()-Iterator迭代器
a:e
b:f
c:g
d:h
entrySet()遍历
System.out.println("entrySet()-Iterator迭代器");
Iterator<Map.Entry<String,Object>> it1 = res.entrySet().iterator();
while (it1.hasNext()){
     Map.Entry<String,Object> entry = it1.next();
     System.out.println(entry.getKey()+":"+entry.getValue());
}

输出:

entrySet()-Iterator迭代器
a:e
b:f
c:g
d:h

遍历性能总结:
1.增强for循环使用方便,但性能较差,不适合处理超大量级的数据。

2.迭代器的遍历速度要比增强for循环快很多,是增强for循环的2倍左右。

3.使用entrySet遍历的速度要比keySet快很多,是keySet的1.5倍左右。

3.使用比较器对map进行排序

对key排序:

 List<Map.Entry<String,Object>> list = new ArrayList<Map.Entry<String, Object>>(res.entrySet());
//比较器实现比较排序
Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {
 @Override    //重写 Comparator<Map.Entry<String, Object>>() 方法
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
         return o1.getKey().compareTo(o1.getKey());
}
});
for (Map.Entry<String,Object> mapping : list){
      System.out.println(mapping.getKey()+":"+mapping.getValue());
}

输出

a:e
b:f
c:g
d:h

对value排序:

List<Map.Entry<String,Object>> list = new ArrayList<Map.Entry<String, Object>>(res.entrySet()); //比较器实现比较排序
//Collections是提供一系列静态方法的静态工具类,而collection是集合类的顶级接口
Collections.sort(list, new Comparator<Map.Entry<String, Object>>() {    
//
@Override
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
      return o1.getValue().toString().compareTo(o1.getValue().toString());
}
});
for (Map.Entry<String,Object> mapping : list){
     System.out.println(mapping.getKey()+":"+mapping.getValue());
}

输出

d:h
a:e
b:f
c:g
d:h

4.其他api

函数 功能
clear() 从 Map 中删除所有映射
remove(Object key) 从 Map 中删除键和关联的值
put(Object key, Object value) 将指定值与指定键相关联
putAll(Map t) 将指定 Map 中的所有映射复制到此 map
entrySet() 返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素
keySet() 返回 Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值)
values() 返回 map 中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值)
get(Object key) 返回与指定键关联的值
containsKey(Object key) 如果 Map 包含指定键的映射,则返回 true
containsValue(Object value) 如果此 Map 将一个或多个键映射到指定值,则返回 true
isEmpty() 如果 Map 不包含键-值映射,则返回 true
size() 返回 Map 中的键-值映射的数目
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章