java集合类

转载:http://www.cnblogs.com/hzmark/archive/2012/12/17/CollectionBase.html  

数组是一种很常见的数据结构,开始接触编程的时候多数程序都和数组相关。刚开始接触Java时也是一直使用数组写一些程序,后来越来越觉得数组这东西没法满足需求了,这时一位“前辈”对我说了一句:不会用集合类就等于没学过Java。然后才知道有集合类。

    想想已经是3、4年前的事了,时间如白驹过隙啊。

    什么时候数组会显得力不从心,没法满足需求,需要集合类呢?

  1. 不知道具体数据长度
  2. 需要自动排序
  3. 存储键值对

    当然,上面的情况不是绝对的,只是数组比较难满足。这时集合类(也可称为容器类)就显示了它强大的功能。

    集合类的分类(图片转自http://biancheng.dnbcw.info/1000wen/359774.html)

    

    上图中不包含Queue内容,部分Map的实现类未给出。

    常见使用的有List、Set、Map及他们的实现类。

    List、Set、Map接口及各实现类的特性

接口

特性

实现类

实现类特性

成员要求

List

线性、有序的存储容器,可通过索引访问元素

ArrayList

数组实现。非同步。

 

Vector

类似ArrayList,同步。

 

LinkedList

双向链表。非同步。

 

Map

保存键值对成员

HashMap

基于哈希表的 Map 接口的实现,满足通用需求

任意Object对象,如果修改了equals方法,需同时修改hashCode方法

TreeMap

默认根据自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序

键成员要求实现caparable接口,或者使用Comparator构造TreeMap。键成员一般为同一类型。

LinkedHashMap

类似于HashMap,但迭代遍历时取得“键值对”的顺序是其插入顺序或者最近最少使用的次序

与HashMap相同

IdentityHashMap

使用==取代equals()对“键值”进行比较的散列映射

成员通过==判断是否相等

WeakHashMap

弱键映射,允许释放映射所指向的对象

 

ConcurrentHashMap

线性安全的Map

 

Set

成员不能重复

HashSet

为快速查找设计的Set

元素必须定义hashCode()

TreeSet

保持次序的Set,底层为树结构

元素必须实现Comparable接口

LinkedHashSet

内部使用链表维护元素的顺序(插入的次序)

元素必须定义hashCode()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 

 

 

 

 

    在满足要求的情况下,Map应尽量使用HashMap,Set应尽量使用HashSet。

    集合类的基本使用

    List

 

  1. List基本操作 
  2.  ArrayList<String> arrayList = new ArrayList<String>(); 
  3.          arrayList.add("Tom"); 
  4.          arrayList.add("Jerry"); 
  5.          arrayList.add("Micky"); 
  6.          // 使用Iterator遍历元素 
  7.          Iterator<String> it = arrayList.iterator(); 
  8.          while (it.hasNext()) { 
  9.              String str = it.next(); 
  10.              System.out.println(str); 
  11.          } 
  12.          // 在指定位置插入元素 
  13.          arrayList.add(2"Kate"); 
  14.          // 通过索引直接访问元素 
  15.          for (int i = 0; i < arrayList.size(); i++) { 
  16.              System.out.println(arrayList.get(i)); 
  17.          } 
  18.          List<String> subList = new ArrayList<String>(); 
  19.          subList.add("Mike"); 
  20.          // addAll(Collection<? extends String> c)添加所给集合中的所有元素 
  21.          arrayList.addAll(subList); 
  22.          // 判断是否包含某个元素 
  23.          if (arrayList.contains("Mike")) { 
  24.              System.out.println("Mike is include in the list"); 
  25.          } 
  26.   
  27.          LinkedList<String> linkedList = new LinkedList<String>(); 
  28.          linkedList.addAll(arrayList); 
  29.          // 获取指定元素 
  30.          System.out.println(linkedList.get(4)); 
  31.          // 获取第一个元素 
  32.          System.out.println(linkedList.getFirst()); 
  33.          // 获取最后一个元素 
  34.          System.out.println(linkedList.getLast()); 
  35.          // 获取并删除第一个元素 
  36.          System.out.println(linkedList.pollFirst()); 
  37.          // 获取,但不移除第一个元素 
  38.          System.out.println(linkedList.peekFirst()); 

ArrayList和LinkedList的效率比较

 

  1. ArrayList添加元素的效率 
  2.  ArrayList<String> arrList = new ArrayList<String>(); 
  3.          long startTimeMillis, endTimeMillis; 
  4.          startTimeMillis = System.currentTimeMillis(); 
  5.          for (int i = 0; i < 10000; i++) { 
  6.              arrList.add(0"addString"); 
  7.          } 
  8.          endTimeMillis = System.currentTimeMillis(); 
  9.          System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis) 
  10.                  + "ms"); 
  11.   
  12.          arrList.clear(); 
  13.   
  14.          startTimeMillis = System.currentTimeMillis(); 
  15.          for (int i = 0; i < 20000; i++) { 
  16.              arrList.add(0"addString"); 
  17.          } 
  18.          endTimeMillis = System.currentTimeMillis(); 
  19.          System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis) 
  20.                  + "ms"); 
  21.   
  22.          arrList.clear(); 
  23.   
  24.          startTimeMillis = System.currentTimeMillis(); 
  25.          for (int i = 0; i < 40000; i++) { 
  26.              arrList.add(0"addString"); 
  27.          } 
  28.          endTimeMillis = System.currentTimeMillis(); 
  29.          System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis) 
  30.                  + "ms"); 
  31.   
  32.          arrList.clear(); 
  33.   
  34.          startTimeMillis = System.currentTimeMillis(); 
  35.          for (int i = 0; i < 80000; i++) { 
  36.              arrList.add(0"addString"); 
  37.          } 
  38.          endTimeMillis = System.currentTimeMillis(); 
  39.          System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis) 
  40.                  + "ms"); 
  41.   
  42.          arrList.clear(); 
  43.   
  44.          startTimeMillis = System.currentTimeMillis(); 
  45.          for (int i = 0; i < 160000; i++) { 
  46.              arrList.add(0"addString"); 
  47.          } 
  48.          endTimeMillis = System.currentTimeMillis(); 
  49.          System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis) 
  50.                  + "ms"); 
  51.   
  52.          arrList.clear(); 
  53.   
  54.          startTimeMillis = System.currentTimeMillis(); 
  55.          for (int i = 0; i < 320000; i++) { 
  56.              arrList.add(0"addString"); 
  57.          } 
  58.          endTimeMillis = System.currentTimeMillis(); 
  59.          System.out.println("ArrayList:" + (endTimeMillis - startTimeMillis) 
  60.                  + "ms"); 

 

