再談Java數據結構—分析底層實現與應用注意事項

在回顧js數據結構,寫《再談js對象數據結構底層實現原理-object array map set》系列的時候,在來整理下java的數據結構。html

java把內存分兩種:一種是棧內存,另外一種是堆內存java

  • 基本類型在棧區分配空間,java的基本數據類型共有8種,即int,short,long,byte,float,double,boolean,char(注意,並無String的基本類型 )。因爲大小可知,生存期可知(這些字面值定義在某個程序塊裏面,程序塊退出後,字段值就消失了),出於追求速度的緣由,就存在於棧中。git

  • 全部的對象都在堆(Heap)中分配空間,關鍵字new爲每一個對象申請內存空間(基本類型除外),對象的釋放是由垃圾回收機制決定和執行的,這樣作確實簡化了程序員的工做。但同時,它也加劇了JVM的工做。由於,GC爲了可以正確釋放對象,GC必須監控每個對象的運行狀態,包括對象的申請、引用、被引用、賦值等,GC都須要進行監控。程序員

    不要在常常調用的方法中或在循環中建立對象。能夠適當的使用hashtable,vector建立一組對象容器,而後從容器中去取那些對象,而不用每次new以後又丟棄。儘可能避免在類的構造函數裏建立、初始化大量的對象,防止在調用其自身類的構造器時形成沒必要要的內存資源浪費,尤爲是大對象
    github

包裝類

基本類型都有對應的包裝類:如int對應Integer類,double對應Double類等,基本類型的定義都是直接在棧中,若是用包裝類來建立對象,就和普通對象同樣了。例如:int i=0;i直接存儲在棧中。Integer i(i此時是對象)= new Integer(5);這樣,i對象數據存儲在堆中,i的引用存儲在棧中,經過棧中的引用來操做對象。大量使用字符串處理,避免使用String,應大量使用StringBuffer,由於String被設計成不可變(immutable)類,因此它的全部對象都是不可變對象web

數組

當定義一個數組,int x[];或int[] x;時,在棧內存中建立一個數組引用,經過該引用(即數組名)來引用數組。x=new int[3];將在堆內存中分配3個保存 int型數據的空間,堆內存的首地址放到棧內存中,每一個數組元素被初始化爲0。算法

靜態變量

用static的修飾的變量和方法,其實是指定了這些變量和方法在內存中的」固定位置」-static storage,能夠理解爲全部實例對象共有的內存空間。static變量有點相似於C中的全局變量的概念;靜態表示的是內存的共享,就是它的每個實例都指向同一個內存地址。把static拿來,就是告訴JVM它是靜態的,它的引用(含間接引用)都是指向同一個位置,在那個地方,你把它改了,它就不會變成原樣,你把它清理了,它就不會回來了。數組

那靜態變量與方法是在何時初始化的呢?對於兩種不一樣的類屬性,static屬性與instance屬性,初始化的時機是不一樣的。instance屬性在建立實例的時候初始化,static屬性在類加載,也就是第一次用到這個類的時候初始化,對於後來的實例的建立,再也不次進行初始化。安全

儘可能少用靜態變量,由於靜態變量是全局的,GC不會回收的。數據結構


webp

數組Array和集合的區別

  • 1 長度限制之別

    • 數組長度是固定不變的

    • 集合的大小是可動態變化的

  • 2 存儲類型之別

    • 一個數組存儲的元素能夠是基本類型,也能夠是引用類型,且只能存儲同一種類型的元素

    • 一個集合存儲的元素只能是引用類型,但集合能夠存儲不一樣類型的元素(但集合通常存儲同一種類型,能夠用泛型加以控制)

  • 3 訪問元素方式

    • 數組是根據索引來獲取元素的

    • 集合一般會提供一個迭代器來方便訪問元素

若程序時不知道究竟須要多少對象,須要在空間不足時自動擴增容量,則須要使用容器類庫,array不適用

java集合是什麼?

Java集合類存放於 java.util 包中,是一個用來存放對象的容器。

  1. 長度限制之別:集合只能存放對象。好比你存一個 int 型數據 1放入集合中,其實它是自動轉換成 Integer 類後存入的,Java中每一種基本類型都有對應的引用類型。

  2. 集合存放的是多個對象的引用,對象自己仍是放在堆內存中

  3. 集合能夠存放不一樣類型,不限數量的數據類型

