1. 程式人生 > >5.3Map介面、HashMap、TreeMap

5.3Map介面、HashMap、TreeMap

Map
    |--HashMap  地層是雜湊表  可以使用null鍵和null值  執行緒不同步 效率高
                保證元素的唯一性:元素的hashCode方法(先)和equals方法(後)
    |--TreeMap  底層是紅黑樹結構 執行緒不同步 可以給Map集合中的鍵進行排序
                保證元素唯一性:compareTo方法return0

                排序的第一種方式:元素具備比較性  元素實現comparable介面,重寫compareTo方法
                排序的第二種方式:集合具備比較性(元素不具備比較性或者具備的比較性不是所需要的)
                                構造一個包含比較器的TreeSet  TreeSet(Comparator<? super E> comparator)
                兩種比較方式都存在時,以Comparator為準
    |--HashTable 底層是雜湊表,不可以存入null鍵和null值  執行緒同步 效率低(基本被HashMap取代)

Map介面

Interface Map<K,V> 用來儲存鍵值對,要保證鍵的唯一性,而且操作都是針對鍵操作的,跟值無關

常用方法

    //新增
    put(K key, V value) 
    putAll(Map<? extends K,? extends V> t) 

    //刪除
    clear()
    remove(Object key)

    //判斷
    containsValue(Object value)
    containKey(Object key)
    is Empty()

    //獲取
    get(Object key)
    size()
    values()

    keySet
    entrySet

demo:

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class TestMap {
	public static void main(String[] args) {
		Map<Integer,String> m = new HashMap<Integer,String>();
		
		//新增元素
		m.put(1, "chen1");
		m.put(2, "chen2");
		m.put(3, "chen3");
		m.put(4, "chen4");
		System.out.println(m);  //{1=chen1, 2=chen2, 3=chen3, 4=chen4}
		
		//判斷
		System.out.println(m.containsValue("chen1"));  //true
		System.out.println(m.containsKey(2));  //true
		System.out.println(m.isEmpty());  //false
		
		//刪除
		m.remove(1);
		System.out.println(m);  //{2=chen2, 3=chen3, 4=chen4}
		
		//獲取
		System.out.println(m.get(4));  //chen4
		System.out.println(m.size());  //3
		
		Collection<String> al = m.values();
		for(Iterator<String> it = al.iterator();it.hasNext();) {
			System.out.println(it.next());
		}
		//chen2
		//chen3
		//chen4
	}
}

Map集合元素取出:

keySet:

將Map集合中的鍵返回到Set集合中,然後利用Set集合的迭代器,和get()方法獲取每一個鍵對應的值

entrySet:

呼叫entrySet方法將鍵返回Set<Map.Entry<K,V>>集合,資料型別就是Map.Entry 再利用Map.Entry物件(Map.Entry是個介面,HashMap內部實現後返回Map.Entry物件)的getKey getValue取出鍵和值

Map是個介面,Entry是Map的內部介面。

demo:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class TestMap {
	public static void main(String[] args) {
		Map<Integer,String> m = new HashMap<Integer,String>();
		
		//新增元素
		m.put(1, "chen1");
		m.put(2, "chen2");
		m.put(3, "chen3");
		m.put(4, "chen4");
		System.out.println(m);  //{1=chen1, 2=chen2, 3=chen3, 4=chen4}
		
		//Map集合取出方式
		//keySet方式:呼叫keySet方法將鍵返回Set<>集合,再利用Set集合
		//的迭代器和get方法獲得鍵所對應的值
		Set<Integer> s = m.keySet();
		for(Iterator<Integer> it = s.iterator();it.hasNext();) {
			Integer key = it.next();
			System.out.println(m.get(key));
		}
		
		//entrySet方式:呼叫entrySet方法將鍵返回Set<Map.Entry<K,V>>集合,
		//資料型別就是Map.Entry 再利用Map.Entry介面的getKey getValue取出鍵和值
		
		Set<Map.Entry<Integer, String>> s1 = m.entrySet();
		
		for(Iterator<Map.Entry<Integer, String>> it = s1.iterator();it.hasNext();) {
			Map.Entry<Integer, String> me = it.next();
			
			Integer key = me.getKey();
			String value = me.getValue();
			
			System.out.println(key+"  "+value);
		}
	}
}
/*
{1=chen1, 2=chen2, 3=chen3, 4=chen4}
chen1
chen2
chen3
chen4
1  chen1
2  chen2
3  chen3
4  chen4
*/

HashMap

基於雜湊表實現的Map介面。

儲存自定義物件時,因為鍵具有唯一性,當自定義物件作為鍵的時候需要在自定義物件中重寫hashCode()和equals()方法才能保證唯一性。

