LinkedHashMap存放有序键值对,以及迭代方式

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.csdn.net/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,也就是有序数据。

发布了57 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/java9832/article/details/105400947
今日推荐