HashMap、TreeMap、Hashtable、LinkedHashMap区别

HashMap

允许设置key和value为null,key存放是乱序的,不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap,访问速度快,因为它根据key的HashCode 值来存储数据

public static void main(String[] args) {
	System.out.println("************************* HashMap *******************************");
	HashMap<String, String> hashMap = new HashMap<String, String>();
	hashMap.put("X-rapido", "Admin");
	hashMap.put("X-rapido", "User"); // 重复的会替换旧数据
	hashMap.put("Y-miya", null);
	hashMap.put("J-lina", null);
	System.out.println(hashMap.get(null));
	hashMap.put(null, "Manager");
	hashMap.put(null, "liner");
	hashMap.put("刘仁奎", "好帅");
	hashMap.put("PrettyBoy", "X-rapido");
	System.out.println(hashMap.get(null) + " : " + hashMap.get("刘仁奎") + "\n");

	for (String key : hashMap.keySet()) {
		System.out.println(key + " : " + hashMap.get(key));
	}
}

结果

************************* HashMap *******************************

null

liner : 好帅

null : liner

J-lina : null

Y-miya : null

X-rapido : User

PrettyBoy : X-rapido

刘仁奎 : 好帅

TreeMap

不允许key为null,但允许value为null,线程非同步,存放是根据key默认是升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

public static void main(String[] args) {
	System.out.println("************************* TreeMap *******************************");
	TreeMap<String, String> treeMap = new TreeMap<String, String>();
	treeMap.put("X-rapido", "Admin");
	treeMap.put("X-rapido", "User"); // 重复的会替换旧数据
	treeMap.put("Y-miya", null);
	treeMap.put("J-lina", null);

	System.out.println(treeMap.get(null));
	treeMap.put(null, "Manager");
}

结果

************************* TreeMap *******************************

Exception in thread "main" java.lang.NullPointerException

at java.util.TreeMap.getEntry(TreeMap.java:324)

at java.util.TreeMap.get(TreeMap.java:255)

at com.founder.MapSoft.main(MapSoft.java:32)

正确代码

System.out.println("************************* TreeMap *******************************");
TreeMap<String, String> treeMap = new TreeMap<String, String>();
treeMap.put("X-rapido", "Admin");
treeMap.put("X-rapido", "User"); // 重复的会替换旧数据
treeMap.put("Y-miya", null);
treeMap.put("J-lina", null);
treeMap.put("刘仁奎", "好帅");
treeMap.put("PrettyBoy", "X-rapido");

for (String key : treeMap.keySet()) {
	System.out.println(key+" : "+treeMap.get(key));
}

结果

************************* TreeMap *******************************

J-lina : null

PrettyBoy : X-rapido

X-rapido : User

Y-miya : null

刘仁奎 : 好帅

可以使用System.out.println(treeMap.firstEntry().getKey());和System.out.println(treeMap.firstKey());获取排完序之后的第一个key和value

Hashtable

key和value都不允许为null,线程同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢

LinkedHashMap

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

不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap


实现类


Map


继承类


AbstractMap


Dictionary


AbstractMap


HashMap


名称


HashMap


HashTable


TreeMap


LinkedHashMap


是否有序排列


n(随机的)


n


y (默认升序)


y(按插入顺序排列)


线程是否同步


n


y


n


n


允许Key为null


y


n


n


y


允许Value为null


y


n


y


y


性能


快(HashMap的遍历速度和他的容量有关)




慢(遍历速度只和实际数据有关,和容量无关)


应用范围


插入、删除和定位元素,HashMap是最好的选择


线程安全


取出来的是排序后的键值对,插入、删除需要维护平衡会牺牲一些效率


需要输出的顺序和输入的顺序相同

Java Map集合利用比较器Comparator根据Key和Value的排序

参考文章:http://blog.csdn.net/xiaokui_wingfly/article/details/42964695

时间: 2024-12-09 01:22:17

HashMap、TreeMap、Hashtable、LinkedHashMap区别的相关文章

Map...---HashMap和Hashtable的区别-----...LinkedHashMap

*Map接口不是Collection接口的子接口 *Map存放数据的方式采用键值对的方式,类似与生活中目录(键)和内容(值) *常见的实现类: * HashMap**:采用键-值对的方式进行存放. * 键(键的集合是就是set集合):唯一,无序,如果键重复,将发生覆盖 * 值:无序 不唯一(Collection) * 构造函数: * HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap. * HashMap(int initialCapaci

[转]HashMap与HashTable的区别、HashMap与HashSet的关系

转自: http://blog.csdn.net/wl_ldy/article/details/5941770 HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable.可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别. 一:HashMap与HashTable的区别 1.HashTable的方法是同步 的,在方法的前面都有synchronized来同步,HashMap未经同步,所以

ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilder、StringBuffer和String的区别?

ArrayList和Vector的区别?从两个方面 1.同步性:ArrayList是线程不安全的,是非同步的:Vector是线程安全的,是同步的.(Java中线程的同步也就满足了安全性) 2.数值增长:ArrayList每次增长为原来的50%;Vector每次增长为原来的100%; (从内部实现机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当向集合中添加对象时,如果内部数组长度不够用时,长度会自动增长.ArrayList会增长为原来的1.5倍,Vecto

深入集合类系列——HashMap和HashTable的区别

含义:HashMap是基于哈希表的Map接口的非同步实现.允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 数据结构:HashMap实际上是一个"链表散列"的数据结构,即数组和链表的结合体. HashMap存数据的基本流程: 1.当调用put(key,value)时,首先获取key的hashcode,int hash = key.hashCode(); 2.再把hash通过一下运算得到一个int h. hash ^= (hash >>&g

HashMap和Hashtable的区别 源码分析

一:以前只知道HashMap和HashTable区别,死记硬背的记住HashMap 允许key value为空 而Hashtable 不允许为空 HashMap线程是非线程安全的,而Hashtable是安全的. 二.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable public class HashM

从Java源码的角度来分析HashMap与HashTable的区别

由于HashMap与HashTable都是用来存储Key-Value的键值对,所以经常拿来对比二者的区别,下面就从源码的角度来分析一下HashMap与HashTable的区别, 首先介绍一下两者的区别,然后再从源码分析. HahMap与HahTable两者主要区别: 1.继承的父类不同 <span style="font-size:18px;">public class HashMap<K, V> extends AbstractMap<K, V>

java面试题——HashMap和Hashtable 的区别

一.HashMap 和Hashtable 的区别 我们先看2个类的定义 1 public class Hashtable 2 extends Dictionary 3 implements Map, Cloneable, java.io.Serializable public class HashMap extends AbstractMap implements Map, Cloneable, Serializable 可见Hashtable 继承自 Dictiionary 而 HashMap

HashMap与HashTable的区别、HashMap与HashSet的关系

http://blog.csdn.net/wl_ldy/article/details/5941770 HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable.可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别. 一:HashMap与HashTable的区别 1.HashTable的方法是同步 的,在方法的前面都有synchronized来同步,HashMap未经同步,所以在多线程

Java 集合系列 11 hashmap 和 hashtable 的区别

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和

java 的HashMap和HashTable的区别?

1.HashMap和HashTable的区别? HashMap不是线程安全的它的操作方法没有进行同步处理 HashMap允许key为空 HashTable是线程安全的它的操作方法加以了synchronized修饰 HashTable不允许Key为空 2.ArrayList和LinkedList和Vector的区别? ArrayList内部实现是一个object数组,非线程安全 LinkedList内部实现是一个链表结构,非线程安全 Vector内部实现是一个object数组,线程安全 原文地址: