1. 程式人生 > >TreeMap使用和底層原理_Comparable介面_HashTable特點

TreeMap使用和底層原理_Comparable介面_HashTable特點

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]--張三是一個好傢伙