demo:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Test {
	public static void main(String[] args) {
		HashMap<Student,String> hm = new HashMap<Student,String>();
		
		hm.put(new Student("chen0",10), "ShangHai");
		hm.put(new Student("chen0",10),"BeiJing"); //和第一個姓名和年齡相同,鍵重複,值覆蓋
		hm.put(new Student("chen1",20),"ShangHai");
		hm.put(new Student("chen2",30),"GuangZhou");
		
		Set<Student> s = hm.keySet();
		for(Iterator<Student> it = s.iterator();it.hasNext();) {
			Student key = it.next();
			System.out.println(key+"地址"+hm.get(key));
		}
		
	}
}

class Student{
	private String name;
	private int age;
	
	public Student(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;
	}
	
	//重寫hashCode方法
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	//重寫equals方法
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "姓名"+name+"年齡"+age;
	}
}
/*
姓名chen1年齡20地址ShangHai
姓名chen2年齡30地址GuangZhou
姓名chen0年齡10地址BeiJing
*/

TreeMap

基於紅黑樹結構的雙鏈集合,會對鍵進行自然排序,需要實現Comparator介面中的compare方法才能完成排序。

demo:

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class Test {
	public static void main(String[] args) {
		TreeMap<Student,String> tm = new TreeMap<Student,String>(new Comparator<Student>(){
			
			//重寫compare方法,先按名字排序,名字相同按年齡排序
			@Override
			public int compare(Student stu1, Student stu2) {
				int num = stu1.getName().hashCode() - stu2.getName().hashCode();
				return num== 0 ? stu1.getAge()-stu2.getAge() : num; 
			}
			
		});
		
		tm.put(new Student("chen1",20), "ShangHai");
		tm.put(new Student("chen1",10), "ShangHai");
		tm.put(new Student("chen0",10),"BeiJing"); 
		tm.put(new Student("chen3",20),"ShangHai");
		tm.put(new Student("chen2",30),"GuangZhou");
		
		Set<Student> s = tm.keySet();
		for(Iterator<Student> it = s.iterator();it.hasNext();) {
			Student key = it.next();
			System.out.println(key+"地址"+tm.get(key));
		}
		
	}
}

//Student部分沒變
class Student{
	private String name;
	private int age;
	
	public Student(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;
	}
	
	//重寫hashCode方法
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	//重寫equals方法
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "姓名"+name+"年齡"+age;
	}
}
/*
姓名chen0年齡10地址BeiJing
姓名chen1年齡10地址ShangHai
姓名chen1年齡20地址ShangHai
姓名chen2年齡30地址GuangZhou
姓名chen3年齡20地址ShangHai
*/

HashTable

執行緒安全的雙鏈集合,使用方式和HashMap集合類似。需要注意Hashtable集合不允許鍵值對中存在null的元素,如果存在null會引發NullPointerException異常。

相關推薦

5.3Map介面HashMapTreeMap

Map     |--HashMap  地層是雜湊表  可以使用null鍵和null值  執行緒不同步 效率高                 保證元素的唯一性:元素的hashCode方法(先)和equals方法(後)     |--TreeMap  底層是紅黑樹結構 執行緒

Java集合SetMapHashSetHashMapTreeSetTreeMap

程序 對待 tro value treeset mov str ble collect 1、Set和Map的關系: Set代表一種集合元素無序、不可重復的集合,Map代表一種由多個key-value對組成的集合。 Set的集合繼承體系: Map關系集合 Map

Java集合框架(五)—— MapHashMapHashtablePropertiesSortedMapTreeMapWeakHashMapIdentityHashMapEnumMap

getprop color name 找到 文件 remove style 情況 read Map   Map用於保存具有映射關系的數據,因此Map集合裏保存著兩組值,一組值用於保存Map裏的key,另一組值用於保存Map裏的value,key和value

Java中的集合MapHashMapHashtablePropertiesSortedMapTreeMapWeakHashMapIdentityHashMapEnumMap(五)

我們 obj ack ext.get 好處 output get () 硬盤 Map   Map用於保存具有映射關系的數據,因此Map集合裏保存著兩組值,一組值用於保存Map裏的key,另一組值用於保存Map裏的value,key和value都可以是任何引用類型的數

HashTableHashMapTreeMap原理和區別?

HashTable、HashMap、TreeMap原理和區別? HashTable、HashMap、TreeMap原理和區別? HashMap HashMap的資料結構 陣列 連結串列 雜湊表 HashTable TreeMap HashMap 總體結構:  HashMap的資料結構

ArrayListLinkedListHashMapTreeMap 存儲速度對比

time java link ash array main .com ima image 1、百 級別的數據(100) 2、千 級別的數據(1000) 3、萬 級別的數據(10000) 4、十萬 級別的數據(100000)

