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$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内部类的实现上。
正是由于values()方法没有将Map中的value重新组合成一个包含元素的集合对象,就可以降低系统的内存开销。
2、2 List集合与Map集合的关系
从底层实现来看,Set集合和Map集合很类似;从用法的角度来看,List集合和Map集合也有很多类似的地方。
- Map接口提供了get(K key)方法,允许Map对象根据key来取得对应的value。
- List接口提供了get(int index)方法,允许List对象根据元素索引index来取得对应的value。
即可以说List相当于所有key都是int类型的Map,也可以说Map是相当于索引是任意类型的List。