2014-04-06 80 views
-1

我正在看一些代碼,並且我遇到了這個叫做ArrayLists的東西?使用ArrayLists反對常規列表到底是什麼?如果你看代碼,在方法名稱前你有<T> ArrayList<T>。是因爲這些是ArrayLists?爲什麼<T>ArrayLists的要點是什麼?

class MergeAlgorithm{ 

    //ArrayLists 
    <T> ArrayList<T> merge(ArrayList<T> list1, ArrayList<T> list2, 
      Comparator<T> comp, ArrayList<T> acc){ 
     if(list1.isEmpty()) 
      return append(acc, list2); 
     else if(list2.isEmpty()) 
      return append(acc, list1); 
     else if(comp.compare(list1.get(0), list2.get(0)) <= 0){ 
      acc.add(list1.get(0)); 
      list1.remove(0); 
      return merge(list1, list2, comp, acc); 
     } 
     else{ 
      acc.add(list2.get(0)); 
      list2.remove(0); 
      return merge(list1, list2, comp, acc); 
     } 



    } 



<T> ArrayList<T> append(ArrayList<T> list1, ArrayList<T> list2){ 
    for (T t: list2){ 
     list1.add(t); 
    } 
    return list1; 
} 
} 


class CharComp implements Comparator<Character>{ 
    public int compare(Character c1, Character c2){ 
     return c1.compareTo(c2); 
    } 
} 
+2

'ArrayList'只是'List'接口的一個實現;因此它可以被看作是一個「常規列表」,因爲它是這個接口最常用的實現('List list = new ArrayList <>();') – fge

+1

您需要了解Java泛型。你有,所以你可以有強類型檢查任何類型的對象列表。 – duffymo

回答

2

究竟是使用作爲反對常規列表的ArrayList的地步?

這取決於你的意思是「常規列表」。

  • 如果你的意思java.util.List,那麼問題是,你不能創建List類型的實例...因爲它是一個interface不是class

  • 如果你的意思是一些其他列表類,如java.util.LinkedList ...那麼你需要認識到,每個不同的列表類有它們自己的行爲/性能特徵。例如:

    • LinkedList具有位於列表的開始快速插入,但緩慢get(int)操作相比ArrayList

    • ArrayList類具有快速get,並使用平均1更少的存儲器比相當於LinkedList


如果你看一下代碼,您以前<T> ArrayList<T>方法名。是因爲這些是ArrayLists?以及爲什麼<T>

<T>表示的通用mergeappend方法的類型參數。閱讀關於Generics的Java教程部分...然後您應該能夠理解此代碼所說的內容。

不,它不是「因爲這些是ArrayLists。您還需要爲其他列表類使用泛型類型參數。 List接口和所有標準列表類都是泛型類型。


1 - 的ArrayList佔用空間有點橡膠,因爲它取決於用於獲取到其空間的使用你所測量列表的操作順序。但是最佳的ArrayList佔據很多比具有相同元素的LinkedList更少的空間。對於典型的用例也是如此。