hashset源碼
A. java的LinkedHashSet是怎樣實現存取有序的, 底層原理是什麼
LinkedHashSet 的實現
對於 LinkedHashSet 而言,它繼承與 HashSet、又基於 LinkedHashMap 來實現的。
LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素,它繼承與 HashSet,其所有的方法操作上又與 HashSet 相同,因此 LinkedHashSet 的實現上非常簡單,只提供了四個構造方法,並通過傳遞一個標識參數,調用父類的構造器,底層構造一個 LinkedHashMap 來實現,在相關操作上與父類 HashSet 的操作相同,直接調用父類 HashSet 的方法即可。
需要注意理解的點是:
LinkedHashSet 是 Set 的一個具體實現,其維護著一個運行於所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可為插入順序或是訪問順序。
LinkedHashSet 繼承與 HashSet,並且其內部是通過 LinkedHashMap 來實現的。有點類似於我們之前說的LinkedHashMap 其內部是基於 Hashmap 實現一樣,不過還是有一點點區別的(具體的區別大家可以自己去思考一下)。
如果我們需要迭代的順序為插入順序或者訪問順序,那麼 LinkedHashSet 是需要你首先考慮的。
B. 集合競價選股公式源碼
1.集合競價選股公式源碼為:
N:=95;
開幅%:(O-REF(C,1))/REF(C,1)*100,NODRAW;
去ST股:=IF(NAMELIKE('S'),0,1);
去ST股1:=IF(NAMELIKE('*'),0,1);
去停牌:=DYNAINFO(17)>0;
流通值:=FINANCE(40)/100000000;
一字板:=C/REF(C,1)>1.0975 AND H=L;
TJA:=REF(WINNER(C)*100,1)>=N AND WINNER(O)*100>=N AND BETWEEN(開幅%,3,9) AND 去ST股 AND 去ST股1 AND 流通值<100000 {AND NOT( 一字板)};
2.股票集合競價是指每個交易日上午的9:15到9:25,由投資者按照自己的目標價格,買賣申請不受任何限制。之所以要進行股票集合競價,目的就是確定開盤價,就是在9:30股市開市時間到達時的首個價格。
3.對於下面的3條競價規則,一般這個價格都需要遵守:
1)在這個價格的成交量是最大的;
2)買這個或者賣這個的,任何一方所出的價格跟這個一樣的話,有一邊必須要全部成交;
3)比這個價高的買入申請以及比這個價低的賣出申請在最後的階段都要保證完成交易。
拓展資料:
1.集合競價時間不止一段,而是有兩段,在不同的時間段里可以進行不同的操作:
2.第一個時間段9:15-9:20:申報和撤銷都可以進行,匹配成交量在這個時間段是虛假的信息,那是因為在這個時間段里完成的成交是可以撤單的。在開始的前幾分鍾,股票的價格會隨著大單的買入而升高,但是時間在9:20左右,大單就又撤單了,這個時候我們再想撤單就來不及了。正是這個原因,大家要提高注意力,擦亮自己的眼睛,別中了主力的圈套。
C. java集合:關於hashmap存儲一個對象,中間改變對象的值,為什麼再remove不能用新名字來刪除
這個得看hashset的源碼了,內部會以hashcode或其經過某種演算法得到的二次hash值為key來組織存儲數據。
你重寫了book的hashcode方法,並且內部用到了name來計算hashcode,那麼當你修改了name後,它的hashcode自然變了,那麼它就在原來的hashset里找不到了,自然刪除不掉。
D. ArrayList.removeAll() vs HashSet.removeAll()
這個東西很多人一看就知道原理,哈哈,無奈在下菜菜一枚,記錄下以加深印象吧!有不當之處,歡迎大牛批評指正~
其實看標題就知道二者肯定 HashSet更勝一籌,工作中經常遇到 大數據量的 removeAll()操作,以前習慣性用 list,後來數據量大的時候發現效率極低,下面是一些測試和源碼分析。
採用 hashSet 代替 arrayList 進行稍大數據量 removeAll 的場景,依據如下:
a、進行了增量測試,測試數據集范圍從 1000-->500000 觀察 二者的耗時
b、看一下二者 removeAll的操作源碼
arrayList: A.removeAll(B)
hashSet: A.removeAll(B)
E. 誰可以說出HashMap和HashSet的相同點和不同點。
Map集合,就是有一對屬性值的集合,屬性包含key,和value。關鍵字key是唯一不重復的。Map是一個有序的集合,所以查詢起來速度很快。而HashSet就像是把HashMap中value去掉,說白了就是只有一個key的HashMap集合。Set是數學中定義的集合,所以元素無序, 且不能重復添加。java程序中Set集合用的不多,Map集合中的HashMap集合,List集合用的倒是不少,有時間的話不如多研究研究ArrayList,LinkedList,HashMap三個集合,希望這些對你有用。
F. 為什麼學習集合關系
集合可以說是學習 Java 中最重要的一塊知識點了,無論做任何業務系統,集合總是最為基礎的那塊 API。我第一次接觸集合,是在我大三的時候,那時候去面試,面試官問我:你了解過集合嗎?可惜那時候沒什麼項目經驗,所以基本沒有了解過,因此也錯失了機會。
到了現在,我已經工作了5年了,也做過了大大小小十幾個項目。這些項目中有簡單的 SSH 項目,也有分布式高並發的復雜項目。無論在哪個項目中,關於集合的時候是必不可少的。但我現在慢慢回顧過去做的項目,我發現自己使用到的集合還是比較少,基本上只有:ArrayList、HashSet、HashMap 這幾個。
但當我開始深入去了解 JDK 集合的整個體系時,我發現之前的我了解得確實非常淺顯。例如關於 List 的實現有 ArrayList、LinkedList、Vector、Stack 這四種實現,但我們很多時候只是直接使用 ArrayList,而不是根據場景去選擇。
1.學習集合源碼,能夠讓我們使用得更加准確。
當我們深入學習了源碼之後,我們就能夠了解其特性,從而能夠根據我們的使用場景去做出更好的選擇,從而讓我們的代碼運行效率更高。
我們舉一個最簡單的例子 —— ArrayList 和 LinkedList。它們兩者底層採用了完全不同的實現方式,ArrayList 使用數組實現,而 LinkedList 則使用鏈表實現。這使得 ArrayList 的讀取效率高,而 LinkedList 的讀取效率低。但因為 LinkedList 採用鏈表實現,所以其增加和刪除比較方便,而 ArrayList 則比較麻煩。所以 ArrayList 比較適合用於讀場合較多的情況,而 LinkedList 比較適合用於增加、刪除較多的場景。
我們來看另外一個例子 —— HashMap 和 TreeMap。乍看之下,他們都是 Map 集合的實現,但是它們內部有著截然不同的實現。HashMap 是 Map 介面的哈希實現,其內部使用了鏈表和紅黑樹實現。而 TreeMap 是 Map 介面的有序實現,其內部使用了紅黑樹實現。所以 HashMap 一般用來存儲 key、value 的實現,而 TreeMap 常用存儲需要排序的元素。
除了我們舉的這兩個例子之外,還有許多這樣的例子,比如:HashMap 與 LinkedHashMap 的區別,HashMap 與 WeakHashMap 的區別,LinkedList 與 ArrayDeque 的區別。
2.學習集合源碼,讓我們學習經典的設計方式。
在集合的整個架構設計中,其類繼承體系非常簡單,但是卻很經典。例如:Collection 介面設計了集合通用的操作,每個集合類型都有對應的介面(List、Set、Map),每個集合類型都有對應的抽象實現(AbstractList、AbstractSet、AbstractMap)等。
當我們閱讀這些源碼的時候,這種設計方式都會潛移默化地影響我們。當我們之後自己設計一個框架的時候,我們就會不知不覺地用上去。所有的創新都是從模仿開始的,所以閱讀優秀的集合源碼很重要。
3.幫助通過面試,獲得更高的薪酬。
現在關於集合的原理是 Java 工程師面試的家常菜,幾乎每一個企業的面試都會問到。如果你連這塊東西都沒搞清楚,那麼你就不需要聊其他了,直接被幹掉。而如果你能將整個 Java 集合體系清晰地說出去,並且舉一反三地對比,那麼你就比其他人優秀了。
4.學習經典的數據結構。
還記得大學在學習數據結構的時候,我們都是從理論上去記憶。但是當我看完集合源碼之後,我忽然發現——JDK集合源碼簡直就是數據結構的最佳實踐呀!
數據結構中最為基礎的幾個結構為:順序表、單鏈表、雙向鏈表、隊列、棧、二叉堆、紅黑樹、哈希表。這些所有的實現都能在 JDK 集合的實現中找到。例如:ArrayList 就是順序表的實現,LinkedList 就是雙向鏈表的實現,Stack 就是棧的實現,HashMap 就是哈希表的實現,TreeMap 就是紅黑樹的實現,PriorityQueue 就是二叉堆的實現。
5.所有技術的基礎
集合源碼可以說是 JDK 所有源碼中最為簡單的一塊了,而且也是其他所有源碼的基礎。例如線程池的源碼中也大量使用了阻塞隊列,如果你連集合源碼都搞不懂,那麼線程池的源碼你也肯定看不懂的。而如果線程池源碼看不懂,那麼你 netty 的源碼也看不懂的。netty 源碼看不懂,那麼 bbo 的源碼也是看不懂的。
看明白了么?這些技術都是一換扣著一換的。如果你想要後續學習更加快速,那麼你就必須把最基礎的東西學明白了。如果連最基礎的東西都沒學明白,就直接去學其他更復雜的東西,最後只會越來越難,最終逃脫不了放棄的命運。
讀到了這里,我相信你也對集合的重要性有了不一樣的認識。那麼接下來一段時間,就讓我和你一起來深入學學集合源碼吧。如果覺得讀了有用,那麼請給我一個贊吧。你們的贊是我繼續寫下去的動力!
G. java hashset 有方法add(E o)這里的E是什麼類型
這里用的是泛型,如定義 E 為String 類型,就只能添加String類型的
Set<String> set = new HashSet<String>();
set.add("ssss");
hashset
源碼中 方法定義其實就是這樣的 public HashSet(Collection<? extends E> c)
網路下 java 泛型 這個不是那麼好理解 多看資料
我本軍團為你解答
H. java.util.HashSet為什麼要用Map來實現每次put中還要裝進一個假value值,不是占空間嗎
你可以看一下源碼,在源碼里 hashset put 的每一個 entry 里,值是一個名為 PRESENT 的 object,它是 static final 的,也就是說所有的 entry 的值都是一個相同的 object 引用,所以不會佔用太多空間。
至於為什麼要用 map 來實現 set,可能是因為 map 和 set 比較接近,都是 key 值不能相同。這樣做可以減少代碼的重復,方便維護。
參考1:網頁鏈接
參考2:網頁鏈接
I. java中set集合中元素不重復是根據什麼來判斷的
可以考慮如下定義方式:
>> syms a b c d %%%%% 定義符號變數
>> a = [a b;c d] %%%%% 產生矩陣
a =
[ a, b]
[ c, d]
>> subs(a,{a,b,c,d},{1 2 3 4}) %%%%%%% 變數賦值
ans =
1 2
3 4
補充回答,也可以採用結構變數的方法,例如:
>> a = struct('x1',0,'x2',0,'x3',0,'x4',0); %%%%%% 定義結構變數a,並初始化
>> b = [a.x1 a.x2;a.x3 a.x4] %%%%%% 獲取初始化矩陣
b =
0 0
0 0
>> a.x1 = 5; %%%%%% 變數賦值
>> a.x2 = 6;
>> a.x3 = 7;
>> a.x4 = 8;
>> b = [a.x1 a.x2;a.x3 a.x4] %%%%% 新矩陣
b =
5 6
7 8
變數a,矩陣B
直接寫B(X,Y)=a就行
/**
* Adds the specified element to this set if it is not already present.
* More formally, adds the specified element e to this set if
* this set contains no element e2 such that
* (e==null ? e2==null : e.equals(e2)).
* If this set already contains the element, the call leaves the set
* unchanged and returns false.
*
* @param e element to be added to this set
* @return true if this set did not already contain the specified
* element
*/
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}以上是HashSet.add說明
1
1
J. java iterator循環遍歷集合(比如HashSet)的原理
Iterator<String> it = set.iterator() 這時得到一個迭代器,它的指針位於第一個元素之前。
然後我們不停地 hasNext() 再 next 得到值,當hasNext 為 false 時當然就不能去 next 了。
這背後的位置索引是在迭代器內部記錄著的,我們不能直接改它的值,只能 next 去下一個。
不過像 ListIterator 則是雙向的,可以 previous。遞增遞減都是由 next / previous 方法來操作的。