首先介绍一下什么是Map。在数组中咱们是经过数组下标来对其内容索引的,而在Map中咱们经过对象来对对象进行索引,用来索引的对象叫作key,其对应的对象叫作value。这就是咱们平时说的键值对。html
HashMap经过hashcode对其内容进行快速查找,而 TreeMap中全部的元素都保持着某种固定的顺序,若是你须要获得一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。java
HashMap 非线程安全 TreeMap 非线程安全数组
线程安全安全
在Java里,线程安全通常体如今两个方面:数据结构
一、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体如今关键字synchronized。如ArrayList和Vector,HashMap和Hashtabledom
(后者每一个方法前都有synchronized关键字)。若是你在interator一个List对象时,其它线程remove一个element,问题就出现了。函数
二、每一个线程都有本身的字段,而不会在多个线程之间共享。它主要体如今java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。性能
1.AbstractMap抽象类和SortedMap接口测试
AbstractMap抽象类:(HashMap继承AbstractMap)覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。若是两个映射大小相等、包含一样的键且每一个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每一个元素是Map.Entry接口的一个实现。所以,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。优化
SortedMap接口:(TreeMap继承自SortedMap)它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是做用于映射的键之外,处理SortedMap和处理SortedSet同样。添加到SortedMap实现类的元素必须实现Comparable接口,不然您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的惟一一份实现。
2.两种常规Map实现
HashMap:基于哈希表实现。使用HashMap要求添加的键类明肯定义了hashCode()和equals()[能够重写hashCode()和equals()],为了优化HashMap空间的使用,您能够调优初始容量和负载因子。
(1)HashMap(): 构建一个空的哈希映像
(2)HashMap(Map m): 构建一个哈希映像,而且添加映像m的全部映射
(3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
(4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
TreeMap:基于红黑树实现。TreeMap没有调优选项,由于该树总处于平衡状态。
(1)TreeMap():构建一个空的映像树
(2)TreeMap(Map m): 构建一个映像树,而且添加映像m中全部元素
(3)TreeMap(Comparator c): 构建一个映像树,而且使用特定的比较器对关键字进行排序
(4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中全部映射,而且使用与有序映像s相同的比较器排序
3.两种常规Map性能
HashMap:适用于在Map中插入、删除和定位元素。
Treemap:适用于按天然顺序或自定义顺序遍历键(key)。
4.总结
HashMap一般比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在须要排序的Map时候才用TreeMap。
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class HashMaps {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
map.put("d", "ddd");
Iterator<String> iterator = map.keySet()。iterator();
while (iterator.hasNext()) {
Object key = iterator.next();
System.out.println("map.get(key) is :" + map.get(key));
}
// 定义HashTable,用来测试
Hashtable<String, String> tab = new Hashtable<String, String>();
tab.put("a", "aaa");
tab.put("b", "bbb");
tab.put("c", "ccc");
tab.put("d", "ddd");
Iterator<String> iterator_1 = tab.keySet()。iterator();
while (iterator_1.hasNext()) {
Object key = iterator_1.next();
System.out.println("tab.get(key) is :" + tab.get(key));
}
TreeMap<String, String> tmp = new TreeMap<String, String>();
tmp.put("a", "aaa");
tmp.put("b", "bbb");
tmp.put("c", "ccc");
tmp.put("d", "cdc");
Iterator<String> iterator_2 = tmp.keySet()。iterator();
while (iterator_2.hasNext()) {
Object key = iterator_2.next();
System.out.println("tmp.get(key) is :" + tmp.get(key));
}
}
}
运行结果以下:
map.get(key) is :ddd
map.get(key) is :bbb
map.get(key) is :ccc
map.get(key) is :aaa
tab.get(key) is :bbb
tab.get(key) is :aaa
tab.get(key) is :ddd
tab.get(key) is :ccc
tmp.get(key) is :aaa
tmp.get(key) is :bbb
tmp.get(key) is :ccc
tmp.get(key) is :cdc武汉仁济中西医结合医院
HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。
下面就要进入本文的主题了。先举个例子说明一下怎样使用HashMap:
import java.util.*;
public class Exp1 {
public static void main(String[] args){
HashMap h1=new HashMap();
Random r1=new Random();
for (int i=0;i<1000;i++){
Integer t=new Integer(r1.nextInt(20));
if (h1.containsKey(t))
((Ctime)h1.get(t))。count++;
else
h1.put(t, new Ctime());
}
System.out.println(h1);
}
}
class Ctime{
int count=1;
public String toString(){
return Integer.toString(count);
}