Java集合中的框架2
Java集合中的框架2
一、HashMap類和Hashtable類的用法TreeMap與ConcurrentHashMap
Map介面--集合介面--主要處理的是鍵值對結構的資料
鍵值對結構的資料---就是一個完成的資料是由鍵和鍵所對應的值組合而成的資料
例如:
書的目錄就是一種鍵值對結構
【標題----頁碼】
Map介面下的子類
1.HashMap類--public class HashMap【基於雜湊表的實現的Map介面】
允許null的值和null鍵
資料儲存是無序的
不能有重複的鍵,重複的鍵被算作是一個資料。
構造方法:
HashMap() 構造一個空的 HashMap ,預設初始容量(16)和預設負載係數(0.75)。 |
HashMap(int initialCapacity) 構造一個空的 HashMap具有指定的初始容量和預設負載因子(0.75)。 |
HashMap(int initialCapacity, float loadFactor) 構造一個空的 HashMap具有指定的初始容量和負載因子。 |
HashMap(Map<? extends K,? extends V> m) 構造一個新的 HashMap與指定的相同的對映 Map 。 |
package com.wangxing.hashmaptest;
import java.util.HashMap;
public class HashMapTest1 {
public static void main(String[] args) {
//Map 介面下的子類
//HashMap類
//允許null的值和null鍵
//資料儲存時無序的
//不能有重複的鍵,重複的鍵被算作是一個資料
//構造方法:
//HashMap()構造一個空的HashMap,預設初始容量(16)和預設負載係數(0.75)
HashMap<Object, Object> hashMap=new HashMap<>();
//HashMap(int initialCapacity)構造一個空的HashMap具有指定的初始容量和預設負載因子(0.75)
HashMap<Object, Object> hashMap2=new HashMap<>(30);
//HashMap(int initialCapacity,float loadFactor)構造一個空的HashMap具有指定的初始容量和指定的負載因子
HashMap<Object, Object> hashMap3=new HashMap<>(30, 0.5F);
//HashMap(Map m)構造一個新的HashMap與指定的相同的對映Map
HashMap<Object, Object> hashMap4=new HashMap<>(hashMap3);
}
}
例項方法:
void | clear() 清空集合。 | ||
Object | put(Object key, Object value) 向集合中新增鍵值對資料 | ||
boolean | containsKey(Object key) 判斷集合中是否包含指定的鍵 | ||
boolean | containsValue(Object value) 判斷集合中是否包含指定的值 | ||
Object | get(Object key) 根據指定的鍵得到該鍵對應的值 | ||
boolean | isEmpty() 判斷集合是否為空。 | ||
int | size() 得到集合中鍵值對元素的個數 | ||
V | remove(Object key) 根基指定的鍵刪除對應的鍵值對資料值 | ||
Set | keySet() 得到集合中所有的鍵儲存到Set集合中 | ||
Collection | values() 得到集合中所有的值儲存到Collection集合中 | ||
Set<Map.Entry<K,V>> | entrySet() 得到集合中所有的鍵值對資料Set集合中 |
package com.wangxing.hashmaptest;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class HashMapTest2 {
public static void main(String[] args){
//HashMap類的常用例項方法
//允許null的值和null鍵
//資料儲存是無序的
//不能有重複的鍵,重複的鍵被算作是一個資料
HashMap<Object, Object> hashMap=new HashMap<>();
//Object put(Object key,Object value)向集合中新增鍵值對資料
hashMap.put("hello", 1234);
hashMap.put(1234, "hello");
hashMap.put(12.5, true);
hashMap.put(false, 123.1);
hashMap.put(null, "null鍵");
hashMap.put("null值", null);
hashMap.put(null, null);//會被算作一個
// int size()得到集合中鍵值對元素的個數
System.out.println("size=="+hashMap.size());
//boolean containsKey(Object key)判斷集合中是否包含指定的鍵
String containsKey=(hashMap.containsKey("helloworld"))?"存在":"不存在";
System.out.println("containskey=="+containsKey);
//boolean containsValue(Object value)判斷集合中是否存在指定的值
String containsValue=(hashMap.containsValue("helloworld"))?"存在":"不存在";
System.out.println("containsvaule=="+containsValue);
//Object get(Object key)根據指定的鍵得到該鍵對應的值
System.out.println("get=="+hashMap.get("hello"));
//V remove(Object key)根據指定的鍵刪除對應的鍵值對資料值
hashMap.remove("null值");
System.out.println("size=="+hashMap.size());
//void clear()清空集合
//hashMap.clear();
//boolean isEmpty()判斷集合是否為空
String pd=(hashMap.isEmpty())?"是":"否";
System.out.println("集合是否為空?"+pd);
/*
* Set keySet()得到集合中所有的鍵儲存到Set集合中
* Collectionvalue()方法用於檢查HashMap中的單個鍵或多個鍵是否對映了特定值。它使用Value作為引數,如果該值由對映中的任何鍵對映,則返回True
* Set<Map.Entry<k,v>> entrySet()得到集合中所有的鍵值對資料Set集合中
*
*/
Set set=hashMap.keySet();
boolean collection=hashMap.containsValue("hello");
System.out.println(collection);
Set<Map.Entry<Object,Object>> maps=hashMap.entrySet();
System.out.println("maps=="+maps);
}
}
遍歷HashMap集合:
package com.wangxing.hashmaptest;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapTest3 {
public static void main(String[] args) {
//HashMap的遍歷
HashMap<Object,Object> hashMap=new HashMap<Object, Object>();
hashMap.put("hello",1234);
hashMap.put(1234,"hello");
hashMap.put(12.5,true);
hashMap.put(false,168.5);
hashMap.put(null,"null鍵");
hashMap.put("null值",null);
//遍歷集合中所有的鍵儲存到Set集合中Set keySet()
Set<Object> objects=hashMap.keySet();
for (Object key : objects) {
System.out.println("key=="+key);
}
System.out.println("----------");
Iterator<Object> iterator=objects.iterator();
while(iterator.hasNext()){
Object object=iterator.next();
System.out.println("key2=="+object);
}
System.out.println("-------------");
//遍歷集合中所有值儲存到Collection集合中 values()
Collection<Object> collection=hashMap.values();
for (Object val : collection) {
System.out.println("val=="+val);
}
System.out.println("----------------");
Iterator<Object> iterator2=collection.iterator();
while(iterator2.hasNext()){
Object val2=iterator2.next();
System.out.println("val2=="+val2);
}
System.out.println("------------------");
//Set<Map.Entry<K,V>> entrySet()得到集合中所有的鍵值對資料Set集合中
Set<Map.Entry<Object, Object>> objects2=hashMap.entrySet();
System.out.println("obj1=="+objects2);
for (Map.Entry<Object, Object> entry : objects2) {
System.out.println(entry.getKey()+"---"+entry.getValue());
}
for (Object object : objects2) {
System.out.println("obj22"+object);
}
}
}
2.Hashtable類---public class Hashtable<K,V> 該類實現了一個雜湊表,它將鍵對映到值。
- 無序
- 不能有null鍵/null值
- 用作鍵的物件必須實現hashCode方法和equals方法。
- 不能有重複的鍵,重複的鍵被算作是一個資料。
- 執行緒安全
構造方法
Hashtable() 構造一個新的,空的雜湊表,預設初始容量(11)和負載因子(0.75)。 |
Hashtable(int initialCapacity) 構造一個新的,空的雜湊表,具有指定的初始容量和預設負載因子(0.75)。 |
Hashtable(int initialCapacity, float loadFactor) 構造一個新的,空的雜湊表,具有指定的初始容量和指定的負載因子。 |
Hashtable(Map<? extends K,? extends V> t) 構造一個與給定地圖相同的對映的新雜湊表。 |
package com.wangxing.hashtable;
import java.util.HashMap;
import java.util.Hashtable;
public class HashtableTest1 {
public static void main(String[] args) {
//Hashtable類
//無序
//不能有null鍵/null值
//用作鍵的物件必須實現hashCode方法和equals方法
//不能有重複的鍵,重複的鍵被算作是一個資料
//執行緒安全
//構造方法
//Hashtable()構造一個新的,空的雜湊表,預設初始容量(11)和負載因子(0.75)
Hashtable<Object, Object> hashtable=new Hashtable<>();
//Hashtable(int initialCapacity)構造一個新的,空的雜湊表,具有指定的初始容量和預設的負載因子
Hashtable<Object, Object> hashtable2=new Hashtable<>(30);
//Hashtable(int initialCaoacity,float loadDactor)構造一個新的,空的雜湊表,具有指定的初始容量和指定的負載因子
Hashtable<Object, Object> hashtable3 = new Hashtable<>(30, 0.5F);
//Hashtable(Map t)構造一個與給定地圖相同的對映的新的雜湊表
Hashtable<Object, Object> hashtable4=new Hashtable<>(hashtable);
HashMap<Object, Object> hashMap=new HashMap<>();
Hashtable<Object, Object> hashtable5=new Hashtable<>(hashMap);
}
}
例項方法
void | clear() 清空集合。 | ||
Object | put(Object key, Object value) 向集合中新增鍵值對資料 | ||
boolean | containsKey(Object key) 判斷集合中是否包含指定的鍵 | ||
boolean | containsValue(Object value) 判斷集合中是否包含指定的值 | ||
Object | get(Object key) 根據指定的鍵得到該鍵對應的值 | ||
boolean | isEmpty() 判斷集合是否為空。 | ||
int | size() 得到集合中鍵值對元素的個數 | ||
V | remove(Object key) 根基指定的鍵刪除對應的鍵值對資料值 | ||
Set | keySet() 得到集合中所有的鍵儲存到Set集合中 | ||
Collection | values() 得到集合中所有的值儲存到Collection集合中 | ||
Set<Map.Entry<K,V>> | entrySet() 得到集合中所有的鍵值對資料Set集合中 | ||
Enumeration<K> | keys() 返回此雜湊表中鍵的列舉。 | ||
Enumeration<V> | elements() 返回此雜湊表中值的列舉。 |
//建立一個作為put方法引數的物件
package com.wangxing.hashtable;
public class UserBean {
}
package com.wangxing.hashtable;
import java.util.Enumeration;
import java.util.Hashtable;
public class HashteabeTest2 {
public static void main(String[] args) {
//Hashtable類的常用例項方法
//無序
//不能有null鍵/null值
//用作鍵的物件必須實現hashCode方法和equals方法
//不能有重複的鍵,重複的鍵被算作是一個資料
//執行緒安全
Hashtable<Object, Object> hashtable=new Hashtable<>();
//Object put(Object key,Object Value)向集合中新增鍵值對資料
hashtable.put("hello", 12134);
hashtable.put(1234, "hello");
hashtable.put(12.3, "hello");
hashtable.put(true, false);
// java.lang.NullPointerException
// at java.util.Hashtable.put(Unknown Source)
//hashtable.put(null, "null鍵");
//用作鍵的物件必須實現hashCode方法和equals方法
UserBean user=new UserBean();
hashtable.put(user, "userBean");
//int size()得到集合中鍵值對與元素的個數
System.out.println("size=="+hashtable.size());
//boolean containsKey(Object key)判斷集合中是否半酣指定的鍵
System.out.println("containskey=="+hashtable.containsKey("user"));
//boolean containsValue(Object value)判斷集合中是否包含指定的值
System.out.println("containsValue=="+hashtable.containsValue("userBean"));
//Object get(Object key)根據指定的鍵得到該鍵對應的值
System.out.println("get=="+hashtable.get(user));
//V remover(Object key)根據指定的鍵刪除對應的鍵的值
hashtable.remove("hello");
System.out.println("size=="+hashtable.size());
//void clear()清空集合 hashtable.clera();
//isEmpty()判斷集合是否為空
System.out.println("isEmpty=="+hashtable.isEmpty());
/*
Set keySet() 得到集合中所有的鍵儲存到Set集合中
Collection values() 得到集合中所有的值儲存到Collection集合中
Set<Map.Entry<K,V>> entrySet() 得到集合中所有的鍵值對資料Set集合中
Enumeration<K> keys() 返回此雜湊表中鍵的列舉。
Enumeration<V> elements() 返回此雜湊表中值的列舉。
*/
Enumeration<Object> enumeration=hashtable.keys();
while (enumeration.hasMoreElements()) {
Object key = (Object) enumeration.nextElement();
System.out.println("key=="+key);
}
Enumeration<Object> enumeration2=hashtable.elements();
while (enumeration2.hasMoreElements()) {
Object value = (Object) enumeration2.nextElement();
System.out.println("value=="+value);
}
}
}
遍歷Hashtable集合:
package com.wangxing.hashtable;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.print.attribute.standard.MediaName;
public class HashtableTest3 {
public static void main(String[] args) {
//Hashtable類的遍歷
Hashtable<Object, Object> hashtable=new Hashtable<>();
hashtable.put("hello",1234);
hashtable.put(1234,"hello");
hashtable.put(12.5,true);
hashtable.put(false,168.5);
//遍歷所有鍵 Set keyset()/Enumeration<K> keys()
Set<Object> keys=hashtable.keySet();
for (Object key : keys) {
System.out.println("key=="+key);
}
System.out.println("----------------------");
Iterator<Object> iterator=keys.iterator();
while (iterator.hasNext()) {
Object key = (Object) iterator.next();
System.out.println("key=="+key);
}
System.out.println("------------------");
/*
Set keySet() 得到集合中所有的鍵儲存到Set集合中
Collection values() 得到集合中所有的值儲存到Collection集合中
Set<Map.Entry<K,V>> entrySet() 得到集合中所有的鍵值對資料Set集合中
Enumeration<K> keys() 返回此雜湊表中鍵的列舉。
Enumeration<V> elements() 返回此雜湊表中值的列舉。
*/
Enumeration<Object> enumeration=hashtable.keys();
while (enumeration.hasMoreElements()) {
Object key = (Object) enumeration.nextElement();
System.out.println("key=="+key);
}
System.out.println("------------");
//遍歷所有值 Collection values()/Enumeration<V> elements()
Collection<Object> collection=hashtable.values();
for (Object value : collection) {
System.out.println("value=="+value);
}
System.out.println("------------");
Iterator<Object> iterator2=collection.iterator();
while (iterator2.hasNext()) {
Object value= (Object) iterator2.next();
System.out.println("value=="+value);
}
System.out.println("------------------");
Enumeration<Object> enumeration2=hashtable.elements();
while(enumeration2.hasMoreElements()){
Object val=enumeration2.nextElement();
System.out.println("val=="+val);
}
System.out.println("-----------------");
//Set<Map.Entry<K,V>> entrySet()得到集合中所有鍵值對資料Set集合中
Set<Map.Entry<Object, Object>> set=hashtable.entrySet();
for(Object val:set){
System.out.println("val=="+val);
}
System.out.println("------------------");
for (Map.Entry<Object, Object> entry : set) {
System.out.println(entry.getKey()+"~~~"+entry.getValue());
}
}
}
3.TreeMap類--紅黑樹基於NavigableMap實現【有序】
4.ConcurrentHashMap類---執行緒安全,支援高併發,雜湊表
二、HashMap類與Hashtable類與TreeMap類與ConcurrentHashMap類的區別
HashMap類 | Hashtable類 |
可以有null鍵/null值 | 不能有null鍵/null值 |
HashMap繼承AbstractMap類 | Hashtable繼承Dictionary類 |
預設容量為16 | 預設容量為11 |
將容量變為原來的2倍。 | 將容量變為原來的2倍加1 |
執行緒不安全 | 執行緒安全 |
HashMap底層實現原理
HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取物件。當我們將鍵值對傳遞給put()方法時,它呼叫鍵物件的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值物件。當獲取物件時,通過鍵物件的equals()方法找到正確的鍵值對,然後返回值物件。HashMap使用連結串列來解決碰撞問題,當發生碰撞了,物件將會儲存在連結串列的下一個節點中。 HashMap在每個連結串列節點中儲存鍵值對物件。當兩個不同的鍵物件的hashcode相同時會發生什麼? 它們會儲存在同一個bucket位置的連結串列中。鍵物件的equals()方法用來找到鍵值對。
HashMap類 | ConcurrentHashMap類 |
執行緒不安全 | 執行緒安全 |
Hashtable類 | ConcurrentHashMap類 |
執行緒安全高併發是效率低 | 執行緒安全高併發是效率高 |
HashTable裡使用的是synchronized關鍵字,這其實是對物件加鎖,鎖住的都是物件整體,當Hashtable的大小增加到一定的時候,效能會急劇下降,因為迭代時需要被鎖定很長的時間。
ConcurrentHashMap使用了分割,將一個map分成多個小的hashtable,對map的一部分進行上鎖。保證同步的同時,有提高了效能。
HashMap類 | Hashtable類 | TreeMap類 |
無序 雜湊表 | 無序 雜湊表 | 有序的key-value集合 紅黑樹實現 |
HashMap繼承AbstractMap類 | Hashtable繼承Dictionary類 | 繼承AbstractMap類 NavigableMap介面 |
執行緒不安全 | 執行緒安全 | 執行緒不安全 |
三、認識Collections類【集合類的幫助類】
public class Collections----此類僅由靜態方法組合或返回集合
靜態方法不需要物件就可以直接呼叫
此類中的方法都是靜態方法,靜態方法為了幫助我們更加方便的操作集合中的資料。
static <T extends Comparable<? super T>> | sort(List<T> list) 根據其元素的natural ordering對指定的列表進行排序。 | |
static void | reverse(List<?> list) 反轉指定列表中元素的順序。 | |
static <T> void | copy(List<? super T> dest, List<? extends T> src) 將所有元素從一個列表複製到另一個列表中。 | |
static <T extends Object & Comparable<? super T>> | max(Collection<? extends T> coll) 根據其元素的 自然順序返回給定集合的最大元素。 | |
static <T extends Object & Comparable<? super T>> | min(Collection<? extends T> coll) 根據其元素的 自然順序返回給定集合的最小元素。 |
package com.wangxing.collections;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class CollectionsTest1 {
public static void main(String[] args) {
//Collections類【集合類的幫助類】
//此類中的方法都是靜態方法,靜態方法為了幫助我們更加方便的操作集合中的資料
ArrayList arrayList=new ArrayList<>();
arrayList.add(123);
//型別轉換錯誤
// java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean
//arrayList.add(true);
arrayList.add(12);
arrayList.add(3);
arrayList.add(345);
for (Object object : arrayList) {
System.out.println("排序前:--"+object);
}
//static void sort(List<T>list)根據元素的natural ordering對指定的列表進行排序
Collections.sort(arrayList);
for (Object object : arrayList) {
System.out.println("排序後---"+object);
}
//static void reverse(List<?>list)反轉指定列表中的元素順序
Collections.reverse(arrayList);
for (Object object:arrayList){
System.out.println("反轉後=="+object);
}
//static T max(Collection<?extendsT>coll)根據其元素的自然順序返回給定集合的最大元素
System.out.println("最大元素--"+Collections.max(arrayList));
//static T min(Collection<?extends T>coll)根據其元素的自然順序返回給定集合的最小元素
System.out.println("最小元素--"+Collections.min(arrayList));
//static <T> void copy(List<?super T>dest,List<? extends T>src)將所有元素從一個列表複製到另一個列表中
ArrayList arrayList2=new ArrayList<>();
arrayList2.add("zhangsan");
arrayList2.add("lisi");
//arrayList2.add("wangwu");
//arrayList2.add("zhaoliu");
//java.lang.IndexOutOfBoundsException: Source does not fit in dest
//下表越界
/*
* copy()方法是:
得到原來集合的大小, int srcSize = src.size();
如果srcSize大於dest.size,將會丟擲異常
if (srcSize > dest.size())
throw new IndexOutOfBoundsException(“Source does not fit in dest”);
*/
//arrayList2.add("test");
//源集合arraylist2==目標集合arraylist【源集合中的元素會覆蓋目標集合中的元素】
/*
Collections.copy(arrayList, arrayList2);
for(Object object:arrayList){
System.out.println("copy後=="+object);
}
*/
//源集合arrayList2<目標集合arrayList【源集合中的元素會覆蓋目標集合中的元素,會有遺留】
/*
Collections.copy(arrayList, arrayList2);
for (Object object : arrayList) {
System.out.println("copy後=="+object);
}
*/
//源集合list2 > 目標集合list1 [java.lang.IndexOutOfBoundsException]
/*
Collections.copy(arrayList, arrayList2);
for(Object obj:arrayList){
System.out.println("copy後--"+obj);
}
*/
注意與Arrays的比較
}
}
四、Collection介面與Collections類的區別
Collection介面 | Collections類 |
Interface | Class |
包含了一些集合的基本操作方法【增刪改查】 | 集合框架的幫助類對集合的排序,搜尋以及序列化的操作 |
相關文章
- Java集合框架中的介面和類Java框架
- java集合框架Java框架
- Java 集合框架Java框架
- 【Java集合原始碼剖析】Java集合框架Java原始碼框架
- 【JAVA集合】JAVA集合框架及其常用方法Java框架
- 集合框架2- ArrayList框架
- Java集合框架的最佳實踐Java框架
- Java基礎-集合框架Java框架
- JAVA集合框架 - Map介面Java框架
- Java集合框架隨筆Java框架
- Java集合框架學習Java框架
- Java集合框架(一)-ArrayListJava框架
- 【Java集合】2 ArrayListJava
- Java中的集合框架深度解析:從ArrayList到ConcurrentHashMap的效能考量Java框架HashMap
- java集合框架--HashMap--putJava框架HashMap
- java中的Map集合Java
- JAVA集合框架中的常用集合及其特點、適用場景、實現原理簡介Java框架
- Java 集合類——Collections(2)Java
- Java集合框架分析(五)LinkedHashMap分析Java框架HashMap
- java集合框架基礎總結Java框架
- Java 集合框架------ArrayList原始碼分析Java框架原始碼
- Java 集合框架體系總覽Java框架
- Java集合框架(黃圖是思路)Java框架
- Java集合中的排序方法Java排序
- Java面試題-集合框架篇三Java面試題框架
- 面試必備 之 Java 集合框架面試Java框架
- Android基礎之Java集合框架CollectionAndroidJava框架
- Java集合框架的概念以及常用介面的介紹Java框架
- Java 集合(2)之 Iterator 迭代器Java
- 一文快速瞭解Java集合框架Java框架
- 集合框架框架
- java集合中的常見考點Java
- Java中的併發集合詳解Java
- Java集合原始碼學習(2)ArrayListJava原始碼
- java之集合框架總結-畢業生必看Java框架
- Java常見知識點彙總(⑦)——集合框架Java框架
- Java 集合框架綜述,這篇讓你吃透!Java框架
- java中展開樹集合Java