您好,登錄后才能下訂單哦!
這篇文章主要介紹Java中ArrayList的add和set方法有什么區別,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
一般使用List集合,估計都是使用這個ArrayList,一般呢也就是簡單遍歷數據和存儲數據。
很少使用到add(int index, E element)和set(int index, E element)兩個方法。
這兩個方法,乍一看,就是在指定的位置插入一條數據。
區別:
set()是更新,更新指定下標位置的值。
add()是添加,區別于一般的add(E e),這個就是有個位置的概念,特殊位置之后的數據,依次往后移動就是了。
然后,看下面代碼。來看看陷阱。
就算是,你知道了上面的內容,也不能保證,你能安全的回答下面的代碼運行結果。
public class ArrayListTest { public static void main(String[] args) { List<String> list = new ArrayList<>(2); System.out.println("list大小為:" + list.size()); list.add("12"); System.out.println("list大小為:" + list.size()); list.set(1,"sss"); list.add(1,"放在下標為1的位置"); list.add("22"); System.out.println("list大小為:" + list.size()); System.out.println(list.toString()); list.add(1,"放在下標為1的位置"); System.out.println("list大小為:" + list.size()); System.out.println(list.toString()); } }
運行結果:
估計,很多人都大出所料吧。結果怎么是這樣呢!下面有這么幾個坑。
解釋:
1,List<String> list = new ArrayList<>(2)
這個乍一看,還以為像數組一樣,你初始化了個長度為2的數組,然后你就可以隨意修改下標為0,1的內容。當然0,1是肯定不會下標越界的。
我當時也是這么想的。然而不是的。
源碼里面的構造函數的注釋說明:這個真的是在底層新建了個長度為2的數組Object[],但是他又不是我們經常看到的一般數組。這個是空的。
當前list集合仍然是一個帶有初始容量的empty list。
2,list.size()
我上來也是想當然的以為,這個size()不就是上面的那個2嗎!但是我錯了。
源碼中ArrayList的size屬性對應的注釋是:The size of the ArrayList (the number of elements it contains).
這個size是表示這個集合包含的元素的個數,而不是底層數組的大小。
3,list.set(1,"sss")
在知道了上面的2個坑之后,這個就好解釋了。代碼是要設置下標為1的值,但是。在源碼中有 rangeCheck(index);
private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
這個時候,index是1,但是size是1。
so,就異常啦。
4,list.add(1,"放在下標為1的位置")
這個和上面相似,但還是有點不一樣,上面判斷是大于等于size,但是在這個add方法,卻是要大于才可以。
而且還有個專門的check方法for add,如下:rangeCheckForAdd(index);
private void rangeCheckForAdd(int index) { if (index > size || index < 0) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
那,這個在下標為1的位置,添加元素,判斷 1 > 1 不成立,那么就可以順利添加了。這個就不異常啦。
但是,你要是在數組聲明完,直接在下標為1的位置,這么干,就異常了。就不在繼續分析了。
5,還有個問題,就是你在一個位置一直add(index , element)
這個不僅僅是把index位置的數據給替換啦,而且把之前這個位置的數據給依次向后移動啦,這個跟map的結構不一樣,map是更新指定位置的數據,其他的數據不動,這個list竟然是把把數據平移啦。
以上是“Java中ArrayList的add和set方法有什么區別”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。