Map集合

Map集合与liat、set集合不同,collection接口

键值对:键不同,值可相同

扩容:初始容量16,负载因子0.75,扩容增量1倍

遍历:
先获取所有键的Set集合,再遍历(通过键获取值)
取出保存所有Entry的Set,再遍历此Set即可

private Map<String, Object> map=new HashMap();
	@Before
	public void map1() {
		map.put("1", "哈哈哈");
		map.put("1", "点点");
		map.put("2", "时尚");
		map.put("3", "啦啦啦");
		map.putIfAbsent("1", "ccc");//如果没有1号,就将它变为1号
	}

 可以看出体现了同键覆盖

@Test
	public void test01() {
		Iterator<String> it = map.keySet().iterator();//获取键的集合
		while(it.hasNext()) {
			String key=it.next();//拿到键
			System.out.println(map.get(key));//通过键拿值
		}
	}

 

entrySet  同时获得键(key)和值(value)   

效率高于第一种

@Test
	public void test02() {
		Iterator<Entry<String, Object>> it = map.entrySet().iterator();//entrySet同时拿到key,value
		while(it.hasNext()) {
			Entry<String, Object> e = it.next();
			System.out.println(e.getKey()+"--"+e.getValue());
		}
	}

HasMap

线程不安全(成员变量时),最常用,速度快

内部采用数组来存放数据

基本原理:

 往HasMap里放元素

jdk8之前:

在jdk8之前,map有16位,每个填加的元素找到自己的位置,桶内没有元素就加入,有元素时就将桶内的元素挤下去,形成链表。它的基础是数组,主要原因是数组查找数据快。

jdk8时:

 

jdk8时,在每个桶多加了一个判断,当生成的节点超过8个时就采用红黑树来进行数据查找,大大提高了查找速度

红黑树:

大于中间值的在右,小于中间值的在左 

链表转红黑树的阈值是8

红黑树转链表的阈值是6

转链表的阈值为6,因为hash碰撞在8附近,阈值在8附近时容易造成链表和红黑树频繁转换

HashTable和ConcurrentHashMap

hashTable代码(线程安全,不太常用,每一位就相当于一个桶,由一把锁控制)

@Test
	public void test03() {
		Map<Integer, Object> map=new Hashtable();
		map.put(1, "dd");
		map.put(2, "zz");
		map.put(3, "ss");
		map.put(4, "ll");
		Iterator<Integer> it = map.keySet().iterator();
		while(it.hasNext()) {
			Integer key = it.next();
			System.out.println(map.get(key));
		}
	}

ConcurrentHashMap(线程安全,比HashTable性能高)

一桶一锁提高了性能,加上cas(Compare-and-Swap),比较替换,即乐观锁

@Test
	public void test04() {
		Map<Integer, Object> map=new ConcurrentHashMap();
		map.put(1, "dd");
		map.put(2, "zz");
		map.put(3, "ss");
		map.put(4, "ll");
		Iterator<Integer> it = map.keySet().iterator();
		while(it.hasNext()) {
			Integer key = it.next();
			System.out.println(map.get(key));
		}

TreeMap
 key值按一定的顺序排序
 添加或获取元素时性能较HashMap慢
 因为需求维护内部的红黑树,用于保证key值的顺序 

TreeMap的有序化

@Test
	public void test05() {
		TreeMap<Integer, Object> tmap=new TreeMap(new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				
				return o2-o1;
			}
		});
		tmap.put(1, "dd1");
		tmap.put(4, "zz4");
		tmap.put(2, "ss2");
		tmap.put(3, "ll3");
		Iterator<Integer> it = tmap.keySet().iterator();
		while(it.hasNext()) {
			Integer key = it.next();
			System.out.println(tmap.get(key));
		}
	}

LinkedHashMap
继承HashMap
LinkedHashMap是有序的,且默认为插入顺序
当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了
    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值