2010-03-23 27 views
5

Sự cần thiết của Bộ sưu tập khung trong Java vì tất cả các hoạt động dữ liệu (phân loại/thêm/xóa) là có thể với Mảng và mảng hơn là phù hợp cho tiêu thụ bộ nhớ và hiệu suất cũng tốt hơn so với Bộ sưu tập.Nhu cầu về khung thu thập trong java là gì?

Bất kỳ ai cũng có thể chỉ cho tôi ví dụ về định hướng dữ liệu theo thời gian thực cho thấy sự khác biệt trong cả hai (mảng/Bộ sưu tập) của các triển khai này.

Trả lời

26
  • Mảng không thể thay đổi kích thước.
  • Khung sưu tập Java cung cấp nhiều loại dữ liệu hữu ích khác nhau, chẳng hạn như danh sách được liên kết (cho phép chèn bất kỳ nơi nào trong thời gian cố định), danh sách mảng có thể định lại (như Vector nhưng mát hơn), cây đỏ đen, bản đồ dựa trên băm (như Hashtable) lạnh hơn).
  • Khung sưu tập Java cung cấp trừu tượng, vì vậy bạn có thể tham khảo danh sách dưới dạng List, cho dù được danh sách mảng hoặc danh sách được liên kết hỗ trợ; và bạn có thể tham khảo bản đồ/từ điển dưới dạng Map, dù được hỗ trợ bởi cây đỏ đen hay có thể bắt đầu bằng thẻ.

Nói cách khác, Java Collections Framework cho phép bạn sử dụng đúng cấu trúc dữ liệu, bởi vì một kích thước không phù hợp với tất cả.

+2

+1 Chắc chắn là một câu trả lời tốt hơn. Tôi đã xóa của tôi đó là vụng về. –

+3

@Adeel: Tôi có thể cải thiện nó nhiều hơn nữa (các cuộc thảo luận về thời điểm sử dụng, Bộ sưu tập của Google, v.v.), nếu tôi không cố gắng sử dụng súng nhanh nhất ở phương Tây. :-P –

2

Các lớp tập hợp như Cài đặt, Danh sách và Triển khai bản đồ gần với "không gian sự cố". Chúng cho phép các nhà phát triển hoàn thành công việc nhanh hơn và chuyển thành mã dễ đọc hơn/dễ bảo trì hơn.

+0

Một số tiền rất đẹp lên. Cảm ơn. –

0

Tùy thuộc vào nhu cầu của ứng dụng của bạn. Có rất nhiều loại bộ sưu tập, bao gồm:

  • HashSet
  • ArrayList
  • HashMap
  • TreeSet
  • TreeMap
  • LinkedList

Vì vậy, ví dụ, nếu bạn cần để lưu trữ cặp khóa/giá trị, bạn sẽ phải viết nhiều mã tùy chỉnh nếu nó sẽ là cơ sở ed off một mảng - trong khi các bộ sưu tập Hash * chỉ nên làm việc ra khỏi hộp. Như thường lệ, hãy chọn đúng công cụ cho công việc.

6

Một số lý do:

  • lớp bộ sưu tập Java cung cấp một giao diện mức cao hơn so với mảng.
  • Mảng có kích thước cố định. Bộ sưu tập (xem ArrayList) có kích thước linh hoạt.
  • Việc triển khai hiệu quả các cấu trúc dữ liệu phức tạp (ví dụ: bảng băm) trên đầu các mảng thô là một nhiệm vụ khó khăn. HashMap chuẩn cung cấp cho bạn miễn phí.
  • Có các triển khai khác nhau mà bạn có thể chọn cho cùng một tập hợp dịch vụ: ArrayList vs. LinkedList, HashMap vs. TreeMap, được đồng bộ hóa, v.v.
  • Cuối cùng, mảng cho phép hiệp phương sai: đặt thành phần của mảng không được đảm bảo thành công do lỗi đánh máy chỉ có thể phát hiện khi chạy. Generics ngăn chặn vấn đề này trong mảng.

Hãy xem đoạn này minh họa các vấn đề hiệp phương sai:

String[] strings = new String[10]; 
    Object[] objects = strings; 

    objects[0] = new Date(); // <- ArrayStoreException: java.util.Date 
+0

Không, bạn sẽ không được phép truyền 'đối tượng' sang' Integer [] ', bởi vì nó thực sự thuộc kiểu' String [] '; bạn sẽ nhận được 'ClassCastException' tại thời điểm đó. –

+0

Bạn nói đúng. Sửa lỗi. –

1

Đối với mỗi lớp trong API Collections có một câu trả lời khác nhau cho câu hỏi của bạn. Dưới đây là một vài ví dụ.

Danh sách liên kết: Nếu bạn xóa phần tử ở giữa một mảng, bạn trả chi phí di chuyển tất cả các phần tử sang bên phải của phần tử đã xóa. Không phải như vậy với một danh sách liên kết.

Đặt: Nếu bạn cố gắng triển khai một tập hợp với một mảng, thêm phần tử hoặc kiểm tra sự hiện diện của phần tử là O (N). Với một HashSet, nó là O (1).

