zoukankan      html  css  js  c++  java
  • 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     }
    若言琴上有琴声,放在匣中何不鸣; 若言声在指头上,何不于君指上听。
  • 相关阅读:
    Django高级编程之自定义Field实现多语言
    Python魔法方法__getattr__和__getattribute__详解
    Python深入浅出property特性属性
    Python中使用__new__实现单例模式并解析
    Python中类方法、__new__方法和__init__方法解析
    Python中可迭代对象、迭代器以及iter()函数的两个用法详解
    Docker ubuntu apt-get更换国内源解决Dockerfile构建速度过慢
    Python抽象基类中__subclasshook__方法的使用并实现自己的虚拟子类
    Scrapy-redis分布式爬虫爬取豆瓣电影详情页
    PHP5.5+ APC 安装
  • 原文地址:https://www.cnblogs.com/xkms/p/4040001.html
Copyright © 2011-2022 走看看