Java集合(二)

一.概述

上一篇学习了Collection接口的具体集合,平常使用最多的就是ArrayList,一般对于初学者也不太会顾及效率而言,能完成就好。不过这几基本的集合是要理解一下他们的用法,对于以后的发展来说,我认为还是很有必要的,甚至要明白原理实现等等。Java集合(一)
这一篇学习映射类集合。首先先一起了解下映射类Map接口的继承关系。
Map接口继承关系
前面学习的集合,对于查询来说只有获取到某个元素的下标或者循环遍历查找。通常,我们只知道某些键的信息,并想要查找与之对应的元素。映射数据结构就是这么设计的。

二.具体集合

1.HashMap和treeMap
/**
 * map实例
 */
public class MapDemo {
	public static void main(String[] args) {
		// hashMap 在创建的时候建议给个默认值 16减少在散列的效率
		Map<String,String> hashMap = new HashMap<>(16);
		hashMap.put("1","one");
		hashMap.put("2","two");
		System.out.println(hashMap);
		// 移除对应的key/value
		hashMap.remove("1");
		hashMap.put("3","three");
		System.out.println(hashMap.get("2"));
		// Java8出现的lambd表达式遍历map集合
		hashMap.forEach((k,v) ->
				System.out.println("key=" + k + ",value=" + v));
		// 获取到key用对应的值,没有使用默认值
		System.out.println(hashMap.getOrDefault("1", "one"));


		// treeMap 树集的基本使用
		Map<String,String> treeMap = new TreeMap<>();
		treeMap.put("3","three");
		treeMap.put("1","one");
		treeMap.put("2","two");
		// 打印出有顺序的集合
		System.out.println(treeMap);

		// 使用构造器可以添加一个比较器 对key值采取自定义 比较方法
		Map<String,String> treeMaps = new TreeMap<>((o1, o2) -> 0);

	}
}
2.更新映射项
		// 统计一个word单词出现的频率
		Map<String,Integer> hashMap1 = new HashMap<>(16);
		
		// 问题:当这个键所指向的值为null时就会出现异常
		hashMap1.put("word",hashMap1.get("word") + 1);
		// 解决方法1:当获取键为null时,赋值为一个默认值
		hashMap1.put("word",hashMap1.getOrDefault("word",0) + 1);
		// 解决方法2:先调用此方法,只有放键存在时,就会赋值。在调用get方法
		hashMap1.putIfAbsent("word",0);
		// 解决方法3:如果键不存在将键的值与1关联,否则将原值和1求和
		hashMap1.merge("word",1,Integer::sum);
3.映射视图

一共有三种视图:键集,值集,键/值对集。不能在视图中使用add方法,否则会抛出异常。

		// 三种视图
		// 键集:keySet不是一个hashSet和treeSet集合
		Set<String> keySet = hashMap.keySet();
		// 打印出所有key值
		for (String s : keySet) {
			System.out.println(s);
		}
		// 值集
		Collection<String> values = hashMap.values();
		// 打印所有values
		for (String value : values) {
			System.out.println(value);
		}
		// 键/值对集:推荐使用这个方法来遍历map集合,Java8以后可以使用lambda表达式来进行遍历
		Set<Map.Entry<String, String>> entrySet = hashMap.entrySet();
		for (Map.Entry<String, String> entry : entrySet) {
			// 获取键值
			String key = entry.getKey();
			// 获取值集
			String value = entry.getValue();
		}

三.视图与包装器

比如刚才获取的keySet就是一个视图,通过对keySet集合的操作将改变原hashMap集合,这种集合被称作视图。

1.轻量级集合包装器
		String[] strs = new String[10];
		// 虽然通过方法将数组转变为list集合,但不能对其进行改变数组大小的任何方法。
		// 这样做的目的只是减少了创建集合的开销,存储代价小。
		List<String> list = Arrays.asList(strs);
2.子范围
		List<String> list1 = new ArrayList<>();
		// 获取集合的部分集合,对此集合的操作也会影响原集合。
		list1.subList(0,1);
3.不可修改的视图
		// 生成一个不可更改的视图,只能用来查看
		List<String> list2 = Collections.unmodifiableList(list1);
4.同步视图
		// 生成的map为同步map对此集合使用的所有操作都将是同步的
		Map<String,String> map = Collections.synchronizedMap(new HashMap<>());
5.受查视图
		// 这个时候不会抛出异常,因为没有泛型的时候可以插入一个Object对象
		ArrayList<String> strings = new ArrayList<>();
		ArrayList rawList = strings;
		rawList.add(new Date());
		// 生成一个受查视图,这是在运行的时候就会检测到赋值问题
		List<String> safeStrings = Collections.checkedList(strings,String.class);
		List rawList1 = safeStrings;
		rawList1.add(new Date());

四.总结

这一篇学习了映射类集合用的最多的就是HashMap映射集合。主要还是以基本使用为主,源码级别的还需时间久了慢慢积累也是我需要学习的地方。
下一篇学习并发,这部分主要就是线程方面的基本使用。
有些可能我理解的不够深刻,大家如果觉得我说的不够详细可以参考我的推荐书,详细的看一下。欢迎大家评论。第一时间我会回复大家。谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值