JDK1.7源码阅读tools包之------ArrayList,LinkedList,HashMap,TreeMap

1.HashMap

  特点:基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)无序存储。性能主要受制于初始容量和加载因子两个参数。当需要进行rehash时,扩展为原来的两倍。

2.TreeMap

 特点:基于红黑树的NavigableMap实现,该映射根据其键的自然顺序(升序)排序,或者根据创建映射时的Comparator排序。可以存放null的value,不可以存放null的key。并且提供了一些对键排序有关的方法。比如ceilingKey(key)(返回大于等于给定键的最小键)

      floorKey(key)(返回小于等于给定键的最大键)等方法。

 1 package com.java7.src.vector;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 import java.util.NavigableMap;
 8 import java.util.Set;
 9 import java.util.TreeMap;
10 
11 import com.java7.src.proxy.Employee;
12 
13 public class VectorTest {
14 
15     public static void main(String[] args) {
16         Employee e1 = new Employee(1, "changming.liu");
17         Employee e2 = new Employee(2, "bhaoliang.song");
18         Employee e3 = new Employee(4, "lei.li");
19         Employee e6 = new Employee(5, "a.aefaw");
20         Employee e7 = new Employee(6, "z.afee3");
21         
22         List<Employee> es = new ArrayList<>();
23         es.add(e1);
24         es.add(e2);
25         es.add(e3);
26         es.add(e6);
27         es.add(e7);
28         
29         //HashMap
30         System.out.println("----------HashMap--------");
31         Map<String,Employee> maps = new HashMap<>();
32         maps.put(null, e1);
33         for( Employee e: es){
34             maps.put(e.getName(), e);
35         }
36         Set<String> keys = maps.keySet();
37         for( String key:keys)
38             System.out.println(key);
39         //TreeMap
40         System.out.println("----------TreeMap--------");
41         System.out.println("          没有使用自定义排序方式(升序)");
42         TreeMap<String,Employee> tmaps = new TreeMap<>();
43         for( Employee e: es){
44             tmaps.put(e.getName(), e);
45         }
46         Set<String> sets = tmaps.keySet();
47         for(String key:sets)
48             System.out.println("      "+key);
49         System.out.println("          使用了自定义排序方式(降序)");
50         tmaps = new TreeMap<>(new MyComparator()) ;
51         for( Employee e: es){
52             tmaps.put(e.getName(), e);
53         }
54         sets = tmaps.keySet();
55         for(String key:sets)
56             System.out.println("      "+key);
57        System.out.println("           大于等于'd'的最小键:"+tmaps.ceilingKey("d"));
58     }
59 }
View Code

3.ArrayList

  特点:List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小(比如ensureCapacity(int capacity)。(此类大致上等同于 Vector类,除了此类是不同步的。)随着向 ArrayList 中不断添加元素,其容量也自动增长。当minCapacity - elementData.length > 0时,容量增长为原来的3倍。grow()函数可以证明

 1 /**
 2      * Increases the capacity to ensure that it can hold at least the
 3      * number of elements specified by the minimum capacity argument.
 4      *
 5      * @param minCapacity the desired minimum capacity
 6      */
 7     private void grow(int minCapacity) {
 8         // overflow-conscious code
 9         int oldCapacity = elementData.length;
10         int newCapacity = oldCapacity + (oldCapacity >> 1); //3倍
11         if (newCapacity - minCapacity < 0)
12             newCapacity = minCapacity;
13         if (newCapacity - MAX_ARRAY_SIZE > 0)
14             newCapacity = hugeCapacity(minCapacity);
15         // minCapacity is usually close to size, so this is a win:
16         elementData = Arrays.copyOf(elementData, newCapacity);
17     }

4.Vector

 特点:Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。

         每个向量会试图通过维护 capacity 和 capacityIncrement 来优化存储管理。capacity 始终至少应与向量的大小相等;这个值通常比后者大些,因为随着将组件添加到向量中,其存储将按 capacityIncrement 的大小增加存储块。

         

 1 private void grow(int minCapacity) {
 2         // overflow-conscious code
 3         int oldCapacity = elementData.length;
 4         int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
 5                                          capacityIncrement : oldCapacity);
 6         if (newCapacity - minCapacity < 0)
 7             newCapacity = minCapacity;
 8         if (newCapacity - MAX_ARRAY_SIZE > 0)
 9             newCapacity = hugeCapacity(minCapacity);
10         elementData = Arrays.copyOf(elementData, newCapacity);
11     }
若言琴上有琴声,放在匣中何不鸣; 若言声在指头上,何不于君指上听。
原文地址:https://www.cnblogs.com/xkms/p/4040001.html