1. 程式人生 > >Java中Map和Set容器如何存物件的

Java中Map和Set容器如何存物件的

 之前看到過這樣一個問題,大概是:能否把一個物件(自定義,沒有任何方法)的兩個例項同時存放到同一個Set中去?

 當時很懵,但是這幾天偶然看了Set和Map的原始碼就比較明瞭了。這裡總結一下。

 首先,大體上為了儲存,有通過樹來存資料的,也有通過雜湊(hash)來存資料的,而且Set的實現其實就是維護了一個對應的Map(如HashSet就是構造一個HashMap),Set的值就是Map的鍵。所以這裡只討論TreeMap和HashMap。

TreeMap實現put和get

 TreeMap主要是通過紅黑樹實現的。這裡要求Key是實現了Comparable介面的。所以在TreeMap內部,就是通過compare方法來判斷是否放入的鍵相同。以及你通過get獲取元素時,也是通過compare方法來查詢的。所以同一個物件的多個例項是否能同時存入Map/Set,就要看你如何定義compare方法了。

HashMap實現put和get

 HashMap以及其優化類,都是通過計算雜湊值來查詢的。大概方式是,所有的key會算出一個hashcode,根據這個hashcode得到在容器內部的槽位(這裡注意hashcode不要求唯一,因為即使有多個key在同一個槽位,也可以通過一個線性查詢來獲得最後結果),然後如果有put或者get方法,不外乎就是通過equals方法來看這個槽位中的其他key和要進行操作的是否相等,如果相等說明已經存在,對於put,則無法插入,對於get,則會進一步返回這個key的value。

 所以你會發現,當一個HashMap(或者HashSet)中的Key是一個物件時,那麼主要看這個物件對於hashcode和equals方法的重寫了。一般的,如果沒有重寫,直接繼承Objec類的方法,那麼hashcode是取得地址,equals方法是比較地址值。所以自然對於最開始的問題,是可以把兩個例項放到同一個set中去的,因為他們有不同的地址,當然當你重寫了hashcode和equals方法就不一定了(事實上,如果你需要用到自定義的類做Key或者放到Set中去,你需要注意是否需要重寫hashcode和equals方法)。

相關推薦

