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介面、HashMap、TreeMap
Map |--HashMap 地層是雜湊表 可以使用null鍵和null值 執行緒不同步 效率高 保證元素的唯一性:元素的hashCode方法(先)和equals方法(後) |--TreeMap 底層是紅黑樹結構 執行緒
Java集合Set、Map、HashSet、HashMap、TreeSet、TreeMap等
程序 對待 tro value treeset mov str ble collect 1、Set和Map的關系: Set代表一種集合元素無序、不可重復的集合,Map代表一種由多個key-value對組成的集合。 Set的集合繼承體系: Map關系集合 Map
Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap
getprop color name 找到 文件 remove style 情況 read Map Map用於保存具有映射關系的數據,因此Map集合裏保存著兩組值,一組值用於保存Map裏的key,另一組值用於保存Map裏的value,key和value
Java中的集合Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap(五)
我們 obj ack ext.get 好處 output get () 硬盤 Map Map用於保存具有映射關系的數據,因此Map集合裏保存著兩組值,一組值用於保存Map裏的key,另一組值用於保存Map裏的value,key和value都可以是任何引用類型的數
HashTable、HashMap、TreeMap原理和區別?
HashTable、HashMap、TreeMap原理和區別? HashTable、HashMap、TreeMap原理和區別? HashMap HashMap的資料結構 陣列 連結串列 雜湊表 HashTable TreeMap HashMap 總體結構: HashMap的資料結構
ArrayList、LinkedList、HashMap、TreeMap 存儲速度對比
time java link ash array main .com ima image 1、百 級別的數據(100) 2、千 級別的數據(1000) 3、萬 級別的數據(10000) 4、十萬 級別的數據(100000)
HashTable、HashMap、TreeMap的區別
Map是集合框架的一部分(另一部分是Collection),以鍵值對的形式儲存和操作資料的資料容器。 HashTable是Java早期基於Hash表的實現的類,本身就是同步,不論是key還是value都不支援null值,而且因為同步開銷太大,現在基本不用這個容器了。
七、對比Hashtable、HashMap、TreeMap有什麼不同?(設計、效能、安全)
都實現了map介面,以鍵值對key-value儲存和操作資料的容器結構。 一、低層實現、效能、安全 Hashtable:無序,執行緒安全,效率低,雜湊表(陣列+連結串列)的實現,不允許key有空值。(因為效率低且開銷大,現在已經很少使用了) HashMap:無序,執行緒
Hashtable、HashMap、TreeMap心得
三者均實現了Map介面,儲存的內容是基於key-value的鍵值對對映,一個對映不能有重複的鍵,一個鍵最多隻能對映一個值。 (1) 元素特性 HashTable中的key、value都不能為null;HashMap中的key、value可以為null,很顯然只能有一個key為null的鍵值對
HashTable、HashMap、LinkedHashMap、TreeMap之間的區別
Map介面 一:HashTable與HashMap之間的區別 HashTable HashMap
java中的幾種泛型類——HashSet、HashMap、TreeSet、TreeMap,遍歷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的區別、HashMap和TreeMap區別
ConcurrentHashMap集合了hashmap和hashtable 這兩張表的優勢: hashtable 每次操作都會鎖住真個結構 ConcurrentHashMap 鎖的方式是稍微細粒度 把資料分為了16個桶,每次get put remove 等操作,只需要對對應的
深入理解 hash 函式、HashMap、LinkedHashMap、TreeMap
前言 Map 是非常常用的一種資料介面。在java中,提供了成熟的 Map 實現。 圖 1 最主要的實現類有 Hashtable、HashMap、LinkedHashMap和 TreeMap。在 HashTable 的子類中,還有 Properties的實現。Prope
資料結構 5 雜湊表/HashMap 、自動擴容、多執行緒會出現的問題
上一節,我們已經介紹了最重要的B樹以及B+樹,使用的情況以及區別的內容。當然,本節課,我們將學習重要的一個數據結構、雜湊表 ## 雜湊表 雜湊也常被稱作是散列表,為什麼要這麼稱呼呢,雜湊、雜湊、其元素分佈較鬆散、經常用來儲存例如`key-value`的資料、這樣有什麼好處呢?我們來細細琢磨一下: -
ArrayList、Vector、HashMap、HashTable、HashSet的默認初始容量、加載因子、擴容增量、具體區別
以及 內存 高效率 數組元素 調整 增量 [] key存在 集合 要討論這些常用的默認初始容量和擴容的原因是:當底層實現涉及到擴容時,容器或重新分配一段更大的連續內存(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配內存),要將容器原來的數據全部復制到新的內
JAVA 基本數據結構--數組、鏈表、ArrayList、Linkedlist、hashmap、hashtab等
i++ 運算 prev ini 示意圖 insert builder double 上下 概要 線性表是一種線性結構,它是具有相同類型的n(n≥0)個數據元素組成的有限序列。本章先介紹線性表的幾個基本組成部分:數組、單向鏈表、雙向鏈表;隨後給出雙向鏈表的C、C++和Java
Java容器深入淺出之Map、HashMap、Hashtable及其它實現類
在Java中,Set的底層事實上是基於Map實現的,Map內部封裝了一個Entry內部介面,由實現類來封裝key-value對,當value值均為null時,key的集合就形成了Set。因此,Map集合具有如下的一些特點: 1. Key集因為是Set的實現,因此是無順序、不可重複的。 2. Value集是
各種集合框架的總結ArrayList、LinkedList、Vector、HashMap、HashTable、HashSet、LinkedHaSet、TreeSet、ConcurrentHashMap
這幾道Java集合框架面試題在面試中幾乎必問 1.Arraylist 與 LinkedList 異同 1. 執行緒安全: ArrayList 和 LinkedList 都是執行緒不安全的; 2. 資料結構: Arraylist 底層使用的是Object陣列;Linked
HashSet、HashMap、ArrayList、LinkedList、Vector區別
什麼是HashSet HashSet實現了Set介面,它不允許集合中有重複的值,當我們提到HashSet時,第一件事情就是在將物件儲存在HashSet之前,要先確保物件重寫equals()和hashCode()方法,這樣才能比較物件的值是否相等,以確保set中沒有儲存相等的
Collection、ArrayList、HashMap、HashSet轉為執行緒安全(集合的安全性問題)
最近在看bugly的是否,發現二維碼掃描程式碼中有一段報錯了,執行緒不安全問題. 裡面有段 new HashSet() 程式碼,這個HashSet,底層是採用HashMap來實現的,執行緒不是安全的, 所以有時候會有執行緒不安全的問題產生. 前言:Collecti