快捷搜索:

HashMap与TreeMap的应用与区别

Java中有许多封装好的数据结构类,比如List,ArrayList,Set,Map,Collection等,它们各自有各自的特点,其中,Map是属于键值对的集合,它提供key到value的映射,能够通过键来找到相应的值。一个Map中不能包含相同的key,每个key只能映射一个 value。本文主要针对其中两种经典常用的Map集合HashMap&TreeMap

HashMap的使用:

//初始化一个map集合
Map<String,String> map = new HashMap<String,String>();
//存入数据
map.put("aaa", "aaa");
map.put("bbb", "bbb");
map.put("fff", "fff");
map.put("mmm", "mmm");
map.put("ggg", "ggg");
map.put("sss", "sss");

可以看到,初始化的时候,<Integer,String>传入两种类型,分别对应键和值的类型,然后通过put()方法将一条条数据加入到集合中,注意键和值的类型要与初始化的时候的类型一致。

既然存了东西,我们就要来使用它,以下是遍历集合中所有的数据:

Iterator iterator = map.keySet().iterator();
while(iterator.hasNext()){
	String key = (String)iterator.next();
	System.out.println(map.get(key));
}

可以看到,通过map.keySet()返回了这个map中的所有键的集合,然后通过调用iterator()返回一个迭代器,使用该迭代器的hasNext()进行判断,如果还有下一个就将其键取出,并通过map的get()方法,通过映射将对应的值找出,即可实现逐一访问map中的每一个元素。

打印结果:

TreeMap的使用:

基本的用法与HashMap相似,代码如下:

public class MapTest {
	
	public static void main(String[] args) {
		//初始化一个map集合
		Map<String,String> map = new TreeMap<String,String>();
		//存入数据
		map.put("aaa", "aaa");
		map.put("bbb", "bbb");
		map.put("fff", "fff");
		map.put("mmm", "mmm");
		map.put("ggg", "ggg");
		map.put("sss", "sss");
		//遍历输出
		Iterator iterator = map.keySet().iterator();
		while(iterator.hasNext()){
			String key = (String)iterator.next();
			System.out.println(map.get(key));
		}
	}

}


打印结果:

HashMap与TreeMap的区别:

观察上面的打印结果,可以发现,两者虽然存入相同的数据,可是遍历出来的结果却完全不一样,注意到TreeMap的结果是按照字母表的顺序进行存储的,HashMap则没有,故在实际开发中,如果数据需要按照一定的顺序进行存储,可以使用TreeMap。
TreeMap是SortedMap接口基于红黑树的实现,该类保证了映射按照升序排列关键字。HashMap是根据键的HashCode 值存储数据,取得数据的顺序是完全随机的,HashMap取值的速度更快。

你可能会问,TreeMap中默认是按照升序进行排序的,那如果要让它降序排序呢? 可以通过自定义的比较器来进行设置:

1.首先,定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是: 如果参数字符串等于此字符串,则返回 0 值; 如果此字符串小于字符串参数,则返回一个小于 0 的值; 如果此字符串大于字符串参数,则返回一个大于 0 的值。

我们可以通过改写成如下:

static class MyComparator implements Comparator{
	@Override
	public int compare(Object o1, Object o2) {
		// TODO Auto-generated method stub
		String param1 = (String)o1;
		String param2 = (String)o2;
		return -param1.compareTo(param2);
	}	
}

在返回时多添加了个负号,就将比较的结果以相反的形式返回。

2.通过MyComparator类初始化一个比较器实例,将其作为参数传进TreeMap的构造方法中:

MyComparator comparator = new MyComparator();

Map<String,String> map = new TreeMap<String,String>(comparator);

设置完成之后,这个map就会按照我们自定义的比较方式来进行排序了。 完整代码如下:

/**
 * @author ZJYANG
 * TreeMap的使用
 */
public class MapTest {
	
	public static void main(String[] args) {
		//初始化自定义比较器
		MyComparator comparator = new MyComparator();
		//初始化一个map集合
		Map<String,String> map = new TreeMap<String,String>(comparator);
		//存入数据
		map.put("aaa", "aaa");
		map.put("bbb", "bbb");
		map.put("fff", "fff");
		map.put("mmm", "mmm");
		map.put("ggg", "ggg");
		map.put("sss", "sss");
		//遍历输出
		Iterator iterator = map.keySet().iterator();
		while(iterator.hasNext()){
			String key = (String)iterator.next();
			System.out.println(map.get(key));
		}
	}
	
	static class MyComparator implements Comparator{

		@Override
		public int compare(Object o1, Object o2) {
			// TODO Auto-generated method stub
			String param1 = (String)o1;
			String param2 = (String)o2;
			return -param1.compareTo(param2);
		}
		
	}

}


运行结果: 可以看到,顺序已经是按照降序进行排序。熟练地运用这些Map可在实际开发中大大提高我们的效率。

经验分享 程序员 职场和发展