java hashmap hashtable treemap_【Java】HashMap、TreeMap、Hashtable、LinkedHashMap区别

bc7fdfc03a181785f939cc7c3cabcadc.gif

HashMap

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

System.out.println("************************* HashMap *******************************");

HashMap hashMap = new HashMap();

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("X", "好帅");

hashMap.put("PrettyBoy", "X-rapido");

System.out.println(hashMap.get(null) + " : " + hashMap.get("X-rapido") + "\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

X : 好帅

TreeMap

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

System.out.println("************************* TreeMap *******************************");

TreeMap treeMap = new TreeMap();

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 treeMap = new TreeMap();

treeMap.put("X-rapido", "Admin");

treeMap.put("X-rapido", "User"); // 重复的会替换旧数据

treeMap.put("Y-miya", null);

treeMap.put("J-lina", null);

treeMap.put("X", "好帅");

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

X : 好帅

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

Hashtable

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

HashMap和HashTable的区别主要有以下几个方面HashTable的方法是同步的,HashMap不能同步

HashTable不允许为null(key和value都不可以),HashMap允许null值(key和value都可以)

HashTable有一个contains()方法,功能和containsValue()功能一样。

HashTable使用Enumeration遍历,HashMap使用Iterator遍历。

HashTable中hash数组的初始化大小及其增长方式不同。(hashTable默认hash数组是11,增长方式是:old*2+1,hashMap默认大小是16,增长方式一定是2的指数)

哈希值的使用不同,HashTable直接使用对象的hashCode,而HashMap会重新计算hash值。

LinkedHashMap

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

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

继承类AbstractMapDictionaryAbstractMapHashMap

名称HashMapHashTableTreeMapLinkedHashMap

是否有序排列n(随机的)ny (默认升序)y(按插入顺序排列)

线程是否同步nynn

允许Key为nullynny

允许Value为nullynyy

性能快(HashMap的遍历速度和他的容量有关)慢块慢(遍历速度只和实际数据有关,和容量无关)

应用范围插入、删除和定位元素,HashMap是最好的选择线程安全取出来的是排序后的键值对,插入、删除需要维护平衡会牺牲一些效率需要输出的顺序和输入的顺序相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值