您的位置:首页 > 编程语言 > Java开发

Java学习系列(八)Java面向对象之集合框架详解(下)

2014-04-25 11:22 507 查看
今天接着上次的来讲,主要谈谈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的使用):

Java代码



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的使用):

Java代码



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的异常处理进制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: