TreeMap是红黑二叉树的典型实现,我们打开TreeMap的源代码,发现里面有一行核心代码:
root用来存储整树的根节点。我们继续跟踪Entry(是TreeMap的内部类)的代码:(jdk1.6),1.8版本中为Node,
TreeMap 和 HashMap 实现了同样的 Map接口,,用法对于调用者没有什么区别,HashMap 的效率高于 TreeMap,在需要排序的Map 采用到 TreeMap
package com.jianshun;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.Callable;
/**
* 测试TreeMap的使用
* @author Administrator
*
*/
public class TestTreeMap {
public static void main(String[] args) {
Map<Integer,String> treemap1 = new TreeMap<Integer,String>();
treemap1.put(20, "aa");
treemap1.put(3, "bb");
treemap1.put(6, "cc");
//按照KEY递增的方式排序
for(Integer key : treemap1.keySet()){
System.out.println(key+"--"+treemap1.get(key));
}
Map<Emp,String> treemap2 = new TreeMap<Emp,String>();
treemap2.put(new Emp(100, "张三",50000),"张三是一个好家伙");
treemap2.put(new Emp(200 ,"李四",5000), "李四工作不积极");
treemap2.put(new Emp(150,"王五",6000), "王五工作还不错");
treemap2.put(new Emp(50,"赵六",6000), "赵六工作还不错");
//按照KEY递增的方式排序
for(Emp key : treemap2.keySet()){
System.out.println(key+"--"+treemap2.get(key));
}
}
}
//当key是一个自定义对象时;
class Emp implements Comparable<Emp>{
int id;
String name;
double salary;
public Emp(int id, String name, double salary) {
super();
this.id = id;
this.name = name;
this.salary = salary;
}
public int compareTo(Emp o) {//负数:小于,0:等于,整数:大于
if(this.salary > o.salary){
return 1;
}else if(this.salary < o.salary){
return -1;
}else{// salary相等在比较id
if(this.id > o.id){
return 1;
}else if(this.id < o.id){
return -1;
}else{
return 0;
}
}
}
@Override
public String toString() {
return "Emp [id=" + id + ", name=" + name + ", salary=" + salary + "]";
}
}
// Emp [id=200, name=李四, salary=5000.0]--李四工作不积极
// Emp [id=50, name=赵六, salary=6000.0]--赵六工作还不错
// Emp [id=150, name=王五, salary=6000.0]--王五工作还不错
// Emp [id=100, name=张三, salary=50000.0]--张三是一个好家伙
HashMap 和 HashTable 的用法几乎一样,底层实现几乎一样,只不过HashTable 的方法添加了synchronized 关键字确保线程同步检查,效率较低。
HashMap 和 HashMap 的区别:
1:HashMap:线程不安全,效率高,允许 key 或者 value 为 null,
2:HashMap:线程安全,效率低。不允许 key 或者 value 为 null。