HashTableHashMapTreeMap的區別

  Map是集合框架的一部分(另一部分是Collection),以鍵值對的形式儲存和操作資料的資料容器。 HashTable是Java早期基於Hash表的實現的類,本身就是同步,不論是key還是value都不支援null值,而且因為同步開銷太大,現在基本不用這個容器了。

對比HashtableHashMapTreeMap有什麼不同?(設計效能安全)

都實現了map介面,以鍵值對key-value儲存和操作資料的容器結構。 一、低層實現、效能、安全 Hashtable:無序,執行緒安全,效率低,雜湊表(陣列+連結串列)的實現,不允許key有空值。(因為效率低且開銷大,現在已經很少使用了) HashMap:無序,執行緒

HashtableHashMapTreeMap心得

     三者均實現了Map介面,儲存的內容是基於key-value的鍵值對對映,一個對映不能有重複的鍵,一個鍵最多隻能對映一個值。   (1) 元素特性 HashTable中的key、value都不能為null;HashMap中的key、value可以為null,很顯然只能有一個key為null的鍵值對

HashTableHashMapLinkedHashMapTreeMap之間的區別

    Map介面   一:HashTable與HashMap之間的區別     HashTable HashMap

java中的幾種泛型類——HashSetHashMapTreeSetTreeMap,遍歷map,排序,HashTable比較

package test; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; public c

ConcurrentHashMap和hashTable的區別HashMapTreeMap區別

ConcurrentHashMap集合了hashmap和hashtable 這兩張表的優勢: hashtable 每次操作都會鎖住真個結構 ConcurrentHashMap 鎖的方式是稍微細粒度 把資料分為了16個桶,每次get put remove 等操作,只需要對對應的

深入理解 hash 函式HashMapLinkedHashMapTreeMap

前言 Map 是非常常用的一種資料介面。在java中,提供了成熟的 Map 實現。 圖 1 最主要的實現類有 Hashtable、HashMap、LinkedHashMap和 TreeMap。在 HashTable 的子類中,還有 Properties的實現。Prope

資料結構 5 雜湊表/HashMap 自動擴容多執行緒會出現的問題

上一節,我們已經介紹了最重要的B樹以及B+樹,使用的情況以及區別的內容。當然,本節課,我們將學習重要的一個數據結構、雜湊表 ## 雜湊表 雜湊也常被稱作是散列表,為什麼要這麼稱呼呢,雜湊、雜湊、其元素分佈較鬆散、經常用來儲存例如`key-value`的資料、這樣有什麼好處呢?我們來細細琢磨一下: -

ArrayListVectorHashMapHashTableHashSet的默認初始容量加載因子擴容增量具體區別

以及 內存 高效率 數組元素 調整 增量 [] key存在 集合 要討論這些常用的默認初始容量和擴容的原因是:當底層實現涉及到擴容時,容器或重新分配一段更大的連續內存(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配內存),要將容器原來的數據全部復制到新的內

JAVA 基本數據結構--數組鏈表ArrayListLinkedlisthashmaphashtab等

i++ 運算 prev ini 示意圖 insert builder double 上下 概要 線性表是一種線性結構,它是具有相同類型的n(n≥0)個數據元素組成的有限序列。本章先介紹線性表的幾個基本組成部分:數組、單向鏈表、雙向鏈表;隨後給出雙向鏈表的C、C++和Java

Java容器深入淺出之MapHashMapHashtable及其它實現類

在Java中,Set的底層事實上是基於Map實現的,Map內部封裝了一個Entry內部介面,由實現類來封裝key-value對,當value值均為null時,key的集合就形成了Set。因此,Map集合具有如下的一些特點: 1. Key集因為是Set的實現,因此是無順序、不可重複的。 2. Value集是

各種集合框架的總結ArrayListLinkedListVectorHashMapHashTableHashSetLinkedHaSetTreeSetConcurrentHashMap

這幾道Java集合框架面試題在面試中幾乎必問  1.Arraylist 與 LinkedList 異同 1. 執行緒安全: ArrayList 和 LinkedList 都是執行緒不安全的; 2. 資料結構: Arraylist 底層使用的是Object陣列;Linked

HashSetHashMapArrayListLinkedListVector區別

什麼是HashSet HashSet實現了Set介面,它不允許集合中有重複的值,當我們提到HashSet時,第一件事情就是在將物件儲存在HashSet之前,要先確保物件重寫equals()和hashCode()方法,這樣才能比較物件的值是否相等,以確保set中沒有儲存相等的

CollectionArrayListHashMapHashSet轉為執行緒安全(集合的安全性問題)

最近在看bugly的是否,發現二維碼掃描程式碼中有一段報錯了,執行緒不安全問題.   裡面有段 new HashSet() 程式碼,這個HashSet,底層是採用HashMap來實現的,執行緒不是安全的, 所以有時候會有執行緒不安全的問題產生. 前言:Collecti