Java学习系列(八)Java面向对象之集合框架详解(下)
今天接着上次的来讲,主要谈谈Map。下面先看一张图:
Map里面存的东西是:每个数据项都是key-value对组成。假如我们把value当成是key的“附属物”,Map存储key-value对时,只要考虑key的存储即可,key存储之后,value跟着key即可。再进一步:如果只管Map里面的key,并把所有的key收集起来 —– 就变成了Set。所以Map与Set是一一对应的。通过查看源码我们可以发现,HashSet底层是由HashMap实现的。HashMap会根据key的hashCode()方法的返回值来计算key的存、取位置。
HashMap怎样才算两个key重复?
a)通过equals方法比较返回tue;
b)两个key的hashCode()返回值相等。
要求自定义类的hashCode()和equals()方法是一致的(即方法中所用到的关键属性要一致)。
TreeMap要求key必须是可比较大小的。
a)自然排序:要求所有的key实现Comparable接口;
b)定制排序:要求创建TreeMap时提供一个Comparator接口。
TreeMap怎样才算两个key重复?
a)通过compareTo()比较大小时返回0,就表明两个元素相等。
Hashtable与HashMap的区别:
a.Hashtable从JDK1.0就有的,尽量少用。
b.Hashtable不允许使用null作为key、value,但HashMap允许。
c.Hashtable是线程安全的。–线程不安全的性能好。
举例说明1(HashMap的使用):
class Apple { private String color; private double weight; public Apple(String color, double weight) { this.color = color; this.weight = weight; } @Override public String toString() { return "Apple[" + color + "," + weight + "]"; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj != null && obj.getClass() == Apple.class) { Apple apple = (Apple) obj; return this.weight == apple.weight && this.color.equals(apple.color); } return false; } @Override public int hashCode() { return color.hashCode() + 13 * (int) weight; } } public class Test { public static void main(String[] args) { HashMap<Apple, Double> apples = new HashMap<Apple, Double>(); apples.put(new Apple("红色", 3.5), 3.4); apples.put(new Apple("红色", 4.5), 3.4); apples.put(new Apple("黄色", 3.5), 3.4); apples.put(new Apple("红色", 3.5), 6.8);//覆盖掉了第一个key System.out.println(apples); } }
举例说明2(TreeMap的使用):
public class Test { public static void main(String[] args) { TreeMap<String, Double> score = new TreeMap<String, Double>( new Comparator<String>() { @Override public int compare(String o1, String o2) { return o1.length() > o2.length() ? 1 : o1.length() < o2 .length() ? -1 : 0; } }); score.put("abd", 89.0); score.put("aaaa", 78.0); score.put("aa", 90.0); score.put("ds", 78.0); System.out.println(score.size()); System.out.println(score); } }
结束语
通过上一篇的学习,我们可以发现其实Set和Map用法几乎是一样的,把Map看成是Collection子接口Set的一个分支即可。
今天就讲到这里,明天开始学习Java的异常处理进制。