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

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值