摘要:對(duì)于一維數(shù)組來說,這種復(fù)制屬性值傳遞,修改副本不會(huì)影響原來的值。主要先生成一個(gè)等類型的數(shù)組,然后調(diào)用
版本jdk1.7
常用方法
增
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; } public boolean addAll(Collection extends E> c) { Object[] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew; return numNew != 0; } public boolean addAll(int index, Collection extends E> c) { rangeCheckForAdd(index); Object[] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // Increments modCount int numMoved = size - index; if (numMoved > 0) System.arraycopy(elementData, index, elementData, index + numNew, numMoved); System.arraycopy(a, 0, elementData, index, numNew); size += numNew; return numNew != 0; }
擴(kuò)容算法
現(xiàn)將容量擴(kuò)充到原來的1.5倍,如果大于需求容量,則新容量為1.5倍的原容量,否則為需求容量
private void ensureCapacityInternal(int minCapacity) { // 如果容器為空,則比較初始化容量和需要的容量,取大值 if (elementData == EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code // 如果需要的容量大于當(dāng)前容量,擴(kuò)容 if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; // 新容量為原容量的1.5倍 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); }
再說一下這兩個(gè)函數(shù)Arrays.copy()和System.arraycopy()
System中提供了一個(gè)native靜態(tài)方法arraycopy(),可以使用這個(gè)方法來實(shí)現(xiàn)數(shù)組之間的復(fù)制。對(duì)于一維數(shù)組來說,這種復(fù)制屬性值傳遞,修改副本不會(huì)影響原來的值。對(duì)于二維或者一維數(shù)組中存放的是對(duì)象時(shí),復(fù)制結(jié)果是一維的引用變量傳遞給副本的一維數(shù)組,修改副本時(shí),會(huì)影響原來的數(shù)組。
// Arrays.copy()主要先生成一個(gè)等類型的數(shù)組,然后調(diào)用System.arraycopy() public staticT[] copyOf(U[] original, int newLength, Class extends T[]> newType) { T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72771.html
摘要:繼承的類,泛型為時(shí),注意和其他的類型不同。因?yàn)槭蔷€程安全簡(jiǎn)單來說,是個(gè)一維數(shù)組。同樣,指定和,如果中間發(fā)生變化則會(huì)拋出異常。最后,可以,然后,使用基類可以實(shí)現(xiàn)和的快速賦值。線程安全也是線程安全的,和一樣,連函數(shù)都喪心病狂地同步了。 這么幾個(gè)比較常用的但是比較容易混淆的概念同出于 java.util 包。本文僅作幾個(gè)類的淺度解析。 (本文基于JDK1.7,源碼來自openjdk1.7。)...
摘要:今天主要講解的是本文力求簡(jiǎn)單講清每個(gè)知識(shí)點(diǎn),希望大家看完能有所收獲一和回顧線程安全的和我們知道是用于替代的,是線程安全的容器。使用迭代器遍歷時(shí)不需要顯示加鎖,看看與方法的實(shí)現(xiàn)可能就有點(diǎn)眉目了。 前言 只有光頭才能變強(qiáng) showImg(https://segmentfault.com/img/remote/1460000016931828?w=1120&h=640); 前一陣子寫過一篇C...
摘要:需要注意的是,通過構(gòu)造函數(shù)定義初始量是動(dòng)態(tài)數(shù)組的實(shí)際大小。帶容量的構(gòu)造函數(shù)新建一個(gè)容量為的數(shù)組默認(rèn)構(gòu)造函數(shù),默認(rèn)為空構(gòu)造一個(gè)包含指定元素的第一個(gè)構(gòu)造方法使用提供的來初始化數(shù)組的大小。 前言 今天介紹經(jīng)常使用的一個(gè)Java集合類——ArrayList(基于JDK1.8.0_121)。ArrayList在工作和日常面試中經(jīng)常被使用或者提到??偟膩碚f,工作中使用ArrayList主要是因?yàn)閯?dòng)...
摘要:三系列用于保存鍵值對(duì),無論是,還是已棄用的或者線程安全的等,都是基于紅黑樹。是完全基于紅黑樹的,并在此基礎(chǔ)上實(shí)現(xiàn)了接口??梢钥吹?,只有紅黑樹,且紅黑樹是通過內(nèi)部類來實(shí)現(xiàn)的。 JDK容器 前言 閱讀JDK源碼有段時(shí)間了,準(zhǔn)備以博客的形式記錄下來,也方便復(fù)習(xí)時(shí)查閱,本文參考JDK1.8源碼。 一、Collection Collection是所有容器的基類,定義了一些基礎(chǔ)方法。List、Se...
摘要:同步眾所周知,是同步的而不是,在一些必要的方法上都加了關(guān)鍵字,但是這也會(huì)加大系統(tǒng)開銷。中有一個(gè)方法用來返回一個(gè),以匿名內(nèi)部類的方式實(shí)現(xiàn)的接口和類似,都用作于對(duì)集合進(jìn)行迭代,不過沒有刪除功能,已經(jīng)被取代。還有是的,但不是,這一點(diǎn)很重要。 在上篇文章ArrayList源碼淺析中分析了一下 ArrayList的源碼和一些重要方法,現(xiàn)在對(duì)比 ArrayList,總結(jié)一下 Vector和 Arr...
閱讀 1241·2021-11-11 16:54
閱讀 1756·2021-10-13 09:40
閱讀 953·2021-10-08 10:05
閱讀 3514·2021-09-22 15:50
閱讀 3718·2021-09-22 15:41
閱讀 1840·2021-09-22 15:08
閱讀 2355·2021-09-07 10:24
閱讀 3584·2019-08-30 12:52