史上最全Java集合關係圖  ,java集合關係UML類圖vsdx原圖



Collection

    |-----List  有序,可重複(存儲順序和取出順序一致)

    |--|----LinkedList 底層使用雙向鏈表實現查詢慢,增刪快。效率高

    |--|----ArrayList 底層使用數組實現查詢快,增刪慢。效率高。

    |  |        每次容量不足時,自增加度的一半,以下源碼可知

    |  |          int newCapacity = oldCapacity + (oldCapacity >> 1);

    |--|----Vector 底層使用數組實現,線程安全查詢快,增刪慢。效率低。

    |  |        每次容量不足時,默認自增加度的一倍(若是不指定增量的話),以下源碼可知

    |  |          int newCapacity = oldCapacity + ((capacityIncrement > 0) ?

    |  |                            capacityIncrement : oldCapacity);

    |-----Set   元素惟一(最多包含一個 null 元素),只能經過遊標來取值,線程不安全

           HashSet比TreeSet高效(尤爲是查詢、添加),LinkedHashSet比hash插入、刪除慢,可是遍歷快。

    |--|--HashSet 底層是由HashMap實現的,線程非安全,經過對象的hashCode方法與equals方法來保證插入元素的惟一性,無序(存儲順序和取出順序不一致) 

    |--|--|--LinkedHashSet 底層數據結構由哈希表和鏈表組成。哈希表保證元素的惟一性,鏈表保證元素有序。(存儲和取出是一致)

    |--|--TreeSet 基於 TreeMap 的 NavigableSet 實現非同步,排序,元素惟一。 保持有序的set使用(使用元素的天然順序對元素進行排序,或者根據建立 set 時提供的 Comparator 進行排序(紅黑數維護次序)

Map 是鍵值對集合,key 不容許重複,value 能夠

    |-----HashMap 基於鏈表和紅黑樹:hashMap用hash表實現的Map,就是利用對象的hashcode(hashcode()是Object的方法)進行快速散列查找。Null能夠作主鍵,但只能有一個

    |-----TreeMap 基於紅黑樹

    |-----LinkedHashMap HashMap+LinkedList

    |-----HashTable 線程安全,不容許有null值的存在

java集合框架歸納

只有Vector,HashTable是線程安全的

ArrayList,LinkedList,HashSet,TreeSet,HashMap,TreeMap都不是線程安全的。

若是沒有必要,推薦代碼只同List,Map接口打交道.

HashMap的輸出順序是隨機的,TreeMap中的條目是按鍵值的升序排列的,LinkedHashMap是按元素最後一次被訪問的時間從早到晚排序的


 




簡明圖

java集合框架圖


Collection||Set泛型接口方法摘要

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 中的元素數。
Object[] toArray()
    返回包含此 collection 中全部元素的數組。 T[]
    toArray(T[] a)

List泛型接口

特有方法(相對於Collection—繼承自Collection)

void add(int index, E element)
    在列表的指定位置插入指定元素(可選操做)。
boolean addAll(int index, Collection c)
    將指定 collection 中的全部元素都插入到列表中的指定位置(可選操做)。
int indexOf(Object o)
    返回此列表中第一次出現的指定元素的索引;若是此列表不包含該元素,則返回 -1。
int lastIndexOf(Object o)
    返回此列表中最後出現的指定元素的索引;若是列表不包含此元素,則返回 -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 集合詳解 http://www.javashuo.com/article/p-fmeucxbu-bs.html

java集合詳解與基本使用方法 https://blog.csdn.net/qq_34232889/article/details/79997471

圖解Java經常使用數據結構 https://www.jianshu.com/p/fb4fb24ecc8f

java中的集合和數組 http://www.javashuo.com/article/p-uhjdeaik-du.html

集合的線程安全性 http://www.javashuo.com/article/p-satpjtfw-cr.html

Set與線程安全 https://blog.csdn.net/l153097889/article/details/77891250

java經常使用數據結構及特色 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命中率最高的替換算法是什麼?替換最近最少使用的塊算法

相關文章
相關標籤/搜索