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

 

Java代码   收藏代码
  1. class Apple {  
  2.     private String color;  
  3.     private double weight;  
  4.   
  5.     public Apple(String color, double weight) {  
  6.         this.color = color;  
  7.         this.weight = weight;  
  8.     }  
  9.   
  10.     @Override  
  11.     public String toString() {  
  12.         return "Apple[" + color + "," + weight + "]";  
  13.     }  
  14.   
  15.     @Override  
  16.     public boolean equals(Object obj) {  
  17.         if (this == obj) {  
  18.             return true;  
  19.         }  
  20.         if (obj != null && obj.getClass() == Apple.class) {  
  21.             Apple apple = (Apple) obj;  
  22.             return this.weight == apple.weight  
  23.                     && this.color.equals(apple.color);  
  24.         }  
  25.         return false;  
  26.     }  
  27.   
  28.     @Override  
  29.     public int hashCode() {  
  30.         return color.hashCode() + 13 * (int) weight;  
  31.     }  
  32. }  
  33.   
  34. public class Test {  
  35.   
  36.     public static void main(String[] args) {  
  37.         HashMap<Apple, Double> apples = new HashMap<Apple, Double>();  
  38.         apples.put(new Apple("红色"3.5), 3.4);  
  39.         apples.put(new Apple("红色"4.5), 3.4);  
  40.         apples.put(new Apple("黄色"3.5), 3.4);  
  41.         apples.put(new Apple("红色"3.5), 6.8);//覆盖掉了第一个key  
  42.         System.out.println(apples);  
  43.     }  
  44. }  


举例说明2(TreeMap的使用):

 

 

Java代码   收藏代码
  1. public class Test {  
  2.   
  3.     public static void main(String[] args) {  
  4.         TreeMap<String, Double> score = new TreeMap<String, Double>(  
  5.                 new Comparator<String>() {  
  6.                     @Override  
  7.                     public int compare(String o1, String o2) {  
  8.                         return o1.length() > o2.length() ? 1 : o1.length() < o2  
  9.                                 .length() ? -1 : 0;  
  10.                     }  
  11.                 });  
  12.         score.put("abd"89.0);  
  13.         score.put("aaaa"78.0);  
  14.         score.put("aa"90.0);  
  15.         score.put("ds"78.0);  
  16.         System.out.println(score.size());  
  17.         System.out.println(score);  
  18.     }  
  19. }  


结束语

 

通过上一篇的学习,我们可以发现其实Set和Map用法几乎是一样的,把Map看成是Collection子接口Set的一个分支即可。

今天就讲到这里,明天开始学习Java的异常处理进制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值