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

版权声明:本文为jave-lover原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jave-lover/p/3589754.html