成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Android中的容器

roland_reed / 3346人閱讀

摘要:包提供了兩種比常用很多,原因是查找更容易封裝了一個(gè)數(shù)組數(shù)組的初始化封裝一個(gè)空數(shù)組封裝一個(gè)大小為的數(shù)組數(shù)組如何實(shí)現(xiàn)擴(kuò)容都需要先進(jìn)行擴(kuò)容檢查,類似,對(duì)象調(diào)用方法,要進(jìn)行對(duì)象判空,操作之前要進(jìn)行,線程檢查擴(kuò)容檢查增加的大小與數(shù)組比較計(jì)算數(shù)組擴(kuò)容的

List

java.util包提供了兩種

ArrayList
LinkedList

ArrayList比LinkedList常用很多,原因是:
ArrayList查找更容易

ArrayList

ArrayList封裝了一個(gè)數(shù)組Object[]

數(shù)組的初始化

ArrayList array = new ArrayList();

封裝一個(gè)空數(shù)組, {}

ArrayList array = new ArrayList(10);

封裝一個(gè)大小為10的數(shù)組 new Object[10];

數(shù)組如何實(shí)現(xiàn)擴(kuò)容

ArrayList.add/addAll都需要先進(jìn)行擴(kuò)容檢查,
類似,

 對(duì)象調(diào)用方法,要進(jìn)行對(duì)象判空,
 UI操作之前要進(jìn)行,線程檢查
 

擴(kuò)容檢查: size+增加的大小 與 數(shù)組.length 比較
計(jì)算數(shù)組擴(kuò)容的數(shù)組長(zhǎng)度:

??首先,擴(kuò)容至原數(shù)組大小的一倍,size+增加的大 小與其比較:
???????如果大于,擴(kuò)容至原數(shù)組大小的一倍
???????如果小于,擴(kuò)容至size+增加的大小;

private void grow(int minCapacity) {
       // overflow-conscious code
       int oldCapacity = elementData.length;
       int newCapacity = oldCapacity + (oldCapacity >> 1);
       if (newCapacity - minCapacity < 0)
           newCapacity = minCapacity;
       if (newCapacity - MAX_ARRAY_SIZE > 0)
           newCapacity = hugeCapacity(minCapacity);
       // minCapacity is usually close to size, so this is a win:
       elementData = Arrays.copyOf(elementData, newCapacity);
   }

擴(kuò)容使用的是: Array.copyof(array, newLen)

removeAll如何實(shí)現(xiàn)

與remove()不同,remove使用System.copy完成數(shù)組的 部分移動(dòng)

而removeAll,使用的算法:

ArrayList array1 = new ArrayList();
array1.addAll({0,3,5,7,3,6});
int[] array2 = {3,5,4};
array1.removeAll(array2);

首先,遍歷array1中每個(gè)元素,若元素 不在array2內(nèi),將計(jì)數(shù)位置的值設(shè)置為元素的值并將計(jì) 數(shù)+1;

遍歷完成后,計(jì)數(shù)為數(shù)組剩余元素的個(gè) 數(shù),將計(jì)數(shù)之后的元素清空.

算法詳細(xì):

     0,3,5,7,3,6 ;
  遍歷之后,計(jì)數(shù)為2,數(shù)組為0,7,6,7,3,6;
  清空之后,0,7,6,null,null,null;

trimToSize()

數(shù)組擴(kuò)容后即使刪除元素,數(shù)組的length也不會(huì)該改變,

意味著即使刪除了某些元素?cái)?shù)組占用的內(nèi)存大小不會(huì)改變;

數(shù)組只會(huì)不斷的增大,且出現(xiàn)大量null的元素.

trimToSize()方法用于改變數(shù)組的length,將為null的元素釋放掉,等待GC

這也是防止內(nèi)存浪費(fèi)的一種方式,當(dāng)ArrayList經(jīng)歷了多次刪除操作之后,使用trimToSize(),避免內(nèi)存浪費(fèi).

trimToSize()使用Array.copyof()來改變數(shù)組的length

總結(jié)

ArrayList本質(zhì)上維護(hù)了一個(gè)數(shù)組,也就意味者它具有數(shù)組的優(yōu)缺點(diǎn):增刪難,查找易

LinkedList

Node的數(shù)據(jù)結(jié)構(gòu)

Node {
    E element;
    Node prev;
    Node next;
}

基本結(jié)構(gòu)

    Node first, last

Linked是雙向鏈表,first,last指向表頭,表尾

總結(jié)

LinkedList是一個(gè)Deque,雙向鏈表,

增刪易,查找難,造成在編碼中很少使用

Map

java.util包提供了兩種Map:

1.HashMap

2.TreeMap

Android為了性能優(yōu)化,提供了HashMap的替代品:

1.ArrayMap

2.SparseMap

它倆可以在數(shù)據(jù)量都在千級(jí)以內(nèi)的情況下,

??如果key的類型為int,使用SparseMap,

??如果key的類型為其它類型,使用ArrayMap

HashMap相比TreeMap更常用

HashMap

數(shù)據(jù)結(jié)構(gòu)

