這篇文章主要介紹Java中ArrayList的add和set方法有什么區(qū)別,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
10年積累的網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有名山免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
一般使用List集合,估計(jì)都是使用這個(gè)ArrayList,一般呢也就是簡(jiǎn)單遍歷數(shù)據(jù)和存儲(chǔ)數(shù)據(jù)。
很少使用到add(int index, E element)和set(int index, E element)兩個(gè)方法。
這兩個(gè)方法,乍一看,就是在指定的位置插入一條數(shù)據(jù)。
區(qū)別:
set()是更新,更新指定下標(biāo)位置的值。
add()是添加,區(qū)別于一般的add(E e),這個(gè)就是有個(gè)位置的概念,特殊位置之后的數(shù)據(jù),依次往后移動(dòng)就是了。
然后,看下面代碼。來(lái)看看陷阱。
就算是,你知道了上面的內(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é)果怎么是這樣呢!下面有這么幾個(gè)坑。
解釋?zhuān)?/strong>
1,List<String> list = new ArrayList<>(2)
這個(gè)乍一看,還以為像數(shù)組一樣,你初始化了個(gè)長(zhǎng)度為2的數(shù)組,然后你就可以隨意修改下標(biāo)為0,1的內(nèi)容。當(dāng)然0,1是肯定不會(huì)下標(biāo)越界的。
我當(dāng)時(shí)也是這么想的。然而不是的。
源碼里面的構(gòu)造函數(shù)的注釋說(shuō)明:這個(gè)真的是在底層新建了個(gè)長(zhǎng)度為2的數(shù)組Object[],但是他又不是我們經(jīng)??吹降囊话銛?shù)組。這個(gè)是空的。
當(dāng)前l(fā)ist集合仍然是一個(gè)帶有初始容量的empty list。
2,list.size()
我上來(lái)也是想當(dāng)然的以為,這個(gè)size()不就是上面的那個(gè)2嗎!但是我錯(cuò)了。
源碼中ArrayList的size屬性對(duì)應(yīng)的注釋是:The size of the ArrayList (the number of elements it contains).
這個(gè)size是表示這個(gè)集合包含的元素的個(gè)數(shù),而不是底層數(shù)組的大小。
3,list.set(1,"sss")
在知道了上面的2個(gè)坑之后,這個(gè)就好解釋了。代碼是要設(shè)置下標(biāo)為1的值,但是。在源碼中有 rangeCheck(index);
private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
這個(gè)時(shí)候,index是1,但是size是1。
so,就異常啦。
4,list.add(1,"放在下標(biāo)為1的位置")
這個(gè)和上面相似,但還是有點(diǎn)不一樣,上面判斷是大于等于size,但是在這個(gè)add方法,卻是要大于才可以。
而且還有個(gè)專(zhuān)門(mén)的check方法for add,如下:rangeCheckForAdd(index);
private void rangeCheckForAdd(int index) { if (index > size || index < 0) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); }
那,這個(gè)在下標(biāo)為1的位置,添加元素,判斷 1 > 1 不成立,那么就可以順利添加了。這個(gè)就不異常啦。
但是,你要是在數(shù)組聲明完,直接在下標(biāo)為1的位置,這么干,就異常了。就不在繼續(xù)分析了。
5,還有個(gè)問(wèn)題,就是你在一個(gè)位置一直add(index , element)
這個(gè)不僅僅是把index位置的數(shù)據(jù)給替換啦,而且把之前這個(gè)位置的數(shù)據(jù)給依次向后移動(dòng)啦,這個(gè)跟map的結(jié)構(gòu)不一樣,map是更新指定位置的數(shù)據(jù),其他的數(shù)據(jù)不動(dòng),這個(gè)list竟然是把把數(shù)據(jù)平移啦。
以上是“Java中ArrayList的add和set方法有什么區(qū)別”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
新聞名稱(chēng):Java中ArrayList的add和set方法有什么區(qū)別
標(biāo)題鏈接:http://jinyejixie.com/article40/ipgjeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站維護(hù)、搜索引擎優(yōu)化、域名注冊(cè)、網(wǎng)站內(nèi)鏈、全網(wǎng)營(yíng)銷(xiāo)推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)