最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java集合類之HashTable,Properties篇

 更新時間:2022年07月27日 09:44:23   作者:世界盡頭與你  
這篇文章主要為大家詳細介紹一下Java集合類中HashTable和Properties的用法,文中的示例代碼講解詳細,對我們學習Java有一定幫助,感興趣的可以了解一下

1.基本介紹

HashTable的鍵和值都不能為空,否則會拋出一個異常

使用方法基本與HashMap一致

HashTable是線程安全的,HashMap是線程不安全的

2.HashTable底層

先上代碼:

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也存在替換機制和擴容機制!

3.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++;
}

當添加的元素數(shù)量大于臨界值時,執(zhí)行rehash方法(這個方法就是真正的擴容方法)

if (count >= threshold) {
    // Rehash the table if the threshold is exceeded
    rehash();
    tab = table;
    hash = key.hashCode();
    index = (hash & 0x7FFFFFFF) % tab.length;
}

繼續(xù)追進去到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;

繼續(xù)往下,到達真正擴容的代碼:

Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];

4.HashMap和HashTable的對比

5.Properties

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}

6.集合選型規(guī)則

存儲一組對象:Collection

允許重復,增刪多選LinkedList,改查多選ArrayList

不允許重復,無序選HashSet,排序選TreeSet,插入和取出順序一致選擇LinkedHashSet

存儲鍵值對:Map

鍵無序:HashMap

鍵排序:TreeMap

鍵插入和取出順序一致:LinkedHashMap

讀取文件:Properties

到此這篇關于詳解Java集合類之HashTable,Properties篇的文章就介紹到這了,更多相關Java集合類HashTable Properties內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺談Android開發(fā)中項目的文件結構及規(guī)范化部署建議

    淺談Android開發(fā)中項目的文件結構及規(guī)范化部署建議

    這篇文章主要介紹了Android開發(fā)中項目的文件結構及規(guī)范化部署建議,組織好代碼文件的結構有利于維護團隊合作的效率,需要的朋友可以參考下
    2016-03-03
  • 淺談Java中的hashcode方法(推薦)

    淺談Java中的hashcode方法(推薦)

    本篇文章主要介紹了Java中的hashcode方法,詳細的介紹了hashCode方法的作用,具有一定的參考價值,有需要的可以了解一下。
    2016-12-12
  • Hadoop之常用端口號解讀

    Hadoop之常用端口號解讀

    這篇文章主要介紹了Hadoop之常用端口號,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java創(chuàng)建以任意圖片為背景的窗口

    java創(chuàng)建以任意圖片為背景的窗口

    這篇文章主要為大家詳細介紹了java創(chuàng)建以任意圖片為背景的窗口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 淺談Java父子類加載順序

    淺談Java父子類加載順序

    本文主要介紹了Java父子類加載順序,那么這么長怎么記呀?本文就幫大家總結一下,更有利于記憶,感興趣的可以了解一下
    2021-08-08
  • Java通過反射來打印類的方法實現(xiàn)

    Java通過反射來打印類的方法實現(xiàn)

    本文主要介紹了Java通過反射來打印類的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MyBatis3.X復雜Sql查詢的語句

    MyBatis3.X復雜Sql查詢的語句

    這篇文章主要介紹了MyBatis3.X復雜Sql查詢的相關資料,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 深入分析RabbitMQ中死信隊列與死信交換機

    深入分析RabbitMQ中死信隊列與死信交換機

    這篇文章主要介紹了RabbitMQ中死信隊列與死信交換機,死信隊列就是一個普通的交換機,有些隊列的消息成為死信后,一般情況下會被RabbitMQ清理,感興趣想要詳細了解可以參考下文
    2023-05-05
  • Mybatis的@select和@SelectProvider注解方式動態(tài)SQL語句解讀

    Mybatis的@select和@SelectProvider注解方式動態(tài)SQL語句解讀

    這篇文章主要介紹了Mybatis的@select和@SelectProvider注解方式動態(tài)SQL語句,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Servlet和Spring?MVC的區(qū)別及使用說明

    Servlet和Spring?MVC的區(qū)別及使用說明

    這篇文章詳細介紹了Servlet和SpringMVC的基本概念、工作原理、功能對比和應用場景,Servlet是JavaWeb開發(fā)的基礎,而SpringMVC是一個基于Servlet的高級框架,提供了更強大的功能和易用性,文章通過定義、原理和示例代碼,幫助讀者理解這兩個技術的區(qū)別與聯(lián)系
    2025-01-01

最新評論

阆中市| 马公市| 武川县| 肇庆市| 西宁市| 长汀县| 安多县| 搜索| 黑河市| 平和县| 唐河县| 信宜市| 安化县| 东山县| 镶黄旗| 马公市| 德昌县| 山东省| 尤溪县| 林西县| 吴旗县| 定结县| 广宁县| 奈曼旗| 罗甸县| 周宁县| 河西区| 红原县| 通化县| 隆子县| 宁德市| 横山县| 武夷山市| 栾城县| 望城县| 天津市| 汤阴县| 盖州市| 东安县| 平谷区| 监利县|