Node的數(shù)據(jù)結(jié)構(gòu):

Node {
    int hash;
    K key;
    V value;
    Node next;
}

基本數(shù)據(jù)結(jié)構(gòu):

Node[] table;
float loadFoctor;//默認(rèn)值0.75f
int threshold;

可以看出HashMap的數(shù)據(jù)結(jié)構(gòu)是數(shù)組+鏈表

擴(kuò)容

什么時(shí)候擴(kuò)容

當(dāng)調(diào)用put/putAll時(shí),實(shí)際上都是調(diào)用putVal方法

??先創(chuàng)建Node,再查看新的Node放入數(shù)組,還是鏈表;

??當(dāng)++size>threshold,則需要擴(kuò)容

table如何擴(kuò)容

它的擴(kuò)容包含兩個(gè)步驟:

1. 確定擴(kuò)容的大小;
2. 如何移動(dòng)元素,包含數(shù)組中的元素與鏈表中的元素;

??確定擴(kuò)容的大小:

????threshold默認(rèn)值 = 16*0.75f=12

???? 每次擴(kuò)容,

????先創(chuàng)建一個(gè)threadhold大小的數(shù)組,賦給tble,也就是擴(kuò)容至threadhold

????再,threadhold = threadhold <<1,擴(kuò)大一倍



??如何移動(dòng)元素,包含數(shù)組中的元素與鏈表中的元素:

????1.如果元素只在數(shù)組里,而沒有鏈表:

??????新的位置是 e.hash&(newCap-1)

????2.元素在鏈表上:

??????根據(jù)(e.hash & oldCap) == 0 決定是在原位置還是在原位置+oldCap上

??????鏈表可能會(huì)分為兩部分

TreeMap

數(shù)據(jù)結(jié)構(gòu)

TreeMapEntry的數(shù)據(jù)結(jié)構(gòu)

TreeMapEntry {
    K key;
    V value;
    TreeMapEntry left;
    TreeMapEntry right;
    TreeMapEntry parent;
}

TreeMap的數(shù)據(jù)結(jié)構(gòu):

TreeMapEntry root;
Comparator comparator;

TreeMap實(shí)際上是紅黑二叉樹

SparseArray

數(shù)據(jù)結(jié)構(gòu)

int[] mKeys;
Object[] mValues;

總結(jié)

官方推薦去使用SparseArray去替換HashMap,
犧牲了部分效率換來內(nèi)存

ArrayMap LinkedHashMap

可以看作HashMap+LinkedList,用于保證插入順序

一般用于作為緩存

Java中的線程安全的容器 同步容器

Vector

HashTable

并發(fā)容器

用于讀寫分離,實(shí)現(xiàn)讀并發(fā),寫同步

并發(fā)的不同策略:

??1.Blocking容器

??2.CopyOnWrite容器

??3.Concurrent容器

Blocking容器

并發(fā)策略:

??用于解決限制容量的容器的存取問題

??類似生產(chǎn)者-消費(fèi)者

??容器為空時(shí),阻塞取線程

??容器滿時(shí),阻塞存線程

CopyOnWrite容器

并發(fā)策略:

??寫時(shí)賦值,即添加元素時(shí),先復(fù)制整個(gè)容器,添加到復(fù)制的容器中,
??再將容器引用指向復(fù)制的容器,達(dá)到讀的最大并發(fā);
?? 適用于讀多寫少的情況;

Concurrent容器

并發(fā)策略:

??使用分段鎖,首先將容器分成多段,每段使用不同的鎖,對(duì)不同段達(dá)到讀寫并發(fā),相同段讀并發(fā),寫同步

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73644.html

相關(guān)文章

  • 非全屏 Weex 頁面開發(fā)中的 Android 適配

    摘要:代碼中的高度和寬度的單位均為,然而,在手機(jī)屏幕上顯示的高寬卻不一定與代碼指定的相同。原因是框架在底層做了針對(duì)不同屏幕的適配工作,具體計(jì)算公式為實(shí)際高寬代碼高寬屏幕寬度。 weex代碼中的高度和寬度的單位均為px,然而,在手機(jī)屏幕上顯示的高寬卻不一定與代碼指定的相同。原因是weex框架在底層做了針對(duì)不同屏幕的適配工作,具體計(jì)算公式為 實(shí)際高寬 = 代碼高寬 * (屏幕寬度 / 750)。...

    gxyz 評(píng)論0 收藏0
  • 六大布局之LinearLayout

    摘要:什么是界面布局為應(yīng)用程序提供界面架構(gòu)。線性布局指子控件以水平或垂直方式排列,正如其名字一樣,這個(gè)布局中的所有控件在線性方向上依次排列??梢园巡季挚醋魇且粋€(gè)可以放置很多控件的容器,它可以按照一定的規(guī)律調(diào)整控件的位置,從而實(shí)現(xiàn)精美的界面。 1. 什么是Layout? Layout——界面布局,為應(yīng)用程序提供界面架構(gòu)??刂艫ctivity中控件的大小、位置、顏色等屬性的方法. Layout...

    Travis 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<