- 是一個(gè)有序的鍵值對(duì)集合
- 基于紅黑樹理論
- 異步線程
- 有序根據(jù)鍵的順序排序(升序)假夺,如數(shù)字或String類型姐帚,或者根據(jù)創(chuàng)建時(shí)放入的比較器(Comparator)進(jìn)行排序
構(gòu)造函數(shù)
1 默認(rèn)構(gòu)造函數(shù)
使用默認(rèn)構(gòu)造函數(shù)構(gòu)造TreeMap時(shí),使用java的默認(rèn)的比較器比較Key的大小氯夷,從而對(duì)TreeMap進(jìn)行排序边器。
public TreeMap() {
comparator = null;
}
2 帶比較器的構(gòu)造函數(shù)
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
3 帶Map的構(gòu)造函數(shù),Map會(huì)成為TreeMap的子集
public TreeMap(Map<? extends K, ? extends V> m) {
comparator = null;
putAll(m);
}
4 帶SortedMap的構(gòu)造函數(shù)筛严,SortedMap會(huì)成為TreeMap的子集
public TreeMap(SortedMap<K, ? extends V> m) {
comparator = m.comparator();
try {
buildFromSorted(m.size(), m.entrySet().iterator(), null, null);
} catch (java.io.IOException cannotHappen) {
} catch (ClassNotFoundException cannotHappen) {
}
}
常用方法
增
-
V
**put**(K key, V value)
按照一定順序向Map中增加元素 -
void
**putAll**(Map<? extends K,? extends V> map)
將所有映射復(fù)制到此集合中
刪除
-
void
**clear**()
從此映射中刪除所有映射 -
V
**remove**(Object key)
如果存在醉旦,則從此Map中刪除此鍵的值
判斷
-
boolean
**isEmpty**
判斷此Map是否為空
獲取
-
v
**get**
() -
int
**size**()
返回此Map中鍵 - 值映射的數(shù)量-
boolean
**containsValue**(Object value)
如果包含其值,返回true
-
-
boolean
**containsKey**(Object key)
如果包含此鍵,則返回true
-
V
**get**(Object key)
返回鍵對(duì)應(yīng)的值车胡,否則返回null
-
Set<K>
**keySet**()
返回一個(gè)包含所有鍵的Set
-
Set<Map.Entry<K,V>>
**entrySet**()
返回一個(gè)包含所有映射關(guān)系的特殊的類型檬输,Map.Entry
例子
package model.collection_map;
import java.util.Comparator;
import java.util.TreeMap;
//需求:Teacher2類具有姓名、年齡的屬性匈棘,同時(shí)有其歸屬地(不作為屬性)
class TeacherCompare implements Comparator<Teacher2>{
@Override
public int compare(Teacher2 o1, Teacher2 o2) {
int num = o1.getName().compareTo(o2.getName());
if(num==0){
return (new Integer(o1.getAge()).compareTo(new Integer(o1.getAge())));
}return num;
}
}
//將老師存儲(chǔ)進(jìn)TreeMap,不是按照Teacher2自帶的比較順序丧慈,而是按照姓名順序排序
public class TreeMapDemo1 {
public static void main(String[] args) {
TreeMap<Teacher2,String> treeMap1 = new TreeMap<>();
TreeMap<Teacher2,String> treeMap2 = new TreeMap<>(new TeacherCompare());
treeMap1.put(new Teacher2("abc",21),"北京");
treeMap1.put(new Teacher2("bcd",22),"北京");
treeMap1.put(new Teacher2("aca",23),"北京");
treeMap1.put(new Teacher2("bac",24),"北京");
System.out.println("沒有改變前:"+treeMap1);
treeMap2.put(new Teacher2("abc",21),"北京");
treeMap2.put(new Teacher2("bcd",22),"北京");
treeMap2.put(new Teacher2("aca",23),"北京");
treeMap2.put(new Teacher2("bac",24),"北京");
System.out.println("改變后:"+treeMap2);
}
}
class Teacher2 implements Comparable<Teacher2> {
protected String name;
protected int age;
public Teacher2(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
return this.name.hashCode() + this.age * 33;
}//重構(gòu)hashCode以獲得獨(dú)特地址值
@Override
public boolean equals(Object object) {
if (!(object instanceof Teacher2)) {
return false;
}
Teacher2 teacher = (Teacher2) object;
return (teacher.name.equals(this.name)) && (teacher.age == this.age);
}//重構(gòu)hashCode必須重構(gòu)equals方法,因?yàn)閔ashCode會(huì)調(diào)用equals方法
@Override
public String toString() {
return "[name:" + name + ",age:" + age+"]";
}
@Override
public int compareTo(Teacher2 t) {
int num = new Integer(this.age).compareTo(new Integer(t.age));
if (num == 0) {
return this.name.compareTo(t.name);
}
return num;
}//equals方法會(huì)調(diào)用compareTo方法羹饰,為避免輸入類型不對(duì)而拋異常伊滋,需要重構(gòu)compareTo
}
輸出結(jié)果
沒有改變前:{[name:abc,age:21]=北京, [name:bcd,age:22]=北京, [name:aca,age:23]=北京, [name:bac,age:24]=北京}
改變后:{[name:abc,age:21]=北京, [name:aca,age:23]=北京, [name:bac,age:24]=北京, [name:bcd,age:22]=北京}