摘要:對于一維數組來說,這種復制屬性值傳遞,修改副本不會影響原來的值。主要先生成一個等類型的數組,然后調用
版本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; }
擴容算法
現將容量擴充到原來的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 // 如果需要的容量大于當前容量,擴容 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); }
再說一下這兩個函數Arrays.copy()和System.arraycopy()
System中提供了一個native靜態方法arraycopy(),可以使用這個方法來實現數組之間的復制。對于一維數組來說,這種復制屬性值傳遞,修改副本不會影響原來的值。對于二維或者一維數組中存放的是對象時,復制結果是一維的引用變量傳遞給副本的一維數組,修改副本時,會影響原來的數組。
// Arrays.copy()主要先生成一個等類型的數組,然后調用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; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72771.html
摘要:繼承的類,泛型為時,注意和其他的類型不同。因為是線程安全簡單來說,是個一維數組。同樣,指定和,如果中間發生變化則會拋出異常。最后,可以,然后,使用基類可以實現和的快速賦值。線程安全也是線程安全的,和一樣,連函數都喪心病狂地同步了。 這么幾個比較常用的但是比較容易混淆的概念同出于 java.util 包。本文僅作幾個類的淺度解析。 (本文基于JDK1.7,源碼來自openjdk1.7。)...
摘要:今天主要講解的是本文力求簡單講清每個知識點,希望大家看完能有所收獲一和回顧線程安全的和我們知道是用于替代的,是線程安全的容器。使用迭代器遍歷時不需要顯示加鎖,看看與方法的實現可能就有點眉目了。 前言 只有光頭才能變強 showImg(https://segmentfault.com/img/remote/1460000016931828?w=1120&h=640); 前一陣子寫過一篇C...
摘要:需要注意的是,通過構造函數定義初始量是動態數組的實際大小。帶容量的構造函數新建一個容量為的數組默認構造函數,默認為空構造一個包含指定元素的第一個構造方法使用提供的來初始化數組的大小。 前言 今天介紹經常使用的一個Java集合類——ArrayList(基于JDK1.8.0_121)。ArrayList在工作和日常面試中經常被使用或者提到。總的來說,工作中使用ArrayList主要是因為動...
摘要:三系列用于保存鍵值對,無論是,還是已棄用的或者線程安全的等,都是基于紅黑樹。是完全基于紅黑樹的,并在此基礎上實現了接口。可以看到,只有紅黑樹,且紅黑樹是通過內部類來實現的。 JDK容器 前言 閱讀JDK源碼有段時間了,準備以博客的形式記錄下來,也方便復習時查閱,本文參考JDK1.8源碼。 一、Collection Collection是所有容器的基類,定義了一些基礎方法。List、Se...
摘要:同步眾所周知,是同步的而不是,在一些必要的方法上都加了關鍵字,但是這也會加大系統開銷。中有一個方法用來返回一個,以匿名內部類的方式實現的接口和類似,都用作于對集合進行迭代,不過沒有刪除功能,已經被取代。還有是的,但不是,這一點很重要。 在上篇文章ArrayList源碼淺析中分析了一下 ArrayList的源碼和一些重要方法,現在對比 ArrayList,總結一下 Vector和 Arr...
閱讀 1225·2021-11-11 16:54
閱讀 1738·2021-10-13 09:40
閱讀 933·2021-10-08 10:05
閱讀 3498·2021-09-22 15:50
閱讀 3701·2021-09-22 15:41
閱讀 1782·2021-09-22 15:08
閱讀 2338·2021-09-07 10:24
閱讀 3571·2019-08-30 12:52