常见Java集合实现细节——List集合与Map集合

2、 List集合与Map集合

2、1 Map的values()方法

       Map集合是一个关联数组,它包含两组值:一组是所有key组成的集合,因为Map集合的key不允许重复,而且Map不会保存key加入的顺序,因此这些key可以组成一个Set集合;另外一组是value组成的集合,因为Map集合value完全可以重复,而且Map可以根据key来获取对应的value,所以这些value可以组成一个List集合。

import java.util.HashMap;
import java.util.TreeMap;

public class MapValueTest {
	public static void main(String[] args) {
		HashMap<String , Double> scores = new HashMap<>();
		scores.put("语文", 85.5);
		scores.put("数学", 68.5);
		scores.put("英语", 76.3);
		System.out.println(scores.values());
		System.out.println(scores.values().getClass());
		
		TreeMap<String , Double> person = new TreeMap<>();
		person.put("身高", 180.2);
		person.put("体重", 70.2);
		System.out.println(person.values());
		System.out.println(person.values().getClass());
	}
}

输出结果为:
[85.5, 76.3, 68.5]
class java.util.HashMap$Values
[70.2, 180.2]
class java.util.TreeMap$Values
       从结果可以看出,HashMap和TreeMap两个集合的values()方法返回值确实包含了Map中所有value的集合,但是并不是List对象,而是HashMap$Values对象和TreeMap$Values对象。

//HashMap源代码中的values()方法
public Collection<V> values() {
    Collection<V> vs = values;
    return (vs != null ? vs : (values = new Values()));
}
//TreeMap源代码中的values()方法
public Collection<V> values() {
    Collection<V> vs = values;
    return (vs != null) ? vs : (values = new Values());
}

       从上面HashMap和TreeMap类中的values()方法的实现完全相同。当程序第一次调用这两个Map对象的values()方法时,它们会创建一个Values对象,并将该Values对象赋给values实例变量;当程序下次调用values()方法时,将直接以values实例变量作为返回值。由此可得,它们的values()方法返回值的区别主要体现在各自Values内部类的实现上。

       从深入分析HashMap和TreeMap的源代码可以归纳得出:不管是HashMap还是TreeMap,它们的values()方法都可以返回其所有value组成的Collection集合。按照通常理解,这个Collection集合应该是一个List集合,因为Map的多个value允许重复。但实际上,这两个Map对象的values()方法返回的是一个不存储元素的Collection集合,当程序遍历该集合时,实际上就是遍历Map对象的value。正是由于values()方法没有将Map中的value重新组合成一个包含元素的集合对象,就可以降低系统的内存开销。

2、2 List集合与Map集合的关系

       底层实现来看,Set集合和Map集合很类似;从用法的角度来看,List集合和Map集合也有很多类似的地方。

  1. Map接口提供了get(K key)方法,允许Map对象根据key来取得对应的value。
  2. List接口提供了get(int index)方法,允许List对象根据元素索引index来取得对应的value。

       即可以说List相当于所有key都是int类型的Map,也可以说Map是相当于索引是任意类型的List。



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值