91在线视频播放|成人黄视频在线观看|在线视频福利|天天欲色成人综合网站|国产国语videosex护士

機(jī)構(gòu)檔案
  • 機(jī)構(gòu)級(jí)別:普通會(huì)員
  • 信用等級(jí):

在線交談:點(diǎn)擊這里給我發(fā)消息

咨詢熱線:029-62258374

學(xué)校評(píng)價(jià)(我要提問(wèn)/點(diǎn)評(píng))

  • 學(xué)校被點(diǎn)評(píng):0
  • 好評(píng)(0%)
  • 中評(píng)(0%)
  • 差評(píng)(0%)

資料認(rèn)證

    未通過(guò)身份證認(rèn)證 未通過(guò)身份證認(rèn)證

    未通過(guò)辦學(xué)許可認(rèn)證 未通過(guò)辦學(xué)許可認(rèn)證

  • 學(xué)校瀏覽人次:
  • 加盟時(shí)間:2017年03月10日
新聞動(dòng)態(tài)

西安尚學(xué)堂Java 集合中的幾個(gè)常見(jiàn)問(wèn)題

發(fā)布者:西安尚學(xué)堂 發(fā)布時(shí)間:2017-03-16 來(lái)源:西安尚學(xué)堂

在使用Java的時(shí)候,我們都會(huì)遇到使用集合(Collection)的時(shí)候,但是Java API提供了多種集合的實(shí)現(xiàn)。今天,西安尚學(xué)堂的小編就和大家討論關(guān)于Java Collections的幾個(gè)常見(jiàn)問(wèn)題。以便大家更好的學(xué)習(xí)Java Collections。

西安尚學(xué)堂

1. 什么時(shí)候用LinkedList,什么時(shí)候用ArrayList?

ArrayList是使用數(shù)組實(shí)現(xiàn)的list,本質(zhì)上就是數(shù)組。ArrayList中的元素可以通過(guò)索引隨機(jī)獲取一個(gè)元素。但是如果該數(shù)組已滿,當(dāng)添加新元素時(shí)需要分配一個(gè)新的數(shù)組然后將原來(lái)數(shù)組的元素移動(dòng)過(guò)去,需要O(n)的時(shí)間復(fù)雜度。添加或刪除一個(gè)元素需要移動(dòng)數(shù)組中的其他元素。這是ArrayList最大的缺點(diǎn)。

LinkedList是一個(gè)雙向鏈表。因此,當(dāng)需要獲取list中某個(gè)元素,需要從頭到尾遍歷list。另一方面,在鏈表中添加或刪除元素很快,只需要O(1)的時(shí)間復(fù)雜度。從空間上來(lái)說(shuō),在鏈表中一個(gè)節(jié)點(diǎn)需要兩個(gè)額外的指針來(lái)指向它的previous和next節(jié)點(diǎn)。

總結(jié):

從時(shí)間復(fù)雜度來(lái)說(shuō),如果對(duì)list增加或刪除操作較多,優(yōu)先用LinkedList;如果查詢操作較多,優(yōu)先用ArrayList。

從空間復(fù)雜度來(lái)說(shuō),LinkedList會(huì)占用較多空間。

2. 如何邊遍歷邊移除Collection中的元素

邊遍歷邊修改Collection的唯一正確方式是使用Iterator.remove()方法,如下:

  Iterator it = list.iterator();
  while(it.hasNext()){
  // do something
  it.remove();
  }

一種最常見(jiàn)的錯(cuò)誤代碼如下:

  for(Integer i : list){
  list.remove(i)
  }

運(yùn)行以上錯(cuò)誤代碼會(huì)報(bào)ConcurrentModificationException異常。這是因?yàn)楫?dāng)使用foreach(for(Integer i : list))語(yǔ)句時(shí),會(huì)自動(dòng)生成一個(gè)iterator來(lái)遍歷該list,但同時(shí)該list正在被Iterator.remove()修改。在Java中,一般不允許一個(gè)線程在遍歷collection時(shí)另一個(gè)線程在修改它。

3. 如何將List轉(zhuǎn)化成int[]?

很多人可能認(rèn)為只需用List.toArray()即可,其實(shí)不然。List.toArray()方法只可能得到Integer[],無(wú)法得到int[]。

最簡(jiǎn)單的方法是使用Apache Commons Lang庫(kù)中的ArrayUtils。

  int[] array = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

在JDK中,沒(méi)有捷徑。需要注意的是,不能直接使用List.toArray(),因?yàn)檫@樣會(huì)將List轉(zhuǎn)化成Integer[]而不是int[]。正確的做法如下:

  int[] array = new int
  for(int i = 0; i < list.size(); i++){
  array[i] = list.get(i);
  }

