日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android中占容器比例,Android中的容器

發(fā)布時(shí)間:2025/3/15 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android中占容器比例,Android中的容器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

List

java.util包提供了兩種java

ArrayList

LinkedList

ArrayList比LinkedList經(jīng)常使用不少,緣由是:

ArrayList查找更容易算法

ArrayList

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

數(shù)組的初始化緩存 ArrayList array = new ArrayList();

封裝一個(gè)空數(shù)組, {}安全 ArrayList array = new ArrayList(10);

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

性能優(yōu)化

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

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

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

相似,并發(fā) 對(duì)象調(diào)用方法,要進(jìn)行對(duì)象判空,

UI操做以前要進(jìn)行,線程檢查

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

計(jì)算數(shù)組擴(kuò)容的數(shù)組長(zhǎng)度:性能

首先,擴(kuò)容至原數(shù)組大小的一倍,size+增長(zhǎng)的大 小與其比較:

若是大于,擴(kuò)容至原數(shù)組大小的一倍

若是小于,擴(kuò)容至size+增長(zhǎng)的大小;優(yōu)化

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()來(lái)改變數(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更經(jīng)常使用

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方法

先建立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ò)容,

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

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

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

1.若是元素只在數(shù)組里,而沒(méi)有鏈表:

新的位置是 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 super K> comparator;

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

SparseArray

數(shù)據(jù)結(jié)構(gòu) int[] mKeys;

Object[] mValues;

總結(jié)

官方推薦去使用SparseArray去替換HashMap,

犧牲了部分效率換來(lái)內(nèi)存

ArrayMap

LinkedHashMap

能夠看做HashMap+LinkedList,用于保證插入順序

通常用于做為緩存

Java中的線程安全的容器

同步容器

Vector

HashTable

并發(fā)容器

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

并發(fā)的不一樣策略:

1.Blocking容器

2.CopyOnWrite容器

3.Concurrent容器

Blocking容器

并發(fā)策略:

用于解決限制容量的容器的存取問(wèn)題

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

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

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

CopyOnWrite容器

并發(fā)策略:

寫時(shí)賦值,即添加元素時(shí),先復(fù)制整個(gè)容器,添加到復(fù)制的容器中,

再將容器引用指向復(fù)制的容器,達(dá)到讀的最大并發(fā);

適用于讀多寫少的狀況;

Concurrent容器

并發(fā)策略:

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

總結(jié)

以上是生活随笔為你收集整理的android中占容器比例,Android中的容器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。