<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
HashTable的鍵和值都不能為空,否則會丟擲一個異常
使用方法基本與HashMap一致
HashTable是執行緒安全的,HashMap是執行緒不安全的
先上程式碼:
Hashtable hashtable = new Hashtable(); hashtable.put("john",100); hashtable.put("tom",250); hashtable.put("tom",1314); System.out.println(hashtable);
輸出:
{tom=1314, john=100}
先進入put方法,可以看到在put方法最前面先判斷了value是否為空,如果為空直接丟擲一個異常
if (value == null) { throw new NullPointerException(); }
同樣的,HashTable也存在替換機制和擴容機制!
HashTable擁有自己的擴容機制,這不同於HashSet和HashMap
首先,我們要明白,在HashTable新增鍵值對時,真正起到新增作用的是如下方法:
addEntry(hash, key, value, index);
我們來看一下他的真面目:
private void addEntry(int hash, K key, V value, int index) { Entry<?,?> tab[] = table; if (count >= threshold) { // Rehash the table if the threshold is exceeded rehash(); tab = table; hash = key.hashCode(); index = (hash & 0x7FFFFFFF) % tab.length; } // Creates the new entry. @SuppressWarnings("unchecked") Entry<K,V> e = (Entry<K,V>) tab[index]; tab[index] = new Entry<>(hash, key, value, e); count++; modCount++; }
當新增的元素數量大於臨界值時,執行rehash方法(這個方法就是真正的擴容方法)
if (count >= threshold) { // Rehash the table if the threshold is exceeded rehash(); tab = table; hash = key.hashCode(); index = (hash & 0x7FFFFFFF) % tab.length; }
繼續追進去到rehash方法:
protected void rehash() { int oldCapacity = table.length; Entry<?,?>[] oldMap = table; // overflow-conscious code int newCapacity = (oldCapacity << 1) + 1; if (newCapacity - MAX_ARRAY_SIZE > 0) { if (oldCapacity == MAX_ARRAY_SIZE) // Keep running with MAX_ARRAY_SIZE buckets return; newCapacity = MAX_ARRAY_SIZE; } Entry<?,?>[] newMap = new Entry<?,?>[newCapacity]; modCount++; threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1); table = newMap; for (int i = oldCapacity ; i-- > 0 ;) { for (Entry<K,V> old = (Entry<K,V>)oldMap[i] ; old != null ; ) { Entry<K,V> e = old; old = old.next; int index = (e.hash & 0x7FFFFFFF) % newCapacity; e.next = (Entry<K,V>)newMap[index]; newMap[index] = e; } } }
不要慌,我們來分析一下這個擴容方法
首先,拿到老的容量:
int oldCapacity = table.length;
新的容量為老的容量 * 2 + 1:
int newCapacity = (oldCapacity << 1) + 1;
繼續往下,到達真正擴容的程式碼:
Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];
Properties繼承了HashTable
一般用於可操作的組態檔編寫
使用範例:
import java.util.Properties; /** * Properties演示 */ public class PropertiesText { @SuppressWarnings({"all"}) public static void main(String[] args) { Properties properties = new Properties(); // 增加 properties.put("john",521); properties.put("tom",1314); properties.put("tom",100); System.out.println(properties); // 通過key獲取值 System.out.println(properties.get("tom")); // 刪除 properties.remove("tom"); System.out.println(properties); } }
輸出:
{tom=100, john=521}
100
{john=521}
儲存一組物件:Collection
允許重複,增刪多選LinkedList,改查多選ArrayList
不允許重複,無序選HashSet,排序選TreeSet,插入和取出順序一致選擇LinkedHashSet
儲存鍵值對:Map
鍵無序:HashMap
鍵排序:TreeMap
鍵插入和取出順序一致:LinkedHashMap
讀取檔案:Properties
到此這篇關於詳解Java集合類之HashTable,Properties篇的文章就介紹到這了,更多相關Java集合類HashTable Properties內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45