执行时

  1. Set基础操作 
  2.             List<Integer> list = new ArrayList<Integer>(); 
  3.             list.add(3); 
  4.             list.add(4); 
  5.             HashSet<Integer> hashSet = new HashSet<Integer>(); 
  6.             hashSet.add(1); 
  7.             hashSet.add(3); 
  8.             hashSet.add(2); 
  9.             hashSet.add(6); 
  10.             // 重复元素将不能被添加 
  11.             hashSet.add(3); 
  12.             // 只要有元素被添加就返回true 
  13.             if (hashSet.addAll(list)) { 
  14.                 System.out.println("Add success"); 
  15.             } 
  16.             // 判断是否存在某个集合 
  17.             if (hashSet.containsAll(list)) { 
  18.                 System.out.println("The hashSet is contain 3 and 4"); 
  19.             } 
  20.             Iterator<Integer> it = hashSet.iterator(); 
  21.             while (it.hasNext()) { 
  22.                 System.out.print(it.next() + " "); 
  23.                 // 1 2 3 4 6 
  24.                 // 看结果是被排序了,HashSet按照Hash函数排序,Integer值的HashCode就是其int值 
  25.             } 
  26.             // 换转成数组 
  27.             Object[] integers = hashSet.toArray(); 
  28.             for (int i = 0; i < integers.length; i++) { 
  29.                 System.out.print((Integer) integers[i]); 
  30.             } 
  31.             //移除元素 
  32.             hashSet.remove(3); 
  33.              
  34.             TreeSet<String> treeSet = new TreeSet<String>(); 
  35.             treeSet.add("C"); 
  36.             treeSet.add("A"); 
  37.             treeSet.add("D"); 
  38.             treeSet.add("B"); 
  39.             for (Iterator<String> strIt = treeSet.iterator(); strIt.hasNext();) { 
  40.                 System.out.print(strIt.next()); 
  41.                 // ABCD 按照字母顺序 
  42.             } 
  43.             LinkedHashSet<String> linkedHashSet = new LinkedHashSet<String>(); 
  44.             linkedHashSet.add("C"); 
  45.             linkedHashSet.add("A"); 
  46.             linkedHashSet.add("D"); 
  47.             linkedHashSet.add("B"); 
  48.             for (Iterator<String> linkedIt = linkedHashSet.iterator(); linkedIt 
  49.                     .hasNext();) { 
  50.                 System.out.print(linkedIt.next()); 
  51.                 // CADB 按照插入顺序 
  52.             } 

