摘要:中所有方法都是直接或者間接同步的,所以是線程安全的即多個(gè)線程操作同一個(gè)對象時(shí)是線程安全的,但是只有一個(gè)線程操作時(shí)考慮到同步控制會耗費(fèi)系統(tǒng)資源所以效率低。中的所有方法都是線程非同步的,但有多個(gè)線程操作時(shí)是不安全的。
雖是讀書筆記,但是如轉(zhuǎn)載請注明出處http://segmentfault.com/blog/exploring/
..拒絕伸手復(fù)制黨
容器之間的區(qū)別通常歸結(jié)為:由什么在背后“支持”它們,即,所使用的接口是由什么樣的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。
# 對 List 的 選擇:
ArrayList 和 LinkedList 基本的 List 操作是相同的。但是 ArrayList 底層是 數(shù)組實(shí)現(xiàn)的,LinkedList 是雙向鏈表實(shí)現(xiàn)的(其中每個(gè)對象包含數(shù)據(jù)的同時(shí)還包含指向鏈表中前一個(gè)元素和后一個(gè)元素的應(yīng)用)。
因此,如果經(jīng)常在表中插入刪除應(yīng)該使用 LinkedList,如果大量隨機(jī)訪問元素,應(yīng)該使用ArrayList.
最佳的做法可能是將 ArrayList 作為默認(rèn)首選,只有你需要使用額外的功能,或者當(dāng)程序的性能因?yàn)榻?jīng)常插入和刪除變差的時(shí)候,才去選擇LinkedList.
# 對 Set 的選擇
Set 可以被實(shí)現(xiàn)為 TreeSet, HashSet, LinkedHashSet. 可以根據(jù)所需要的行為來選擇不同的接口。
行為: HashSet 最常用,特別添加和查詢元素的時(shí)候速度快;
LinkedHashSet 保持元素的插入順序; 插入操作,LinkedHashSet 比HashSet 代價(jià)更高,這是由維護(hù)鏈表所帶來額外開銷造成的。
TreeSet 基于TreeMap,1. 生成一個(gè)維持元素處于排序狀態(tài)的Set. 只有當(dāng)需要一個(gè)排好序的 Set 時(shí),才應(yīng)該使用TreeSet. 因?yàn)槠鋬?nèi)部結(jié)構(gòu)支持排序。 2. 用 TreeSet 迭代速度比 HashSet 速度快。
# 對 Map 的選擇
除了 IdentityHashMap, 所有的Map實(shí)現(xiàn)插入和刪除操作都會隨著Map尺寸的變大而明顯變慢。但是查找的代價(jià)要比插入小很多。
Hashtable 的性能大體上與 HashMap 相當(dāng),因?yàn)镠ashMap 是用來替代 Hashtable 的,因此他們使用了相同的底層和查找機(jī)制。使用 Map 時(shí)候,第一選擇應(yīng)該是hashmap.
LinkedHashMap 比 HashMap 慢, 代價(jià)更高,這是由維護(hù)散列結(jié)構(gòu)的同時(shí)還要維護(hù)鏈表所帶來額外開銷造成的。
TreeMap 通常比 HashMap 慢。 與使用 TreeSet 一樣,TreeMap 是一種創(chuàng)建有序列表的方式。
IdentityHashMap 具有完全不同的性能,因?yàn)樗褂?== 而不是 equal() 來比較元素。
應(yīng)該避免使用Vector,它只存在于支持遺留代碼的類庫中。
ArrayList 和 Vector 區(qū)別?
Vector 和 ArrayList 都是基于Object[] array 數(shù)組來實(shí)現(xiàn)的,根據(jù)索引來訪問元素。二者最大的區(qū)別就是同步的使用。
Vector 中所有方法都是直接或者間接同步的,所以 Vector 是線程安全的(即多個(gè)線程操作同一個(gè) vector 對象時(shí)是線程安全的),但是只有一個(gè)線程操作時(shí)考慮到同步控制會耗費(fèi)系統(tǒng)資源所以效率低。
ArrayList 中的所有方法都是線程非同步的,但有多個(gè)線程操作時(shí)是不安全的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64239.html
摘要:實(shí)體代碼如下所示恒宇少年碼云用戶名密碼創(chuàng)建內(nèi)添加一個(gè)注冊方法,該方法只是實(shí)現(xiàn)注冊事件發(fā)布功能,代碼如下所示恒宇少年碼云用戶注冊方法省略其他邏輯發(fā)布事件事件發(fā)布是由對象管控的,我們發(fā)布事件前需要注入對象調(diào)用方法完成事件發(fā)布。 ApplicationEvent以及Listener是Spring為我們提供的一個(gè)事件監(jiān)聽、訂閱的實(shí)現(xiàn),內(nèi)部實(shí)現(xiàn)原理是觀察者設(shè)計(jì)模式,設(shè)計(jì)初衷也是為了系統(tǒng)業(yè)務(wù)邏輯之...
摘要:編寫一個(gè)接口創(chuàng)建命名為根據(jù)實(shí)際情況修改創(chuàng)建類,內(nèi)容如下啟動主程序,使用等工具發(fā)起請求,可以看到頁面返回編寫單元測試用例打開的下的測試入口類。 簡介 在您第1次接觸和學(xué)習(xí)Spring框架的時(shí)候,是否因?yàn)槠浞彪s的配置而退卻了?在你第n次使用Spring框架的時(shí)候,是否覺得一堆反復(fù)黏貼的配置有一些厭煩?那么您就不妨來試試使用Spring Boot來讓你更易上手,更簡單快捷地構(gòu)建Spring應(yīng)...
摘要:商品類型實(shí)體恒宇少年碼云商品基本信息實(shí)體恒宇少年碼云接下來我們繼續(xù)創(chuàng)建相關(guān)的。注解是用于標(biāo)注接口抽象類是被自動映射的標(biāo)識,只有存在該注解才會將內(nèi)部的接口方法自動實(shí)現(xiàn)。 MapStruct是一種類型安全的bean映射類生成java注釋處理器。我們要做的就是定義一個(gè)映射器接口,聲明任何必需的映射方法。在編譯的過程中,MapStruct會生成此接口的實(shí)現(xiàn)。該實(shí)現(xiàn)使用純java方法調(diào)用的源和目...
摘要:代碼如下所示自定義業(yè)務(wù)實(shí)現(xiàn)恒宇少年碼云消息內(nèi)容是否顯示消息內(nèi)容,我們內(nèi)的代碼比較簡單,根據(jù)屬性參數(shù)進(jìn)行返回格式化后的字符串。 在我們學(xué)習(xí)SpringBoot時(shí)都已經(jīng)了解到starter是SpringBoot的核心組成部分,SpringBoot為我們提供了盡可能完善的封裝,提供了一系列的自動化配置的starter插件,我們在使用spring-boot-starter-web時(shí)只需要在po...
摘要:在前面的文章中介紹過觀察者模式及并發(fā)編程的基礎(chǔ)知識,為了讓大家更好的了解觀察者模式故而特意寫了這篇番外概述在多線程下我們需要知道當(dāng)前執(zhí)行線程的狀態(tài)是什么比如運(yùn)行,關(guān)閉,異常等狀態(tài)的通知,而且不僅僅是更新當(dāng)前頁面。 在前面的文章中介紹過 觀察者模式 及 并發(fā)編程的基礎(chǔ)知識,為了讓大家更好的了解觀察者模式故而特意寫了這篇番外.. 概述 在Java多線程下,我們需要知道當(dāng)前執(zhí)行線程的狀態(tài)是...
閱讀 3804·2021-09-23 11:32
閱讀 2470·2021-09-06 15:01
閱讀 1631·2021-08-18 10:24
閱讀 3468·2019-12-27 11:44
閱讀 3615·2019-08-30 15:52
閱讀 2522·2019-08-30 11:11
閱讀 696·2019-08-29 17:27
閱讀 608·2019-08-29 16:22