JavaMapSet容器如何物件

 之前看到過這樣一個問題,大概是:能否把一個物件(自定義,沒有任何方法)的兩個例項同時存放到同一個Set中去?  當時很懵,但是這幾天偶然看了Set和Map的原始碼就比較明瞭了。這裡總結一下。  首先,大體上為了儲存,有通過樹來存資料的,也有通過雜湊(has

javaMapSet的底層分析

1.HashSet底層是使用HashMap實現的。當使用add方法將物件新增到Set當中時,實際上是將該物件作為底層所維護的Map物件的key,而value則都是同一個Object物件(該物件我們用不上);其他的都是通過定義的HashMap物件實現的。 2.HashMap

JavaMapSet之間的關係(及Map.Entry)

1、通過查詢API文件: 2、Map.Entry是一個介面,所以不能直接例項化。 3、Map.entrySet( )返回的是一個collection集合,並且,這個collection中的元素是Map.Entry型別,如下圖所示: 4、 Map是Java中的

JavaMap, List, SetQueue的區別使用場景

1. Java集合類基本概念 在程式設計中,常常需要集中存放多個數據。從傳統意義上講,陣列是我們的一個很好的選擇,前提是我們事先已經明確知道我們將要儲存的物件的數量。一旦在陣列初始化時指定了這個陣列長度,這個陣列長度就是不可變的,如果我們需要儲存一個可以動態增長的資

javamap表單字串相互轉換

一、需求 serialnum=123456&data=357c0a04f&enable=true&key=b5b806d0dc9 帶有&分割的字串,轉化為map的key、value型別儲存,反之也行。 二、程式碼 import java.util.

JavaListset的區別

Java中List和set的區別 首先要知道 set和list都是集合介面 list ——其中的值允許重複,因為它是有自己的排序規則的資料結構 Set——其中的值不允許重複,無序的資料結構 知道了資料結構就得了解: List適合經常追加資料,插入,刪除資料。但隨機取數效率比較

javaString new String還有物件的String字串在記憶體的儲存

一直以來,所有人都說,java中的String型別是不可變的,可是為什麼不可變確很少有人說的透徹,String和new String的區別,物件中的String和直接定義一個String是否有區別,一直都是一知半解。看了很多文件都是各種猜測,沒有具體程式碼來

C++mapset的使用與區別

set set是一種關聯式容器,其特性如下: set以RBTree作為底層容器 所得元素的只有key沒有value,value就是key 不允許出現鍵值重複 所有的元素都會被自動排序 不能通過迭代器來改變set的值,因為set的值就是鍵 針對這五點來說,

STLmapset

C++11才開始支援括號初始化!!! 關於STL中的map和set 首先來看一下關聯容器吧 關聯容器迭代器:map的value_type是pair<const key_type, mapped_type>,所以map迭代器只能改變關鍵字對映的值(mapped_type),不能

STL map set 的知識點總結

STL中的容器有順序容器 (vector,list,deque),關聯容器(map,set)還有一些其他容器。 根據不同的場合選擇不同的容器,會有意想不到的收穫。 Map是單詞mapping(對映)的縮寫 Set是單詞set(集合)的意思; Map和set內部的元素不可以重

JavaMapList組合使用的例子

使用Java很方便的一條就是Java封裝了很多方便使用的Map和List。 這是我在開發過程中遇到的問題,通過傳入的字串封裝成List<Map<String, String>>格式,然後進行想要的操作,奉上程式碼! /* 輸入引數: * [{"

javaMapList初始化的兩種方法

第一種方法(常用方法): //初始化List List<string> list = new ArrayList</string><string>

Java陣列集合容器的剖析

java中常用的儲存容器就是陣列的集合,每種容器儲存的形式和結構又有所不同。 陣列,是最基礎的容器,在建立陣列的時候有三種方式分別如下: int[] arr = new int[5]; int[] arr = new String[]{1,2,3,4,5}; in

Java集合面試題(02) JavaListSet之間區別

本文為本博主翻譯,未經允許,嚴禁轉載! 簡介 Java中List和Set之間有什麼區別是一個非常流行的Java集合面試問題,也是在Java中使用Collection類時要記住的一個重要的基本概念。 List和Set都是Java程式最重要的Collection類中的兩個,以及

javalistset的區別與聯絡

此文章是看別的大牛整理之後,自己學習進行消化後,對子自己的理解和得到的內容的一個總結。       介面Collection       Collection是java.util下的一個介面,它繼承的類是Iterable<E>。它是關於集合方面的一個跟介面,也就

Java物件物件bean、list集合、物件陣列、MapSet以及字串轉換成Json

把Java對常用的一些資料轉換成Json,以便前臺的呼叫. 物件轉換為Json public class ConvertJson { /** * 物件轉換為Json * @param obj * @

JavaList,SetMap詳解及其區別

內部 特殊 set contain 快速查找 簡單 rar dset 維護 Java中的集合包括三大類,它們是Set(集)、List(列表)和Map(映射),它們都處於java.util包中,Set、List和Map都是接口,它們有各自的實現類。Set的實現類主要有Hash

Java集合類set、Listmap的遍歷方式

Java中集合類的遍歷方式 Java中集合分為set、List和map。 1.set集合 set集合常用的有兩種遍歷方式: Set<String>  set = new HashSet<String>(); 第一種利用for迴圈: for(S

javalist、setmap 的區別

List的功能方法   實際上有兩種List: 一種是基本的ArrayList,其優點在於隨機訪問元素,另一種是更強大的LinkedList,它並不是為快速隨機訪問設計的,而是具有一套更通用的方法。   List : 次序是List最重要的特點:它保證維護元素特定的順序。List為Colle

Javaarray、Set、ListMap的比較總結

array、List、Set、Map的區別: 1、array:陣列,可以儲存物件和基本資料型別,長度固定。 2、Collection介面:集合(單列),用於儲存物件、不能儲存基本資料型別(int,char等),但可以儲存基本資料型別包裝類(int-Integer,char-