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
Trả lời
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.
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'. –
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>
.
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>();
.
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.
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ể. –
@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
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. –
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.
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)
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.
Thực ra sẽ tốt hơn nếu nó được tham số vì cả hai đều là loại thô.
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.
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......
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"
- 1. Khai báo một trình lặp trong Java
- 2. Confirm Java LinkedList "foreach" lặp
- 3. Khai báo chuỗi Java
- 4. Khai báo biến enum trong Java bean
- 5. Khai báo mảng Mảng Byte trong Java
- 6. Khai báo gói Maven + Java
- 7. Java - Khai báo các mảng
- 8. Xóa khỏi một LinkedList
- 9. "LinkedList là không chung chung" lỗi Java
- 10. Chi tiết triển khai bản sao của LinkedList sao chép
- 11. tại sao LinkedList không có initialCapacity trong java?
- 12. Khai báo một enum trong một lớp
- 13. Java Enums: Phương thức triển khai sau khi khai báo?
- 14. Tại sao LinkedList trong Java không phải là một Danh sách Liên kết thực sự?
- 15. clear() impl trong Java's LinkedList
- 16. "AndroidManifest.xml không khai báo gói Java" lỗi
- 17. Tại sao một enum được khai báo trong một tệp riêng biệt, trong Java?
- 18. Lấy chỉ lĩnh vực tĩnh khai báo trong Java lớp
- 19. regex để khớp khai báo biến trong java
- 20. Có thể khai báo biến 1 bit trong Java không?
- 21. Cách tốt nhất để khai báo biến logger trong java
- 22. Xác nhận khai báo các biểu mẫu trong Java/Swing
- 23. Khai báo đối tượng là cuối cùng trong java
- 24. @interface khai báo mặc định sử dụng trong Java
- 25. ArrayList hoặc khai báo danh sách trong Java
- 26. Khai báo một mảng byte trong VB.NET
- 27. LinkedList Vs ConcurrentLinkedQueue
- 28. Java - "Xoay" đối tượng trong một LinkedList - Là LinkedList.addLast (LinkedList.removeFirst()) Tốt hay xấu Lập trình?
- 29. Java: In LinkedList không có dấu ngoặc vuông?
- 30. Tại sao NULL không khai báo?
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. –
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 –
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