今天接着上次的来讲,主要谈谈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的异常处理进制。