激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java集合之Map接口的實現類精解

Java集合之Map接口的實現類精解

2022-01-22 16:42葉綠體不忘呼吸 Java教程

Map提供了一種映射關系,其中的元素是以鍵值對(key-value)的形式存儲的,能夠實現根據key快速查找value;Map中的鍵值對以Entry類型的對象實例形式存在;鍵(key值)不可重復,value值可以重復,一個value值可以和很多key值形成對應關

HashMap類

1、HashMap類概述

HashMap是 Map 接口使用頻率最高的實現類,允許使用null鍵和null值,與HashSet一樣,不保證映射的順序。

所有的key構成的集合是Set:無序的、不可重復的。所以,key所在的類要重寫
equals()hashCode()
所有的value構成的集合是Collection:無序的、可重復的。所以,value所在的類
要重寫equals()

一個key-value構成一個entry,所有的entry構成的集合是Set:無序的、不可重復的。

HashMap判斷兩個 key 相等的標準:兩個 key 通過 equals() 方法返回 true,
hashCode() 值也相等。
HashMap判斷兩個 value 相等的標準:兩個 value 通過 equals() 方法返回 true。

2、HashMap的存儲結構(底層實現原理)

HashMap map = new HashMap()

(以JDK1.7說明)
在實例化以后,底層就創建了長度為16的一維數組Entry[] table

map.put(key1,value1)

首先,調用key1所在類的hashCode()計算key1哈希值,此哈希值經過某種算法計算以后,得到在Entry[]數組中的存放位置。

如果此位置上的數據為空,此時的key1-value1添加成功。----情況1
如果此位置上的數據不為空(意味著此位置上存在一個或多個數據(以鏈表形式存在)),則繼續比較key1和已經存在的一個或多個數據的哈希值:

如果key1的哈希值與已經存在的數據的哈希值都不相同,此時key1-value1添加成功。----情況2
如果key1的哈希值和已經存在的某一個數據key2-value2的哈希值相同,繼續比較:

調用key1所在類的equals(key2)
如果equals()返回false:此時key1-value1添加成功。----情況3
如果equals()返回true:使用value1替換value2。

補充:關于情況2和情況3,此時key1-value1和原來的數據以鏈表的方式存儲。
在不斷的添加過程中,會涉及到擴容問題,默認的擴容方式:擴容為原來容量的2倍,并將原有的數據復制過來。

JDK1.8相較于JDK1.7在底層實現方面的不同:
new HashMap(),底層還沒有創建一個長度為16的數組
②JDK1.8底層的數組是: Node[],而非Entry[]
③首次調用put()方法時,底層才創建長度為16的數組Node[]
④形成鏈表結構時,新添加的key-value對在鏈表的尾部(七上八下)
⑤JDK1.7底層結構只有“數組+鏈表”,JDK1.8中底層結構為“數組+鏈表+紅黑樹”。
當數組的某一個索引位置上的元素以鏈表形式存在的數據個數>8且當前數組的長度>64時,此時此索引位置上的所有數據改為使用紅黑樹存儲。

Java集合之Map接口的實現類精解

Java集合之Map接口的實現類精解

3、HashMap源碼中的重要常量

DEFAULT_INITIAL_CAPACITY: HashMap的默認容量,16
MAXIMUM_CAPACITY: HashMap的最大支持容量,2^30
DEFAULT_LOAD_FACTOR:HashMap的默認加載因子,0.75
TREEIFY_THRESHOLD:Bucket中鏈表長度大于該默認值8,轉化為紅黑樹
UNTREEIFY_THRESHOLD:Bucket中紅黑樹存儲的Node小于該默認值6,轉化為鏈表
MIN_TREEIFY_CAPACITY:桶中的Node被樹化時最小的hash表容量。(當桶中Node的數量大到需要變紅黑樹時,若hash表容量小于MIN_TREEIFY_CAPACITY時,此時應執行resize擴容操作這個MIN_TREEIFY_CAPACITY的值至少是TREEIFY_THRESHOLD的4倍為64。)
table:存儲元素的數組,總是2的n次冪
entrySet:存儲具體元素的集
size:HashMap中存儲的鍵值對的數量
modCount:HashMap擴容和結構改變的次數。
threshold:擴容的臨界值,=容量*填充因子
loadFactor:填充因子

 

LinkedHashMap類

LinkedHashMap 是 HashMap 的子類

在HashMap存儲結構的基礎上,使用了一對雙向鏈表來記錄添加元素的順序

與LinkedHashSet類似,LinkedHashMap 可以維護 Map 的迭代順序:迭代順序與 Key-Value 對的插入順序一致

Java集合之Map接口的實現類精解

 

TreeMap類

1、TreeMap類概述

TreeMap存儲 Key-Value 對時,需要根據 key 進行排序。TreeMap 可以保證所有的 Key-Value 處于有序狀態。

TreeSet底層使用紅黑樹結構存儲數據。

TreeMap 的 Key 的排序:
①自然排序:TreeMap 的所有的 Key 必須實現 Comparable 接口,而且所有
的 Key 應該是同一個類的對象,否則將會拋出 ClasssCastException。
②定制排序:創建 TreeMap 時,傳入一個 Comparator 對象,該對象負責對
TreeMap 中的所有 key 進行排序,此時不需要 Map的Key實現Comparable接口。

