HashMap存放键值对是无序的:
package com.example.myapp.linkedhashmap;
import org.junit.Test;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* Created by mike.
* Created on 2020/4/8.
*/
public class LinkedHashMapTest {
@Test
public void main() {
Map<String, String> linkedHashMap = new HashMap<String, String>();
linkedHashMap.put("编排年分和日期00", "甲");
linkedHashMap.put("编排年分和日期01", "乙");
linkedHashMap.put("编排年分和日期02", "丙");
linkedHashMap.put("编排年分和日期03", "丁");
linkedHashMap.put("编排年分和日期04", "戊");
linkedHashMap.put("编排年分和日期05", "己");
linkedHashMap.put("编排年分和日期06", "庚");
linkedHashMap.put("编排年分和日期07", "辛");
linkedHashMap.put("编排年分和日期08", "壬");
linkedHashMap.put("编排年分和日期09", "癸");
for (Map.Entry<String, String> entry : linkedHashMap.entrySet()){
if(!"".equals(entry.getValue())){
System.out.println(entry.getKey() + "\t" + entry.getValue());
}
}
}
}
打印结果:
编排年分和日期05 己
编排年分和日期04 戊
编排年分和日期07 辛
编排年分和日期06 庚
编排年分和日期01 乙
编排年分和日期00 甲
编排年分和日期03 丁
编排年分和日期02 丙
编排年分和日期09 癸
编排年分和日期08 壬
LinkedHashMap存放键值对是有序的,并且获取也是按照存放顺序获取;
package com.example.myapp.linkedhashmap;
import org.junit.Test;
import java.util.LinkedHashMap;
/**
* Created by mike.
* Created on 2020/4/8.
*/
public class LinkedHashMapTest {
@Test
public void main() {
LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<String, String>();
linkedHashMap.put("编排年分和日期00", "甲");
linkedHashMap.put("编排年分和日期01", "乙");
linkedHashMap.put("编排年分和日期02", "丙");
linkedHashMap.put("编排年分和日期03", "丁");
linkedHashMap.put("编排年分和日期04", "戊");
linkedHashMap.put("编排年分和日期05", "己");
linkedHashMap.put("编排年分和日期06", "庚");
linkedHashMap.put("编排年分和日期07", "辛");
linkedHashMap.put("编排年分和日期08", "壬");
linkedHashMap.put("编排年分和日期09", "癸");
for (LinkedHashMap.Entry<String, String> entry : linkedHashMap.entrySet()) {
if (!"".equals(entry.getValue())) {
System.out.println(entry.getKey() + "\t" + entry.getValue());
}
}
}
}
获取到结果:
编排年分和日期00 甲
编排年分和日期01 乙
编排年分和日期02 丙
编排年分和日期03 丁
编排年分和日期04 戊
编排年分和日期05 己
编排年分和日期06 庚
编排年分和日期07 辛
编排年分和日期08 壬
编排年分和日期09 癸
需要说明的是:
1.在进行LinkedHashMap遍历的时候,不要采用map.keySet();和map.keySet().iterator();方式遍历,这两种方式遍历,如果在遍历过程中操作了LinkedHashMap集合,会报java.util.ConcurrentModificationException异常,原因是:在迭代过程中如果操作了当前的元素,根据LinkedHashMap访问顺序的规则,当前的元素会被放到最后面,当执行下次循环时,就是去获取最后一个元素的后一个元素,所以会报错。
2. accessOrder参数的意义以及LinedHashMap在存放数据长时间未使用带来的影响,请参考引用:
https://blog.youkuaiyun.com/baidu_39534448/article/details/103935450 说的很详细
查看分析LinkedHashMap源码可以知道,LinkedHashMap有5个构造函数:
在这5个构造函数中,只有一个构造函数可以设置accessOrder参数,
accessOrder 为true时:存放的数据是无序的
package com.example.myapp.linkedhashmap;
import org.junit.Test;
import java.util.LinkedHashMap;
/**
* Created by mike.
* Created on 2020/4/8.
*/
public class LinkedHashMapTest {
@Test
public void main() {
LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>(10, 0.75f, true);
linkedHashMap.put(0, "甲");
linkedHashMap.put(1, "乙");
linkedHashMap.put(2, "丙");
linkedHashMap.put(3, "丁");
linkedHashMap.put(4, "戊");
linkedHashMap.put(5, "己");
linkedHashMap.put(6, "庚");
linkedHashMap.put(7, "辛");
linkedHashMap.put(8, "壬");
linkedHashMap.put(9, "癸");
linkedHashMap.put(7, "辛00");
for (LinkedHashMap.Entry<Integer, String> entry : linkedHashMap.entrySet()) {
if (!"".equals(entry.getValue())) {
System.out.println(entry.getKey() + "\t" + entry.getValue());
}
}
}
}
输出结果:
0 甲
1 乙
2 丙
3 丁
4 戊
5 己
6 庚
8 壬
9 癸
7 辛00
accessOrder 为false时:存放的数据是有序的
package com.example.myapp.linkedhashmap;
import org.junit.Test;
import java.util.LinkedHashMap;
/**
* Created by mike.
* Created on 2020/4/8.
*/
public class LinkedHashMapTest {
@Test
public void main() {
LinkedHashMap<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>(10, 0.75f, false);
linkedHashMap.put(0, "甲");
linkedHashMap.put(1, "乙");
linkedHashMap.put(2, "丙");
linkedHashMap.put(3, "丁");
linkedHashMap.put(4, "戊");
linkedHashMap.put(5, "己");
linkedHashMap.put(6, "庚");
linkedHashMap.put(7, "辛");
linkedHashMap.put(8, "壬");
linkedHashMap.put(9, "癸");
linkedHashMap.put(7, "辛00");
for (LinkedHashMap.Entry<Integer, String> entry : linkedHashMap.entrySet()) {
if (!"".equals(entry.getValue())) {
System.out.println(entry.getKey() + "\t" + entry.getValue());
}
}
}
}
输出结果:
0 甲
1 乙
2 丙
3 丁
4 戊
5 己
6 庚
7 辛00
8 壬
9 癸
需要说明的是:如果不传入参数,那么默认是false,也就是有序数据。