HashMap 、LinkedHashMap、ThreeMap 的区别

参考:https://blog.csdn.net/a822631129/article/details/78520111

今天在项目中有个数据有序无序的问题,之前使用set做的,当数据是单个的,那无所谓,若数据为多个,情况就发生变化了。
有序:有序列表中的元素具有某种内在的关联,这种关联定义了列表之间的顺序

无序:无序列表中的元素按使用者所选择得任意方式排序

索引:索引列表为他的元素维护一段连续的数字索引值

有序列表:
List(链表结构)
LinkedHashMap(插入顺序)
TreeMap(有排序默认升序)
Hashtable(有排序默认降序)

无序列表
HashMap
Set

java 为数据结构中的映射定义了一个接口 java.util.Map; 它有四个实现类,分别是 HashMap Hashtable LinkedHashMap 和 TreeMap.

Map 主要用于存储健值对,根据键得到值,因此不允许键重复 (重复了覆盖了), 但允许值重复。
Hashmap 是一个最常用的 Map, 它根据键的 HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap 最多只允许一条记录的键为 Null; 允许多条记录的值为 Null;HashMap 不支持线程的同步,即任一时刻可以有多个线程同时写 HashMap; 可能会导致数据的不一致。如果需要同步,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有同步的能力,或者使用 ConcurrentHashMap。

Hashtable 与 HashMap 类似,它继承自 Dictionary 类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写 Hashtable, 因此也导致了 Hashtable 在写入时会比较慢。

LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 遍历 LinkedHashMap 时,先得到的记录肯定是先插入的。也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比 HashMap 慢,不过有种情况例外,当 HashMap 容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap 慢,因为 LinkedHashMap 的遍历速度只和实际数据有关,和容量无关,而 HashMap 的遍历速度和他的容量有关。

TreeMap 实现 SortMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。

一般情况下,我们用的最多的是 HashMap, 在 Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么 TreeMap 会更好。如果需要输出的顺序和输入的相同,那么用 LinkedHashMap 可以实现,它还可以按读取顺序来排列.

HashMap 是一个最常用的 Map,它根据键的 hashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap 最多只允许一条记录的键为 NULL,允许多条记录的值为 NULL。

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

Hashtable 与 HashMap 类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写 Hashtable,因此也导致了 Hashtable 在写入时会比较慢。

LinkedHashMap 保存了记录的插入顺序,在用 Iterator 遍历 LinkedHashMap 时,先得到的记录肯定是先插入的。

在遍历的时候会比 HashMap 慢 TreeMap 能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的

遍历LinkedHashMap,HashMap,TreeMap

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

public class testDemo {
public static void main(String[] args) {
System.out.println("=LinkedHashMap====");
Map<String,String> map = new LinkedHashMap();
map.put(“星期一”, “星期一”);
map.put(“星期2”, “星期2”);
map.put(“星期3”, “星期3”);
map.put(“星期4”, “星期4”);
map.put(“星期5”, “星期5”);
System.out.println(map);

    for(Map.Entry<String, String> entry : map.entrySet()){
        String mapKey = entry.getKey();
        String mapValue = entry.getValue();
        System.out.println(mapKey+":"+mapValue);
    }
    
    System.out.println("=========HashMap========");
    Map<String,String> map2 = new HashMap<>();
    map2.put("星期一", "星期一");
    map2.put("星期2", "星期2");
    map2.put("星期3", "星期3");
    map2.put("星期4", "星期4");
    map2.put("星期5", "星期5");
    System.out.println(map2);
    for(Map.Entry<String, String> entry : map2.entrySet()){
        String mapKey = entry.getKey();
        String mapValue = entry.getValue();
        System.out.println(mapKey+":"+mapValue);
    }
    
    System.out.println("=========TreeMap========");
    Map<String,String> map3 = new TreeMap<>();
    map3.put("星期一", "星期一");
    map3.put("星期2", "星期2");
    map3.put("星期3", "星期3");
    map3.put("星期4", "星期4");
    map3.put("星期5", "星期5");
    System.out.println(map3);

    for(Map.Entry<String, String> entry : map3.entrySet()){
        String mapKey = entry.getKey();
        String mapValue = entry.getValue();
        System.out.println(mapKey+":"+mapValue);
    }

}

}

在这里插入图片描述
注意看这里的TreeMap是顺序排列,Hashtable是降序,LinkedHashMap是按插入顺序,HashMap随机。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值