Bản đồ: Để triển khai bản đồ bằng cách sử dụng một mảng sẽ cung cấp các đặc điểm hiệu suất giống như việc triển khai mảng giả định của một tập hợp.

0

Vâng tiền đề cơ bản là "sai" từ Java bao gồm các lớp từ điển từ trước giao diện tồn tại trong ngôn ngữ ...

bộ sưu tập cung cấp danh sách đó là hơi tương tự như mảng, nhưng họ cung cấp nhiều điều hơn mà không phải. Tôi cho rằng bạn vừa mới nói về Danh sách (và thậm chí là Đặt) và để lại Bản đồ ra khỏi nó.

Có, có thể nhận được cùng chức năng như Danh sách và Đặt bằng một mảng, tuy nhiên có rất nhiều công việc liên quan. Toàn bộ điểm của một thư viện là người dùng không phải "triển khai" các hoạt động phổ biến của riêng họ.

Khi bạn có một triển khai duy nhất mà mọi người sử dụng nó cũng dễ dàng hơn để biện minh cho các nguồn chi tiêu tối ưu hóa nó. Điều đó có nghĩa là khi các bộ sưu tập tiêu chuẩn được tăng tốc hoặc giảm dung lượng bộ nhớ, tất cả các ứng dụng sử dụng chúng đều được cải tiến miễn phí.

Một giao diện duy nhất cho mỗi điều cũng đơn giản hóa mọi nhà phát triển về đường cong học tập - không có nhiều cách khác nhau để làm điều tương tự.

Nếu bạn muốn có một mảng phát triển theo thời gian, có thể bạn sẽ không đặt mã tăng trưởng trên tất cả các lớp, mà thay vào đó sẽ viết một phương thức tiện ích để thực hiện điều đó. Tương tự để xóa và chèn vv ...

Ngoài ra, mảng không phù hợp để chèn/xóa, đặc biệt khi bạn mong đợi rằng thành viên .length được cho là phản ánh số lượng nội dung thực tế, vì vậy bạn sẽ chi tiêu lượng thời gian phát triển và thu hẹp mảng. Các mảng cũng không phù hợp với các Bộ như bạn sẽ phải lặp qua toàn bộ mảng mỗi lần bạn muốn thực hiện chèn để kiểm tra các bản sao. Điều đó sẽ giết bất kỳ hiệu quả nhận thức nào.

0

Bộ sưu tập là khung trong java và bạn biết rằng khung công tác rất dễ sử dụng hơn là triển khai và sau đó sử dụng nó và mối quan tâm của bạn là tại sao chúng tôi không sử dụng mảng có những hạn chế của mảng như nó là tĩnh, bạn phải xác định kích thước của hàng atleast trong đầu, vì vậy nếu mảng của bạn là lớn thì nó sẽ kết quả chủ yếu là lãng phí bộ nhớ lớn. để bạn có thể sử dụng ArrayList trên đó là bên trong hệ thống phân cấp bộ sưu tập.

Sự phức tạp là vấn đề khác như u muốn chèn vào mảng sau đó bạn phải theo dõi nó để xác định chỉ mục trên nó. Bạn có thể sử dụng LinkedList tất cả các chức năng được triển khai chỉ cần u sử dụng và trở thành mã của bạn ít phức tạp hơn và bạn có thể đọc có nhiều ưu điểm khác nhau của cấu trúc phân cấp

0

Bộ sưu tập Java có chức năng, khả năng sử dụng và tiện lợi khác.

Khi trong một ứng dụng chúng tôi muốn làm việc trên nhóm đối tượng, chỉ ARRAY không thể giúp chúng tôi, hoặc thay vào đó họ có thể dẫn đến làm những việc với một số hoạt động rườm rà.

Một khác biệt quan trọng, là một trong những khả năng sử dụng và tiện lợi, đặc biệt là cho rằng Bộ sưu tập tự động mở rộng về quy mô khi cần thiết:

Bộ sưu tập đã đưa ra phương pháp để đơn giản hóa công việc của chúng tôi.

Mỗi người có một tính năng độc đáo:

  • List- Về cơ bản một mảng biến kích thước;
    Bạn thường có thể thêm/xóa các mục ở bất kỳ vị trí tùy ý nào;
    Thứ tự của các mục được xác định rõ ràng (nghĩa là bạn có thể nói vị trí của một mục nhất định trong danh sách).

    Được sử dụng - Hầu hết các trường hợp bạn chỉ cần lưu trữ hoặc lặp lại thông qua "một loạt các sự vật" và sau đó lặp qua chúng.

  • Đặt- Mọi thứ có thể "ở đó hoặc không" - khi bạn thêm các mục vào bộ, không có ý nghĩa về số lần được thêm vào và thường không có khái niệm đặt hàng.

    Đã sử dụng- Ghi nhớ "những mục bạn đã xử lý", ví dụ: khi thực hiện thu thập thông tin trên web;
    Thực hiện các quyết định có-không khác về một mặt hàng, ví dụ: "là mục một từ tiếng Anh", "là mục trong cơ sở dữ liệu?" ", là mục trong danh mục này?" vv

Ở đây bạn tìm thấy ứng dụng của mỗi collection as per scenario:

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