HashMap,LinkedHashMap,TreeMap的有序性

Stella981
• 阅读 645

HashMap 实际上是一个链表的数组。HashMap 的一个功能缺点是它的无序性,被存入到 HashMap 中的元素,在遍历 HashMap 时,其输出是无序的。如果希望元素保持输入的顺序,可以使用 LinkedHashMap 替代。

LinkedHashMap继承自HashMap,具有高效性,同时在HashMap的基础上,又在内部增加了一个链表,用以存放元素的顺序。LinkedHashMap内部多了一个双向循环链表的维护,该链表是有序的,可以按元素插入顺序或元素最近访问顺序(LRU)排列,简单地说:LinkedHashMap=散列表+循环双向链表

LinkedHashMap 是根据元素增加或者访问的先后顺序进行排序,TreeMap 则是基于元素的固有顺序 (由 Comparator 或者 Comparable 确定)。而 TreeMap 则根据元素的 Key 进行排序。

public class TreeMapTest {

    public static void main(String args[]){
        
        Map<String, Integer> hashMap = new HashMap<>();
        System.out.println("hashmap結果");
        
        hashMap.put("1", 1);
        hashMap.put("3", 3);
        hashMap.put("7", 2);
        hashMap.put("2", 7);
        hashMap.put("4", 4);
        Iterator iterator =hashMap.keySet().iterator();
        while (iterator.hasNext()) {
            Object key=  iterator.next();
            System.out.println("key: "+key + "值为:"+hashMap.get(key));
        }
        
        System.out.println("treeMap結果");
        Map<String, Integer> treeMap = new TreeMap();
        treeMap.put("1", 1);
        treeMap.put("3", 3);
        treeMap.put("7", 2);
        treeMap.put("2", 7);
        treeMap.put("4", 4);
        Iterator iterator1 =treeMap.keySet().iterator();
        while (iterator1.hasNext()) {
            Object key=  iterator1.next();
            System.out.println("key: "+key + "值为:"+treeMap.get(key));
        }
        
        System.out.println("LinkedHashMap結果");
        Map  linkMap= new LinkedHashMap<>();
        
        linkMap.put("1", 1);
        linkMap.put("3", 3);
        linkMap.put("7", 2);
        linkMap.put("2", 7);
        linkMap.put("4", 4);
        Iterator iterator2 =linkMap.keySet().iterator();
        while (iterator2.hasNext()) {
            Object key=  iterator2.next();
            System.out.println("key: "+key + "值为:"+linkMap.get(key));
        }
    }
        
}

----------运行结果:-----------linkMap.put("7", 2);
linkMap.put("2", 7);  //特意将key的值与value的值不一样,看排序是按照key排序还是value的值排序hashmap結果  //随机的,此处看不出来
key: 1值为:1
key: 2值为:7
key: 3值为:3
key: 4值为:4
key: 7值为:2
treeMap結果 //可以看到是按照key值排序的,默认升序
key: 1值为:1
key: 2值为:7
key: 3值为:3
key: 4值为:4
key: 7值为:2
LinkedHashMap結果   //按照插入的顺序排序
key: 1值为:1
key: 3值为:3
key: 7值为:2
key: 2值为:7
key: 4值为:4
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java集合之HashMap源码解读
源自:jdk1.8.0\_121HashMap继承自AbstractMap,实现了Map、Cloneable、Serializable。HashMap内部是由数组、链表、红黑树实现的变量//默认大小staticfinalintDEFAULT_INITIAL_CAPACI
Wesley13 Wesley13
2年前
java中的HashMap和TreeMap
HashMap和TreeMap两者都是Map,java中的Map以键值对来存储数据,通过键key来索引值value。HashMap通过hashcode对其内容进行快速查找,其结果时无序的;TreeMap中的所有元素都默认进行了排序,所以当需要一个有序的结果时,使用TreeMap是比较方便的。具体的定义和遍历方法,可以看下面的例子:
BichonCode BichonCode
3年前
Java的其他Map
一、LinkedHashMap1.1应用场景HashMap是无序的,当我们希望有顺序地去存储keyvalue时,就需要使用LinkedHashMap了。1.2插入顺序和访问顺序LinkedHashMap默认的构造参数是默认 插入顺序的,就是说你插入的是什么顺序,读出来的就是什么顺序,但是也有访问顺序,就是说你访问了一个key,这个
Stella981 Stella981
2年前
Collectors.groupingBy分组后的排序问题
默认groupingBy代码里会生成一个HashMap(hashMap是无序的,put的顺序与get的顺序不一致)HashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同(除非在put的时候key已
Wesley13 Wesley13
2年前
Java8的HashMap笔记摘要
问题例子: HashMap是不是有序的?不是有序的。有没有有序的Map实现类呢?有TreeMap和LinkedHashMap。TreeMap和LinkedHashMap是如何保证它的顺序的? TreeMap是通过实现SortMap接口,能够把它保存的键值对根据key排序,基
Stella981 Stella981
2年前
HashMap 怎么 hash?又如何 map?
HashMap 是Java中Map的一个实现类,它是一个双列结构(数据链表),这样的结构使得它的查询和插入效率都很高。HashMap允许null键和值,它的键唯一,元素的存储无序,并且它是线程不安全的。!(https://oscimg.oschina.net/oscnet/24e81018b69298cf434a8eb39682070
Stella981 Stella981
2年前
HashMap1.7和1.8,红黑树原理!
jdk1.7概述HashMap基于Map接口实现,元素以键值对的方式存储,并允许使用null键和null值,但只能有一个键作为null,因为key不允许重复,另外HashMap不能保证放入元素的数据,它是无序的,和放入的顺序并不能相同,HashMap是线程不安全的。继承关系publicclassH
Wesley13 Wesley13
2年前
Java集合之Map接口
Map使用键值对来存储数据,将键映射到值对象,一个映射不能包含重复的键,每一个键最多只能映射到一个值。Map接口的具体实现类:HashMap,Hashtable,TreeMap,LinkedHashMap  1)HashMap  基于哈希表(哈希表学习地址)的Map接口实现。允许使用null值和null键,不保证映射的顺序,特别是不保证顺序恒
Stella981 Stella981
2年前
HashMap 的底层实现原理
HashMap是一个用于存储KeyValue键值对的集合,每一个键值对也叫做Entry。这些个Entry分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。 !(https://oscimg.oschina.net/oscnet/8495d30fe00a2865dd74088d2
Wesley13 Wesley13
2年前
Java 之 HashMap 集合
一、HashMap概述java.util.HashMap<k,v集合implementsMap<k,v接口HashMap集合的特点:1、HashMap集合底层是哈希表:查询速度特别的快JDK1.8之前:数组单向链表JDK1.8之后:数组单向链表|红黑树(