Map接口有HashTable、HashMap及TreeMap实现类
HashMap内部为数组+链表的形式,首先根据key值计算出hashCode,再使用Hash算法计算(如hashCode%数组长度,也可以使用hashCode&(数组长度-1),两种方法的效果一样——前提是第二个方法的数组长度必须是2的整数次幂)出存放在数组哪个位置,如果数组该位置已经存放有元素,则将以链表形式继续存放。当链表长度大于8之后,将转为红黑树的结构。
TreeMap为红黑树的一种具体实现。
import java.util.Map;
import java.util.TreeMap;
public class TestTreeMap {
public static void main(String[] args) {
Map<Integer, String> treemap1 = new TreeMap<>();
treemap1.put(20, "aa");
treemap1.put(3, "bb");
treemap1.put(6, "cc");
/**
* 结果为:
* 3=============bb
* 6=============cc
* 20=============aa
* 可以看出TreeMap是有序(通过Comparable接口的compareTo方法)的,而HashMap是无序的
*/
for (int key : treemap1.keySet()) {
System.out.println(key + "=============" + treemap1.get(key));
}
Map<Emp, String> treemap2 = new TreeMap<>();
treemap2.put(new Emp(100, "123", 10000), "123");
treemap2.put(new Emp(200, "456", 20000), "456");
treemap2.put(new Emp(300, "789", 15000), "789");
for (Emp emp : treemap2.keySet()) {
System.out.println(emp.id + "============" + treemap2.get(emp));
}
}
}
class Emp implements Comparable<Emp> {
int id;
String name;
double salary;
public Emp(int id, String name, double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
/**
* 当前对象与o比较
*
* @param o
* @return 负数代表小于,0代表等于,正数代表大于
*/
@Override
public int compareTo(Emp o) {
if (this.salary > o.salary) {
return 1;
} else if (this.salary < o.salary) {
return -1;
} else {
return 0;
}
}
}
HashMap线程不安全,效率高,允许key或者value为null
HashTable线程安全,效率低,不允许key或者value为null
网友评论