2012-03-23 61 views
9

我總是會學習何時聲明一個我們應該做的集合,如果我想用例如一個LinkedList,我會做List ob = new LinkedList(),但是我不能訪問LinkedList中的所有方法..是不是LinkedList ob = new LinkedList() 100%正確?在Java中聲明一個LinkedList

+1

LinkedList的OB =新的LinkedList(),創建對象這種方式只是要使用LinkedList類,沒有錯..再次它取決於你從實現想要的東西。 – 2012-03-23 18:15:56

+1

取決於你想要達到的目標,檢查了這一點:檢查你的答案] [1]這裏http://stackoverflow.com/questions/2451849/polymorphic-call – 2012-03-23 18:13:56

+0

好Q,馬爾西奧。 剛纔我碰到,我想利用'addfirst僅(E E)'和'addlast僅(E E)'的情況下,也沒有找到那些'List'接口。 – Vikram 2013-11-16 22:55:40

回答

10

是不是LinkedList ob = new LinkedList()100%正確嗎?

嗯,我會建議使用通用的形式,但肯定的 - 如果你想使用的功能是具體LinkedList,需要相應聲明變量。

您可能想要檢查Deque<E>Queue<E>接口是否具有您想要的。如果他們這樣做,那麼使用那些描述你需要什麼的想法,而不是使用什麼實現。

+3

實際上沒有任何方法_specific_ to'LinkedList';一切都會覆蓋一個超類方法(比如'clone()')或者實現一個接口的方法。如果你想使用'Deque'(例如,'peek()')指定的方法以及'List'指定的方法(例如'indexOf()'),但是兩者都沒有指定,那麼沒有太多選擇聲明變量爲'LinkedList'。 – 2012-03-23 18:07:04

5

是,

LinkedList<...> items = new LinkedList<...>(); 

是完全正確的,如果你知道items將取決於沒有在List<T>接口捕獲的LinkedList<T>方法。

1

不完全正確。

聲明任何集合的首選方法是包含它所持有的數據類型。所以,舉個例子,它會是LinkedList<Integer> ob = new LinkedList<Integer>();

3

規則「總是編碼到接口」必須具有一定的靈活性。你提出的建議是好的,當你得出結論時,唯一的選擇。作爲一個附註,編碼到像這樣的具體類更快是大多數JVMs。決定演出是否值得打破這一規則是很難決定的。

+2

你有一些數據來支持這個說法嗎?這是我第一次聽說接口編碼可能比具體類慢。 – 2012-03-23 18:05:45

+0

@krzyk - 你自己來測試它並不難。對list.get()這樣的方法的調用,在聲明列表''的時候比聲明爲'ArrayList '的時候明顯慢一些(如果你做得足夠多的話)。 (爲了測試'get()',我不會使用'LinkedList')。在一個簡單的測試中,我使用Java 6運行,它使用'get()'訪問每個數組元素,泛型調用花費了大約10%更多用於1,000個元素,10,000個元素大約多18%。 – 2012-03-23 18:44:37

+0

http://developer.android.com/guide/practices/design/performance.html#myths。爲了公平起見,這個聲明涉及沒有JIT的JVM。 – 2012-03-23 18:57:20

3

如果您確實需要使用不在List接口上的方法,那麼使用LinkedList的API肯定沒有問題。對List接口編程的一般規則認識到:1)很少需要這些方法; 2)在大多數人的經驗中,更有可能發現我需要對列表進行排序和/或使用大量隨機訪問,並決定切換到一個ArrayList,比我只需要一個LinkedList的方法。

如果您發現List沒有給您需要的東西,那麼您可能正在對Queue接口進行編程。

2

LinkedList是一個通用的。你應該做的事:

LinkedList<String> linkedList = new LinkedList<String>(); 

(或任何其他你需要有存儲,而不是字符串中)

4

你應該總是儘量保持在最高水平可能的聲明,這意味着你應該停在最高級別,提供您需要的所有功能:如果List方法不夠用,您完全可以使用LinkedList聲明。

-2

其實它會更好,如果它參數化,因爲兩者都是原始類型。

1

都能跟得上。這是錯誤的,在後期階段,如果他想從鏈表他實現更改爲任何其他實施名單式的,他就一定會出問題。所以最好使用界面級別宣言。

0

我不會總是建議你使用泛型..... 堂妹有時你可能需要換不同的對象爲這裏....

  String str="a string"; 
      boolean status=false; 

      LinkedList ll = new LinkedList(); 
      ll.add(str); 
      ll.add(status); 

在某些情況下,例如RMI的情況下, ü只能發送串行數據.....並假設你想送一個類對象(這是反序列化)......在那裏,你可以在一個LinkedList和通包裹類(元)的成員,對象作爲一個整體.......不擔心大量的參數...... 考慮例如:

 public Class DataHouse 
     { 
      public int a; 
      public String str; 
      . 
      . 
      . 
     } 

現在某處u需要傳遞的對象.... 你可以做以下....

   DataHouse dh =new DataHouse(); 
      LinkedList ll = new LinkedList(); 
      ll.add(dh.a); 
      ll.add(dh.str); 

      // Now the content is serialized and can pass it as a capsuled data...... 
0

你仍然可以訪問LinkedList的方法,通過使用列表中,你所要做的就是類型轉換 例如

((LinkedList)ob).add() 

使用泛型列表,而不是點LinkedList的是,因爲萬一你只需改變你使用列表的類型(假設雙向鏈表)您的程序仍然可以工作泛型是簡化您的代碼,使其更便攜,更「易變」