LinkedHashMap是Java提供的一种Map集合类型,继承于HashMap并实现了Map接口和双向链表数据结构。相比HashMap,它可以在保持快速查找的同时,保证迭代顺序和插入顺序是一致的。这就意味着它是有序的。
一、keyset有序吗
LinkedHashMap的keyset是有序的,输出顺序和插入顺序一致。其实这个也是由双向链表的结构所决定的,因为每一个元素在插入的时候都会被封装成为Entry类型,并存储在一个双向链表中,因此在访问keyset的时候,就会按照链表的顺序返回。
LinkedHashMap map = new LinkedHashMap(); map.put("apple", 1); map.put("pear", 2); map.put("banana", 3); for (String key : map.keySet()) { System.out.println(key); } // 输出结果为: // apple // pear // banana
二、LinkedHashMap有序遍历
如果需要遍历整个LinkedHashMap,我们可以使用entrySet()方法,该方法会返回一个有序的集合,里面包含了所有的Entry元素,然后我们可以根据entry的key和value进行相应的操作。
LinkedHashMap map = new LinkedHashMap(); map.put("apple", 1); map.put("pear", 2); map.put("banana", 3); for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() +" - "+ entry.getValue()); } // 输出结果为: // apple - 1 // pear - 2 // banana - 3
三、ConcurrentHashMap有序吗
相比之下,ConcurrentHashMap是没有顺序保障的。虽然它内部也有一个对于迭代顺序有保障的结构类似于Segment,不过ConcurrentHashMap为了支持高并发,限制了各种锁的范围,导致它无法对于整个Map进行顺序的保证。
四、LinkedHashMap有序还是无序
LinkedHashMap是有序的,这可以从其构造函数中第三个参数accessOrder为true时得到体现。如果该参数的值为true,则在对Map中的元素进行get()、put()、putAll()操作时,都会将元素移到最后一个位置,因此访问顺序也可以通过这个方式被保证。
LinkedHashMap map = new LinkedHashMap(16, 0.75f, true); map.put("apple", 1); map.put("pear", 2); map.put("banana", 3); map.get("apple"); // 让apple成为最后访问的元素 for (String key : map.keySet()) { System.out.println(key); } // 输出结果为: // pear // banana // apple
五、LinkedHashMap为什么有序
LinkedHashMap之所以有序,是因为在Map中维护了一个双向链表,他被称为记录插入顺序或者访问顺序。这个双向链表记录了每一个元素的插入或访问顺序,所以每次遍历都是按照这个顺序进行的。如果我们需要改变这个顺序,可以使用accessOrder参数设置,该参数会让LinkedHashMap在对元素进行get()、put()、putAll()操作时将元素移到最后一个位置,这样就保证了遍历顺序。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/291026.html