Java ArrayList add(int index, E element)和set(int index, E element)兩個方法的說明
一般使用List集合,估計(jì)都是使用這個ArrayList,一般呢也就是簡單遍歷數(shù)據(jù)和存儲數(shù)據(jù)。
很少使用到add(int index, E element)和set(int index, E element)兩個方法。
這兩個方法,乍一看,就是在指定的位置插入一條數(shù)據(jù)。
區(qū)別:
- set()是更新,更新指定下標(biāo)位置的值。
- add()是添加,區(qū)別于一般的add(E e),這個就是有個位置的概念,特殊位置之后的數(shù)據(jù),依次往后移動就是了。
然后,看下面代碼。來看看陷阱。
就算是,你知道了上面的內(nèi)容,也不能保證,你能安全的回答下面的代碼運(yùn)行結(jié)果。
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,"放在下標(biāo)為1的位置"); list.add("22"); System.out.println("list大小為:" + list.size()); System.out.println(list.toString()); list.add(1,"放在下標(biāo)為1的位置"); System.out.println("list大小為:" + list.size()); System.out.println(list.toString()); } }
運(yùn)行結(jié)果:
估計(jì),很多人都大出所料吧。結(jié)果怎么是這樣呢!下面有這么幾個坑。
解釋:
1,List<String> list = new ArrayList<>(2)
這個乍一看,還以為像數(shù)組一樣,你初始化了個長度為2的數(shù)組,然后你就可以隨意修改下標(biāo)為0,1的內(nèi)容。當(dāng)然0,1是肯定不會下標(biāo)越界的。
我當(dāng)時也是這么想的。然而不是的。
源碼里面的構(gòu)造函數(shù)的注釋說明:這個真的是在底層新建了個長度為2的數(shù)組Object[],但是他又不是我們經(jīng)常看到的一般數(shù)組。這個是空的。
當(dāng)前l(fā)ist集合仍然是一個帶有初始容量的empty list。
2,list.size()
我上來也是想當(dāng)然的以為,這個size()不就是上面的那個2嗎!但是我錯了。
源碼中ArrayList的size屬性對應(yīng)的注釋是:The size of the ArrayList (the number of elements it contains).
這個size是表示這個集合包含的元素的個數(shù),而不是底層數(shù)組的大小。
3,list.set(1,"sss")
在知道了上面的2個坑之后,這個就好解釋了。代碼是要設(shè)置下標(biāo)為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,"放在下標(biāo)為1的位置")
這個和上面相似,但還是有點(diǎn)不一樣,上面判斷是大于等于size,但是在這個add方法,卻是要大于才可以。
而且還有個專門的check方法for add,如下:rangeCheckForAdd(index);
private void rangeCheckForAdd(int index) { if (index > size || index < 0) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
那,這個在下標(biāo)為1的位置,添加元素,判斷 1 > 1 不成立,那么就可以順利添加了。這個就不異常啦。
但是,你要是在數(shù)組聲明完,直接在下標(biāo)為1的位置,這么干,就異常了。就不在繼續(xù)分析了。
5,還有個問題,就是你在一個位置一直add(index , element)
這個不僅僅是把index位置的數(shù)據(jù)給替換啦,而且把之前這個位置的數(shù)據(jù)給依次向后移動啦,這個跟map的結(jié)構(gòu)不一樣,map是更新指定位置的數(shù)據(jù),其他的數(shù)據(jù)不動,這個list竟然是把把數(shù)據(jù)平移啦。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
- JAVA8 List<List<Integer>> list中再裝一個list轉(zhuǎn)成一個list操作
- Java servlet、filter、listener、interceptor之間的區(qū)別和聯(lián)系
- Java解決No enclosing instance of type PrintListFromTailToHead is accessible問題的兩種方案
- JAVA中l(wèi)ist,set,數(shù)組之間的轉(zhuǎn)換詳解
- Java 數(shù)組轉(zhuǎn)List的四種方式小結(jié)
- Java ArrayList 數(shù)組之間相互轉(zhuǎn)換
- java中數(shù)組list map三者之間的互轉(zhuǎn)介紹
- java list與數(shù)組之間的轉(zhuǎn)換詳細(xì)解析
- Java編程實(shí)現(xiàn)數(shù)組轉(zhuǎn)成list及l(fā)ist轉(zhuǎn)數(shù)組的方法
- 淺談java 字符串,字符數(shù)組,list間的轉(zhuǎn)化
- java list,set,map,數(shù)組間的相互轉(zhuǎn)換詳解
- Java中將 int[] 數(shù)組 轉(zhuǎn)換為 List分享
相關(guān)文章
Java與WebUploader相結(jié)合實(shí)現(xiàn)文件上傳功能(實(shí)例代碼)
這篇文章主要介紹了Java結(jié)合WebUploader實(shí)現(xiàn)文件上傳功能,代碼簡單易懂,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Spring Boot中使用Spring-data-jpa的配置方法詳解
今天小編就為大家分享一篇關(guān)于Spring Boot中使用Spring-data-jpa的配置方法詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03使用Spring的攔截器監(jiān)測每個Controller或方法的執(zhí)行時長
這篇文章主要介紹了使用Spring的攔截器監(jiān)測每個Controller或方法的執(zhí)行時長,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項(xiàng)目的方法
這篇文章主要介紹了使用Jenkins Pipeline自動化構(gòu)建發(fā)布Java項(xiàng)目的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼
本篇文章主要介紹了消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法
這篇文章主要介紹了Spring 開發(fā)之組件賦值的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09