2012-03-23 54 views
9

Tôi luôn tìm hiểu khi khai báo một bộ sưu tập chúng ta nên làm, Interface ob = new Class(), nếu tôi muốn sử dụng ví dụ LinkedList, tôi sẽ làm List ob = new LinkedList(), nhưng sau đó tôi không thể truy cập vào tất cả các phương thức từ LinkedList .. Không phải là LinkedList ob = new LinkedList() chính xác 100%?Khai báo một LinkedList trong Java

+1

LinkedList ob = new LinkedList(), tạo đối tượng theo cách này chỉ là bạn muốn sử dụng lớp LinkedList, không có gì sai với nó .. Một lần nữa nó phụ thuộc vào những gì bạn muốn từ việc thực hiện. –

+1

Phụ thuộc vào những gì bạn muốn đạt được, kiểm tra điều này: [kiểm tra câu trả lời của bạn] [1] tại đây http://stackoverflow.com/questions/2451849/polymorphic-call –

+0

Good Q, Marcio. Ngay bây giờ, tôi bắt gặp một tình huống mà tôi muốn sử dụng 'addFirst (E e)' và 'addLast (E e)', nhưng không thể tìm thấy chúng trong giao diện 'List'. – Vikram

Trả lời

10

LinkedList ob = new LinkedList() 100% có đúng không?

Vâng, tôi muốn đề nghị sử dụng các hình thức chung, nhưng chắc chắn - nếu bạn muốn sử dụng chức năng đó là cụ-LinkedList, bạn cần phải khai báo các biến cho phù hợp.

Bạn có thể muốn kiểm tra xem giao diện Deque<E> hoặc Queue<E> có những gì bạn muốn hay không. Nếu họ làm như vậy, hãy sử dụng những ý tưởng đó để mô tả những gì bạn cần hơn là những gì bạn sẽ sử dụng.

+3

Không thực sự có bất kỳ phương thức nào _specific_ đến 'LinkedList'; mọi thứ đều ghi đè lên một phương thức siêu lớp (như 'clone()') hoặc thực hiện một phương thức của một trong các giao diện của nó. Nếu bạn muốn sử dụng các phương thức được chỉ định bởi 'Deque' (ví dụ' peek() ') cũng như các phương thức được chỉ định bởi' List' (ví dụ 'indexOf()'), nhưng không được chỉ định bởi cả hai, thì không có nhiều thay thế để khai báo biến là 'LinkedList'. –

5

Vâng,

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

là hoàn toàn chính xác nếu bạn biết rằng items sẽ phụ thuộc vào phương pháp LinkedList<T> mà không bị bắt trong giao diện List<T>.

1

Không chính xác 100% chính xác.

Cách ưa thích để khai báo bất kỳ bộ sưu tập nào là bao gồm kiểu dữ liệu mà nó đang nắm giữ. Vì vậy, ví dụ của bạn, nó sẽ là LinkedList<Integer> ob = new LinkedList<Integer>();.

3

quy tắc "luôn mã để giao diện" phải được thực hiện với sự linh hoạt nào đó. những gì bạn đang đề xuất là tốt, và khi bạn đi đến kết luận, lựa chọn duy nhất.

là một lưu ý phụ, mã hóa cho các lớp cụ thể như thế này nhanh hơn là hầu hết các JVM. quyết định liệu hiệu suất có đáng để phá vỡ quy tắc hay không là điều khó quyết định.

+2

Bạn có một số dữ liệu để trả lại khiếu nại này không? Đây là lần đầu tiên tôi nghe rằng mã hóa giao diện có thể chậm hơn so với các lớp cụ thể. –

+0

@krzyk - Không quá khó để tự mình kiểm tra. Các cuộc gọi phương thức tới một cái gì đó như 'list.get()' có thể đo được chậm hơn (nếu bạn làm đủ) khi 'list' được khai báo' List 'hơn khi nó được khai báo' ArrayList '. (Để thử nghiệm 'get()', tôi sẽ không sử dụng 'LinkedList'.) Trong một thử nghiệm đơn giản, tôi chạy dưới Java 6, mà chỉ truy cập mọi phần tử mảng bằng cách sử dụng' get() ', các cuộc gọi chung chiếm khoảng 10% nhiều hơn cho 1.000 yếu tố, và khoảng 18% nhiều hơn cho 10.000 yếu tố. –

+0

http://developer.android.com/guide/practices/design/performance.html#myths. công bằng, tuyên bố này liên quan đến các JVM không có JIT. –

3

Nếu bạn thực sự có nhu cầu sử dụng các phương thức không có trong giao diện Danh sách, chắc chắn không có gì sai khi sử dụng API của LinkedList. Quy tắc chung của lập trình đối với giao diện Danh sách nhận ra rằng 1) khá hiếm khi cần các phương thức đó và 2) trong hầu hết mọi người, có nhiều khả năng tôi khám phá ra rằng tôi cần sắp xếp danh sách và/hoặc sử dụng nhiều ngẫu nhiên truy cập, và quyết định chuyển sang ArrayList, hơn là tôi cần một trong những phương thức duy nhất mà LinkedList có.

Có thể bạn cũng có thể lập trình cho giao diện Hàng đợi, nếu bạn thấy Danh sách không cung cấp cho bạn những gì bạn cần.

2

LinkedList là một chung chung. Bạn nên làm:

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

(hoặc bất cứ điều gì khác mà bạn cần lưu trữ trong đó thay vì String)

4

Bạn nên luôn luôn cố gắng giữ cho việc kê khai ở mức cao nhất thể, có nghĩa là bạn nên dừng ở mức cao nhất cung cấp tất cả các chức năng mà bạn cần: nếu phương pháp List không đủ, bạn hoàn toàn ổn với tuyên bố LinkedList của mình.

-2

Thực ra sẽ tốt hơn nếu nó được tham số vì cả hai đều là loại thô.

1

Không .. Điều này sẽ sai, ở giai đoạn sau nếu anh ta muốn thay đổi việc thực hiện từ danh sách liên kết sang bất kỳ việc triển khai danh sách nào khác, anh ta sẽ sai ... Tốt hơn nên sử dụng khai báo mức giao diện.

0

tôi sẽ không luôn luôn khuyên bạn nên sử dụng Generics ..... Coz đôi khi bạn có thể cần phải quấn đối tượng khác nhau như ở đây ....

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

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

Trong một số tình huống như trường hợp của RMI, u chỉ có thể gửi dữ liệu serialized ..... và giả sử bạn muốn gửi một đối tượng lớp (mà là unserialized) ....... Có bạn có thể bọc các thành viên của lớp (nguyên thủy) trong một LinkedList và vượt qua đó đối tượng như một toàn thể ....... không đáng lo ngại về số lượng lớn các đối số ...... Hãy xem xét ví dụ:

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

Bây giờ nơi nào đó u cần phải vượt qua các đối tượng .... Bạn có thể làm như sau ....

   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

bạn vẫn có thể được tiếp cận với phương pháp LinkedList bằng cách sử dụng danh sách, tất cả các bạn phải làm là để loại đúc ví dụ

((LinkedList)ob).add() 

điểm của việc sử dụng Danh sách chung chung và không LinkedList là bởi vì trong trường hợp bạn chỉ cần thay đổi các loại danh sách bạn đang sử dụng (giả danh sách liên kết kép) chương trình của bạn sẽ vẫn làm việc Generics là để đơn giản hóa mã của bạn để di động hơn và nhiều hơn nữa "có thể thay đổi"

Các vấn đề liên quan