TreeMap判斷兩個key相等的標準:兩個key通過compareTo()方法或者compare()方法返回0。

2、自然排序

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

/**
* @Author: Yeman
* @Date: 2021-09-22-22:59
* @Description:
*/

class user implements Comparable{
  String name;
  int age;

  public user(String name, int age) {
      this.name = name;
      this.age = age;
  }

  @Override
  public String toString() {
      return "user{" +
              "name='" + name + '\'' +
              ", age=" + age +
              '}';
  }

  @Override
  public int compareTo(Object o) {
      if (o instanceof user){
          user other = (user) o;
          Integer nameResult = this.name.compareTo(other.name);
          if (nameResult == 0){
              return Integer.compare(this.age,other.age);
          }else return nameResult;
      }else throw new RuntimeException("類型不匹配");
  }
}


public class TreeMapTest {
  public static void main(String[] args) {
      Map map = new TreeMap();
      map.put(new user("Tom",22),1);
      map.put(new user("Jim",18),2);
      map.put(new user("Marry",20),3);
      map.put(new user("Lily",16),4);
      map.put(new user("Tom",18),5);

      Set set = map.entrySet();
      Iterator iterator = set.iterator();
      while (iterator.hasNext()){
          System.out.println(iterator.next());
      }
  }
}

Java集合之Map接口的實現類精解

3、定制排序

import java.util.*;

/**
* @Author: Yeman
* @Date: 2021-09-22-22:59
* @Description:
*/

class user {
  String name;
  int age;

  public user(String name, int age) {
      this.name = name;
      this.age = age;
  }

  @Override
  public String toString() {
      return "user{" +
              "name='" + name + '\'' +
              ", age=" + age +
              '}';
  }
}

public class TreeMapTest {
  public static void main(String[] args) {
      Comparator comparator = new Comparator() {
          @Override
          public int compare(Object o1, Object o2) {
              if (o1 instanceof user && o2 instanceof user) {
                  user user1 = (user) o1;
                  user user2 = (user) o2;
                  Integer nameResult = user1.name.compareTo(user2.name);
                  if (nameResult == 0) return Integer.compare(user1.age, user2.age);
                  else return nameResult;
              } else throw new RuntimeException("類型不匹配");
          }
      };

      Map map = new TreeMap(comparator);
      map.put(new user("Tom",22),1);
      map.put(new user("Jim",18),2);
      map.put(new user("Marry",20),3);
      map.put(new user("Lily",16),4);
      map.put(new user("Tom",18),5);

      Set set = map.entrySet();
      Iterator iterator = set.iterator();
      while (iterator.hasNext()) {
          System.out.println(iterator.next());
      }
  }
}

Java集合之Map接口的實現類精解

 

Hashtable類

Hashtable是個古老的 Map 實現類,JDK1.0就提供了。不同于HashMap,
Hashtable是線程安全的。

Hashtable實現原理和HashMap相同,功能相同。底層都使用哈希表結構,查詢
速度快,很多情況下可以互用。

與HashMap不同,Hashtable 不允許使用 null 作為 key 和 value。
與HashMap一樣,Hashtable 也不能保證其中 Key-Value 對的順序。

Hashtable判斷兩個key相等、兩個value相等的標準,與HashMap一致。

 

Properties類

Properties 類是 Hashtable 的子類,該對象用于處理屬性文件,由于屬性文件里的 key、value 都是字符串類型,所以 Properties 里的 key 和 value 都是字符串類型

存取數據時,建議使用setProperty(String key,String value)方法和getProperty(String key)方法

Properties pros = new Properties();
pros.load(new FileInputStream("jdbc.properties"));
String user = pros.getProperty("user");
System.out.println(user);

到此這篇關于Java集合之Map接口的實現類精解的文章就介紹到這了,更多相關Java Map內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/m0_46653805/article/details/120422381

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
主站蜘蛛池模板: 欧美一级片免费在线观看 | 中文字幕亚洲一区二区三区 | 天天鲁在线视频免费观看 | 最新黄色毛片 | 日本一区二区在线 | 中文字幕在线亚洲精品 | 精品一区二区久久久久久按摩 | 午夜精品在线视频 | 欧洲成人综合网 | 日韩在线激情 | 欧洲精品色 | 性大片免费看 | 看国产一级毛片 | 久草在线观看资源 | 日韩精品久久久久久久电影99爱 | 国产乱淫av片免费网站 | 一级α片 | 日本在线高清 | 久久九九热re6这里有精品 | 蝌蚪久久窝| 精品人伦一区二区三区蜜桃网站 | www久久艹 | 欧美a级在线免费观看 | 国产手机av在线 | 美女视频网站黄色 | 奇米888一区二区三区 | 成人 精品 | 精品亚洲夜色av98在线观看 | 在线天堂中文字幕 | av电影网站在线 | 亚欧美一区二区 | 欧美日韩免费一区 | 91短视频在线视频 | 中文字幕在线观看视频一区 | 国产成人免费高清激情视频 | 日本黄色免费播放 | 国产黄色一级大片 | 91精品国| 蜜桃传媒视频麻豆第一区免费观看 | 久久久久久久久久91 | 亚洲国产精品一 |