1.HashMap

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

2.TreeMap

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

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

 package com.java7.src.vector;

 import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap; import com.java7.src.proxy.Employee; public class VectorTest { public static void main(String[] args) {
Employee e1 = new Employee(1, "changming.liu");
Employee e2 = new Employee(2, "bhaoliang.song");
Employee e3 = new Employee(4, "lei.li");
Employee e6 = new Employee(5, "a.aefaw");
Employee e7 = new Employee(6, "z.afee3"); List<Employee> es = new ArrayList<>();
es.add(e1);
es.add(e2);
es.add(e3);
es.add(e6);
es.add(e7); //HashMap
System.out.println("----------HashMap--------");
Map<String,Employee> maps = new HashMap<>();
maps.put(null, e1);
for( Employee e: es){
maps.put(e.getName(), e);
}
Set<String> keys = maps.keySet();
for( String key:keys)
System.out.println(key);
//TreeMap
System.out.println("----------TreeMap--------");
System.out.println(" 没有使用自定义排序方式(升序)");
TreeMap<String,Employee> tmaps = new TreeMap<>();
for( Employee e: es){
tmaps.put(e.getName(), e);
}
Set<String> sets = tmaps.keySet();
for(String key:sets)
System.out.println("      "+key);
System.out.println(" 使用了自定义排序方式(降序)");
tmaps = new TreeMap<>(new MyComparator()) ;
for( Employee e: es){
tmaps.put(e.getName(), e);
}
sets = tmaps.keySet();
for(String key:sets)
System.out.println("      "+key);
System.out.println(" 大于等于'd'的最小键:"+tmaps.ceilingKey("d"));
}
}

3.ArrayList

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

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

4.Vector

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

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

 private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}

JDK1.7源码阅读tools包之------ArrayList,LinkedList,HashMap,TreeMap的更多相关文章

  1. JDK1.8源码阅读系列之一:ArrayList

    本篇随笔主要描述的是我阅读 ArrayList 源码期间的对于 ArrayList 的一些实现上的个人理解,有不对的地方,请指出- 先来看一下 ArrayList 的继承图: 由图可以看出,Array ...

  2. JDK1.8源码阅读系列之二:LinkedList

    本篇随笔主要描述的是我阅读 LinkedList 源码期间的对于 LinkedList 的一些实现上的个人理解,有不对的地方,请指出- 先来看一下 LinkedList 的继承图: 由于 Abstra ...

  3. JDK1.8源码阅读笔记(1)Object类

    JDK1.8源码阅读笔记(1)Object类 ​ Object 类属于 java.lang 包,此包下的所有类在使⽤时⽆需⼿动导⼊,系统会在程序编译期间⾃动 导⼊.Object 类是所有类的基类,当⼀ ...

  4. JDK1.8源码阅读系列之三:Vector

    本篇随笔主要描述的是我阅读 Vector 源码期间的对于 Vector 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 先来看一下 Vector 的继承图: 可以看出,Vector 的直 ...

  5. JDK1.8源码阅读笔记(2) AtomicInteger AtomicLong AtomicBoolean原子类

    JDK1.8源码阅读笔记(2) AtomicInteger AtomicLong AtomicBoolean原子类 Unsafe Java中无法直接操作一块内存区域,不能像C++中那样可以自己申请内存 ...

  6. JDK1.8源码阅读系列之四:HashMap (原创)

    本篇随笔主要描述的是我阅读 HashMap 源码期间的对于 HashMap 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 接下来会从以下几个方面介绍 HashMap 源码相关知识: 1 ...

  7. HashMap与HashTable的哈希算法——JDK1.9源码阅读总结

    下面是HashTable源码中的put方法: 注意上面注释标注的地方: HashTable对于元素在哈希表中的坐标算法是: 将对象自身的哈希值key.hashCode()变为正数:hash & ...

  8. [Go] gocron源码阅读-flag包实现命令行参数获取

    调用flag包可以方便的获取到命令行中传递的参数,比如可以实现类似nginx执行程序获取命令行参数执行不同操作的目标 package main import ( "flag" &q ...

  9. jdk1.8源码阅读

    一.java.lang java的基础类 1.object 所有类的爸爸 registerNatives() Class<?> getClass():返回运行时的类 int hashCod ...

随机推荐

  1. nginx下部署showdoc

    1. 安装nginx服务器sudo apt-get install nginx -y 2. 启动服务sudo service nginx start 3. 安装php环境 sudo apt-get i ...

  2. C#学习笔记_02_数据类型

    02_数据类型 基本数据类型 整型 有符号整型:最高位是正负号 字节型:sbyte 1byte:[-128,127] 短整型:short: 2byte:[-2^(位数-1),2^(位数-1)-1] 整 ...

  3. BZOJ 3119 Book (贪心+数学推导)

    手动博客搬家: 本文发表于20191029 22:49:41, 原地址https://blog.csdn.net/suncongbo/article/details/78388925 URL: htt ...

  4. 【习题4-1 Uva1589】Xiangqi

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 车是可以被吃掉的... 注意这个情况. 其他的模拟即可. [代码] #include <bits/stdc++.h> u ...

  5. leetcode第一刷_Minimum Depth of Binary Tree

    非常easy的题目.只是还是认为要说一下. 最小深度.非常快想到bfs,层序遍历嘛.本科的时候实在是没写过多少代码,一開始竟然想不到怎么保存一层的信息.后来想到能够压入一个特殊的对象,每次到达这个对象 ...

  6. 1016. Phone Bills (25)——PAT (Advanced Level) Practise

    题目信息: 1016. Phone Bills (25) 时间限制 400 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A l ...

  7. vbs 脚本2

    一些很恶作剧的vbs程序代码 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-16我要评论 恶作剧的vbs代码,这里提供的都是一些死循环或导致系统死机的vbs对机器没坏处,最多关机重启 ...

  8. Codeforces Round #244 (Div. 2)D (后缀自己主动机)

    Codeforces Round #244 (Div. 2)D (后缀自己主动机) (标号为0的节点一定是null节点,不管怎样都不能拿来用,切记切记,以后不能再错了) 这题用后缀自己主动机的话,对后 ...

  9. POJ 1442 Black Box(优先队列)

    题目地址:POJ 1442 这题是用了两个优先队列,当中一个是较大优先.还有一个是较小优先. 让较大优先的队列保持k个.每次输出较大优先队列的队头. 每次取出一个数之后,都要先进行推断,假设这个数比較 ...

  10. Running the app on your device

    So far, you've run the app on the Simulator. That's nice and all but probably notwhy you're learning ...