间比较

执行次数(在0号位置插入)

ArrayList所用时间(ms)

LinkedList所用时间(ms)

10000

31

0

20000

141

0

40000

484

16

80000

1985

0

160000

7906

0

320000

31719

16

执行次数(在尾部插入)

ArrayList所用时间(ms)

LinkedList所用时间(ms)

10000

0

0

20000

15

0

40000

0

0

80000

0

0

160000

0

15

320000

0

16

循环输出次数(get(index)方法)

ArrayList所用时间(ms)

LinkedList所用时间(ms)

10000

93

204

20000

188

797

40000

328

2734

80000

688

13328

160000

1594

62313

320000

2765

太久了……

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

   

 

 

 

    因为ArrayList底层由数组实现,在0号位置插入时将移动list的所有元素,在末尾插入元素时不需要移动。LinkedList是双向链表,在任意位置插入元素所需时间均相同。所以在List中有较多插入和删除操作的情况下应使用LinkedList来提高效率,而有较多索引查询的时候使用ArrayList(使用增强型的for循环或Iterator遍历LinkedList效率将提高很多)。

    Map

  1. Map基本操作 
  2.  HashMap<String, Integer> map = new HashMap<String, Integer>(); 
  3.          // 向Map中添加元素 
  4.          map.put("Tom"26); 
  5.          map.put("Jack"18); 
  6.          map.put("Micky"17); 
  7.          map.put("Kate"15); 
  8.          // 根据Key获取Value 
  9.          System.out.println("Jack is " + map.get("Jack") + " years old"); 
  10.          // 移除 
  11.          map.remove("Micky"); 
  12.          // 遍历Map 
  13.          for (Entry<String, Integer> entry : map.entrySet()) { 
  14.              System.out.println("name:" + entry.getKey() + " age:" 
  15.                      + entry.getValue()); 
  16.          } 
  17.          // Key相同的元素将被覆盖 
  18.          map.put("Jack"19); 
  19.          // 根据Key获取Value 
  20.          System.out.println("Jack is " + map.get("Jack") + " years old"); 
  21.          // 判断是否包含某个Key 
  22.          if (map.containsKey("Tom")) { 
  23.              System.out.println(map.get("Tom")); 
  24.          } 
  25.          // 判断是否包含某个Value 
  26.          if (map.containsValue(26)) { 
  27.              System.out.println("The map include the value 26"); 
  28.          } 
  29.          // 判断map是否为空 
  30.          if (!map.isEmpty()) { 
  31.              // 获取map大小 
  32.              System.out.println("The map's size=" + map.size()); 
  33.          } 
  34.          // 获取Key的集合 
  35.          for (String str : map.keySet()) { 
  36.              System.out.println(str); 
  37.          } 
  38.   
  39.          TreeMap<String, Integer> treeMap = new TreeMap<String, Integer>(); 
  40.          treeMap.putAll(map); 
  41.          // 输出内容按照key值排序 
  42.          for (Entry<String, Integer> entry : treeMap.entrySet()) { 
  43.              System.out.println("name:" + entry.getKey() + " age:" 
  44.                      + entry.getValue()); 
  45.              // name:Jack age:19 
  46.              // name:Kate age:15 
  47.              // name:Tom age:26 
  48.          } 
  49.   
  50.          LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>(); 
  51.          // 向Map中添加元素 
  52.          linkedHashMap.put("Tom"26); 
  53.          linkedHashMap.put("Jack"18); 
  54.          linkedHashMap.put("Micky"17); 
  55.          linkedHashMap.put("Kate"15); 
  56.          // 保持了插入的顺序 
  57.          for (Entry<String, Integer> entry : linkedHashMap.entrySet()) { 
  58.              System.out.println("name:" + entry.getKey() + " age:" 
  59.                      + entry.getValue()); 
  60.              // name:Tom age:26 
  61.              // name:Jack age:18 
  62.              // name:Micky age:17 
  63.              // name:Kate age:15 
  64.          } 

 

Set

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章