4. 如何將int[]轉(zhuǎn)化成List?

同上,很多人以為只需用Arrays.asList()即可,其實(shí)不然。因?yàn)椴荒芤詉nt[]作為該方法的參數(shù),要的話也只能是Integer[]。

關(guān)于Arrays.asList()方法有如下特性:

1.該方法對(duì)于基本數(shù)據(jù)類(lèi)型的數(shù)組支持并不好,當(dāng)數(shù)組是基本數(shù)據(jù)類(lèi)型時(shí)不建議使用

2.當(dāng)使用asList()方法時(shí),數(shù)組就和列表鏈接在一起了。當(dāng)更新其中之一時(shí),另一個(gè)將自動(dòng)獲得更新。因?yàn)閍sList獲得的List實(shí)際引用的就是數(shù)組 注意:僅僅針對(duì)對(duì)象數(shù)組類(lèi)型,基本數(shù)據(jù)類(lèi)型數(shù)組不具備該特性。

3.asList得到的數(shù)組是的沒(méi)有add和remove方法的。因?yàn)閍sList返回的List是Arrays中的內(nèi)部類(lèi),而該類(lèi)并沒(méi)有定義add和remove方法。

那么如何將int[]轉(zhuǎn)化成List呢?

  int[] array = {1,2,3,4,5};
  List list = new ArrayList();
  for(int i: array) {
  list.add(i);
  }

5. 過(guò)濾一個(gè)Collection最好的方法是什么?

如過(guò)濾掉list中大于5的整數(shù)。

  Iterator it = list.iterator();
  while(it.hasNext()){
  int i = it.next();
  if(i > 5) { //過(guò)濾掉大于5的整數(shù)
  it.remove();
  }
  }

6. 將List轉(zhuǎn)化成Set最簡(jiǎn)單的方法?

有兩種方法,取決于你怎么要怎么定義兩個(gè)元素相等。第一種方法是將list放入HashSet里,該方法元素是否相等是通過(guò)它們的hashCode()來(lái)比較的。如果需要自己定義比較的方法,需要用TreeSet。

  Set set = new HashSet(list);
  Set set = new TreeSet(aComparator);
  set.addAll(list);

7. 如何刪除ArrayList中重復(fù)的元素?

如果不關(guān)心元素在ArrayList中的順序,可以將list放入set中來(lái)刪除重復(fù)元素,然后在放回list。

  Set set = new HashSet(list);
  list.clear();
  list.addAll(set);

如果關(guān)心元素在ArrayList中的順序,可以用LinkedHashSet。

8. 有序的collection

Java里有很多方法來(lái)維持一個(gè)collection有序。有的需要實(shí)現(xiàn)Comparable接口,有的需要自己指定Comparator。

1.Collections.sort()可以用來(lái)對(duì)list排序。該排序是穩(wěn)定的,并且可以保證nlog(n)的性能。

2.PriorityQueue提供排序的隊(duì)列。PriorityQueue和Collections.sort()的區(qū)別是,PriorityQueue動(dòng)態(tài)維護(hù)一個(gè)有序的隊(duì)列(每添加或刪除一個(gè)元素就會(huì)重新排序),但是只能獲隊(duì)列中的頭元素。

3.如果collection中沒(méi)有重復(fù)的元素,TreeSet是另一個(gè)選擇。跟PriorityQueue一樣的是,TreeSet也動(dòng)態(tài)維護(hù)一個(gè)有序的集合。可以從TreeSet中獲取最大和最小的元素。

總結(jié):Collections.sort()提供一個(gè)一次排序的list。PriorityQueue和TreeSet動(dòng)態(tài)維護(hù)排序的collection。

9. 拷貝list

有兩種方法可以用來(lái)拷貝list。一種是使用ArrayList構(gòu)造器。

  ArrayList dstList = new ArrayList(srcList);

另一種是使用Collections.copy()。

  ArrayList dstList = new ArrayList(srcList.size());
  Collections.copy(dstList, srcList);

需要注意的是,使用該方法的話目標(biāo)list至少跟源list長(zhǎng)度一樣長(zhǎng)。否則會(huì)報(bào)IndexOutOfBoundsException異常。

另外有兩點(diǎn)需要注意:

1.兩種方法都是淺拷貝

2.Collections.copy()方法的兩個(gè)參數(shù)必須都是list,而ArrayList方法參數(shù)只要是collection即可,因此ArrayList方法更通用。