在回顧js數(shù)據(jù)結(jié)構(gòu),寫《再談js對象數(shù)據(jù)結(jié)構(gòu)底層實現(xiàn)原理-object array map set》系列的時候,在來整理下java的數(shù)據(jù)結(jié)構(gòu)。
目前創(chuàng)新互聯(lián)建站已為數(shù)千家的企業(yè)提供了網(wǎng)站建設、域名、虛擬主機、綿陽服務器托管、企業(yè)網(wǎng)站設計、昆都侖網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。java把內(nèi)存分兩種:一種是棧內(nèi)存,另一種是堆內(nèi)存
基本類型在棧區(qū)分配空間,java的基本數(shù)據(jù)類型共有8種,即int,short,long,byte,float,double,boolean,char(注意,并沒有String的基本類型 )。由于大小可知,生存期可知(這些字面值定義在某個程序塊里面,程序塊退出后,字段值就消失了),出于追求速度的原因,就存在于棧中。
所有的對象都在堆(Heap)中分配空間,關鍵字new為每個對象申請內(nèi)存空間(基本類型除外),對象的釋放是由垃圾回收機制決定和執(zhí)行的,這樣做確實簡化了程序員的工作。但同時,它也加重了JVM的工作。因為,GC為了能夠正確釋放對象,GC必須監(jiān)控每一個對象的運行狀態(tài),包括對象的申請、引用、被引用、賦值等,GC都需要進行監(jiān)控。
不要在經(jīng)常調(diào)用的方法中或在循環(huán)中創(chuàng)建對象。可以適當?shù)氖褂胔ashtable,vector創(chuàng)建一組對象容器,然后從容器中去取那些對象,而不用每次new之后又丟棄。盡量避免在類的構(gòu)造函數(shù)里創(chuàng)建、初始化大量的對象,防止在調(diào)用其自身類的構(gòu)造器時造成不必要的內(nèi)存資源浪費,尤其是大對象
基本類型都有對應的包裝類:如int對應Integer類,double對應Double類等,基本類型的定義都是直接在棧中,如果用包裝類來創(chuàng)建對象,就和普通對象一樣了。例如:int i=0;i直接存儲在棧中。Integer i(i此時是對象)= new Integer(5);這樣,i對象數(shù)據(jù)存儲在堆中,i的引用存儲在棧中,通過棧中的引用來操作對象。大量使用字符串處理,避免使用String,應大量使用StringBuffer,因為String被設計成不可變(immutable)類,所以它的所有對象都是不可變對象
當定義一個數(shù)組,int x[];或int[] x;時,在棧內(nèi)存中創(chuàng)建一個數(shù)組引用,通過該引用(即數(shù)組名)來引用數(shù)組。x=new int[3];將在堆內(nèi)存中分配3個保存 int型數(shù)據(jù)的空間,堆內(nèi)存的首地址放到棧內(nèi)存中,每個數(shù)組元素被初始化為0。
用static的修飾的變量和方法,實際上是指定了這些變量和方法在內(nèi)存中的”固定位置”-static storage,可以理解為所有實例對象共有的內(nèi)存空間。static變量有點類似于C中的全局變量的概念;靜態(tài)表示的是內(nèi)存的共享,就是它的每一個實例都指向同一個內(nèi)存地址。把static拿來,就是告訴JVM它是靜態(tài)的,它的引用(含間接引用)都是指向同一個位置,在那個地方,你把它改了,它就不會變成原樣,你把它清理了,它就不會回來了。
那靜態(tài)變量與方法是在什么時候初始化的呢?對于兩種不同的類屬性,static屬性與instance屬性,初始化的時機是不同的。instance屬性在創(chuàng)建實例的時候初始化,static屬性在類加載,也就是第一次用到這個類的時候初始化,對于后來的實例的創(chuàng)建,不再次進行初始化。
盡量少用靜態(tài)變量,因為靜態(tài)變量是全局的,GC不會回收的。
1 長度限制之別
數(shù)組長度是固定不變的,
集合的大小是可動態(tài)變化的
2 存儲類型之別
一個數(shù)組存儲的元素可以是基本類型,也可以是引用類型,且只能存儲同一種類型的元素
一個集合存儲的元素只能是引用類型,但集合可以存儲不同類型的元素(但集合一般存儲同一種類型,可以用泛型加以控制)
3 訪問元素方式
數(shù)組是根據(jù)索引來獲取元素的
集合通常會提供一個迭代器來方便訪問元素
若程序時不知道究竟需要多少對象,需要在空間不足時自動擴增容量,則需要使用容器類庫,array不適用。
java集合是什么?
Java集合類存放于 java.util 包中,是一個用來存放對象的容器。
長度限制之別:集合只能存放對象。比如你存一個 int 型數(shù)據(jù) 1放入集合中,其實它是自動轉(zhuǎn)換成 Integer 類后存入的,Java中每一種基本類型都有對應的引用類型。
集合存放的是多個對象的引用,對象本身還是放在堆內(nèi)存中。
集合可以存放不同類型,不限數(shù)量的數(shù)據(jù)類型。
史上最全Java集合關系圖??,java集合關系UML類圖vsdx原圖。
Collection
? |-----List有序,可重復(存儲順序和取出順序一致)
? |--|----LinkedList底層使用雙向鏈表實現(xiàn),查詢慢,增刪快。效率高
? |--|----ArrayList底層使用數(shù)組實現(xiàn),查詢快,增刪慢。效率高。
? |? |? ? ? ? 每次容量不足時,自增長度的一半,如下源碼可知
? |? |? ? ? ? ? int newCapacity = oldCapacity + (oldCapacity >> 1);
? |--|----Vector底層使用數(shù)組實現(xiàn),線程安全,查詢快,增刪慢。效率低。
? |? |? ? ? ? 每次容量不足時,默認自增長度的一倍(如果不指定增量的話),如下源碼可知
? |? |? ? ? ? ? int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
? |? |? ? ? ? ? ? ? ? ? ? ? ? ? ? capacityIncrement : oldCapacity);
? |-----Set ?元素唯一(最多包含一個 null 元素),只能通過游標來取值,線程不安全
?HashSet比TreeSet高效(尤其是查詢、添加),LinkedHashSet比hash插入、刪除慢,但是遍歷快。
? |--|--HashSet底層是由HashMap實現(xiàn)的,線程非安全,通過對象的hashCode方法與equals方法來保證插入元素的唯一性,無序(存儲順序和取出順序不一致)?
? |--|--|--LinkedHashSet底層數(shù)據(jù)結(jié)構(gòu)由哈希表和鏈表組成。哈希表保證元素的唯一性,鏈表保證元素有序。(存儲和取出是一致)
? |--|--TreeSet基于 TreeMap 的 NavigableSet 實現(xiàn)。非同步,排序,元素唯一。?保持有序的set使用(使用元素的自然順序?qū)υ剡M行排序,或者根據(jù)創(chuàng)建 set 時提供的 Comparator 進行排序(紅黑數(shù)維護次序)
Map?是鍵值對集合,key 不允許重復,value 可以
? |-----HashMap基于鏈表和紅黑樹:hashMap用hash表實現(xiàn)的Map,就是利用對象的hashcode(hashcode()是Object的方法)進行快速散列查找。Null可以做主鍵,但只能有一個
? |-----TreeMap基于紅黑樹
? |-----LinkedHashMapHashMap+LinkedList
? |-----HashTable?線程安全,不允許有null值的存在
只有Vector,HashTable是線程安全的
ArrayList,LinkedList,HashSet,TreeSet,HashMap,TreeMap都不是線程安全的。
如果沒有必要,推薦代碼只同List,Map接口打交道.
HashMap的輸出順序是隨機的,TreeMap中的條目是按鍵值的升序排列的,LinkedHashMap是按元素最后一次被訪問的時間從早到晚排序的
簡明圖
boolean?add(E?e) ????確保此?collection?包含指定的元素(可選操作)。 boolean?addAll(Collection?c) ????將指定?collection?中的所有元素都添加到此?collection?中(可選操作)。 void?clear() ????移除此?collection?中的所有元素(可選操作)。 boolean?contains(Object?o) ????如果此?collection?包含指定的元素,則返回?true。 boolean?containsAll(Collection?c) ????如果此?collection?包含指定?collection?中的所有元素,則返回?true。 boolean?equals(Object?o) ????比較此?collection?與指定對象是否相等。 int?hashCode() ????返回此?collection?的哈希碼值。 boolean?isEmpty() ????如果此?collection?不包含元素,則返回?true。 Iterator?iterator() ????返回在此?collection?的元素上進行迭代的迭代器。 boolean?remove(Object?o) ????從此?collection?中移除指定元素的單個實例,如果存在的話(可選操作)。? boolean?removeAll(Collection?c) ????移除此?collection?中那些也包含在指定?collection?中的所有元素(可選操作)。 boolean?retainAll(Collection?c) ????僅保留此?collection?中那些也包含在指定?collection?的元素(可選操作)。 int?size() ????返回此?collection?中的元素數(shù)。 Object[]?toArray() ????返回包含此?collection?中所有元素的數(shù)組。?T[] ????toArray(T[]?a)
特有方法(相對于Collection—繼承自Collection)
void?add(int?index,?E?element) ????在列表的指定位置插入指定元素(可選操作)。 boolean?addAll(int?index,?Collection?c) ????將指定?collection?中的所有元素都插入到列表中的指定位置(可選操作)。 int?indexOf(Object?o) ????返回此列表中第一次出現(xiàn)的指定元素的索引;如果此列表不包含該元素,則返回?-1。 int?lastIndexOf(Object?o) ????返回此列表中最后出現(xiàn)的指定元素的索引;如果列表不包含此元素,則返回?-1。 ListIterator?listIterator() ????返回此列表元素的列表迭代器(按適當順序)。 ListIterator?listIterator(int?index) ????返回列表中元素的列表迭代器(按適當順序),從列表的指定位置開始。 E?get(int?index) ????返回列表中指定位置的元素。 E?remove(int?index) ????移除列表中指定位置的元素(可選操作)。 E?set(int?index,?E?element) ????用指定元素替換列表中指定位置的元素(可選操作)。 List?subList(int?fromIndex,?int?toIndex) ????返回列表中指定的?fromIndex(包括?)和?toIndex(不包括)之間的部分視圖。
原文鏈接:https://www.zhoulujun.cn/html/java/javaBase/159.html 排版效果可能更好,本文若有不妥之處,請留言告知,拜謝!
參考文章:
java 集合詳解?https://www.cnblogs.com/ysocean/p/6555373.html
java集合詳解與基本使用方法?https://blog.csdn.net/qq_34232889/article/details/79997471
圖解Java常用數(shù)據(jù)結(jié)構(gòu)?https://www.jianshu.com/p/fb4fb24ecc8f
java中的集合和數(shù)組?https://www.cnblogs.com/summers/p/4094260.html
集合的線程安全性?https://www.cnblogs.com/wuchaodzxx/p/6007970.html
Set與線程安全?https://blog.csdn.net/l153097889/article/details/77891250
java常用數(shù)據(jù)結(jié)構(gòu)及特點 https://blog.csdn.net/hujiangtaochn/article/details/84136432
Java集合框架之圖解 https://www.cnblogs.com/SamSarah/p/4893217.html
java.util包中集合詳解?https://www.jianshu.com/p/4bb01e139cda
使Cache命中率最高的替換算法是什么?替換最近最少使用的塊算法
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。