2012-05-29 51 views
11

Mã 1:giá trị Thêm vào ArrayList

ArrayList arr = new ArrayList(); 
arr.add(3); 
arr.add("ss"); 

Mã 2:

ArrayList<Object> arr = new ArrayList<Object>(); 
arr.add(3); 
arr.add("ss"); 

Mã 3:

ArrayList<Object> arr = new ArrayList<Object>(); 
arr.add(new Integer(3)); 
arr.add(new String("ss")); 

tất cả ba mã trên được làm việc tốt .. có thể một số một cho tôi biết cái nào được ưa thích và tại sao .. và tại sao trình biên dịch nhật thực luôn đưa ra cảnh báo khi loại đối số không được đề cập đến Arraylist .. cảm ơn trong quảng cáo vance ..

Trả lời

10

Quy tắc đơn giản đầu tiên: không bao giờ sử dụng công cụ xây dựng String(String), nó hoàn toàn vô dụng (*).

Vì vậy, arr.add("ss") là tốt.

Với 3 hơi khác: 3 là một chữ cái int, không phải là đối tượng. Chỉ các đối tượng mới có thể được đưa vào List. Vì vậy, int sẽ cần được chuyển đổi thành đối tượng Integer.Trong hầu hết các trường hợp sẽ được thực hiện tự động cho bạn (quá trình đó được gọi là autoboxing). Nó hiệu quả cũng giống như Integer.valueOf(3)có thể (và sẽ) tránh tạo một trường hợp Integer mới trong một số trường hợp.

Vì vậy, thực sự viết arr.add(3)thường một ý tưởng tốt hơn so với sử dụng arr.add(new Integer(3)), bởi vì nó có thể tránh việc tạo ra một đối tượng mới Integer và thay vào đó tái sử dụng và hiện có một.

Tuyên bố từ chối: Tôi đang tập trung vào sự khác biệt giữa khối mã thứ hai và thứ ba ở đây và bỏ qua phần generics khá nhiều. Để biết thêm thông tin về generics, xin vui lòng kiểm tra các câu trả lời khác.

(*) có một số trường hợp góc che khuất nơi nó hữu ích, nhưng một khi bạn tiếp cận những người bạn sẽ biết không bao giờ lấy lời khai tuyệt đối như tuyệt đối ;-)

2

Cũng bằng cách thực hiện ở trên, bạn mở chính mình để chạy các lỗi thời gian, trừ khi bạn vui mừng chấp nhận rằng danh sách mảng của bạn có thể chứa cả chuỗi và số nguyên và voi.

Eclipse trả về lỗi vì nó không muốn bạn không biết thực tế là bằng cách chỉ định không có loại cho thông số chung mà bạn đang tự mở cho các lỗi thời gian chạy. Ít nhất với hai ví dụ khác bạn biết rằng bạn có thể có các đối tượng trong Arraylist của bạn và vì Inetegers và Strings là cả hai đối tượng Eclipse không cảnh báo bạn.

Hoặc mã 2 hoặc 3 là ok. Nhưng nếu bạn biết bạn sẽ có một trong hai chỉ ints hoặc chỉ chuỗi trong ArrayList của bạn sau đó tôi sẽ làm

ArrayList<Integer> arr = new ArrayList<Integer>(); 

hoặc

ArrayList<String> arr = new ArrayList<String>(); 

tương ứng.

6

thứ hai sẽ được ưa thích:

  • nó tránh không cần thiết/constructor không hiệu quả gọi
  • nó làm cho bạn chỉ định các loại nguyên tố cho danh sách (nếu đó là mất tích, bạn nhận được một cảnh báo)

Tuy nhiên, có hai loại đối tượng khác nhau trong cùng một danh sách có một chút mùi thiết kế xấu. Chúng ta cần thêm bối cảnh để nói về điều đó.

+2

Để xây dựng trên điểm cuối cùng của @ Thilo, nhiều nhà phát triển Java sẽ nói rằng việc trộn nhiều loại vào một danh sách 'Danh sách ' là vấn đề và bạn nên thiết kế mã của mình cẩn thận hơn. –

+1

Hãy để tôi chỉ thêm tên mẫu chống được yêu thích chưa được công nhận của tôi ở đây: Trộn các loại không liên quan trong một danh sách duy nhất có mùi của [đối tượng từ chối] (http://stackoverflow.com/a/3725728/40342). –

3

Dạng thứ hai được ưa thích:

ArrayList<Object> arr = new ArrayList<Object>(); 
arr.add(3); 
arr.add("ss"); 

Luôn luôn ghi rõ lý lẽ chung khi sử dụng các loại generic (như ArrayList<T>). Điều này quy định ra hình thức đầu tiên.

Đối với biểu mẫu cuối cùng, thông tin chi tiết hơn và không hoạt động thêm vì không có lợi ích.

0

trong lần đầu tiên bạn don 't xác định loại sẽ được tổ chức và liên kết trong ArrayList của bạn xây dựng

đây là phương pháp ưa thích để làm như vậy, bạn xác định loại danh sách và ide sẽ xử lý phần còn lại

trong một phần ba bạn sẽ tốt hơn chỉ cần định nghĩa Lis t cho mã ngắn

+0

Bạn đã không reffered hoặc chỉ vào generics đó là một bản chất của câu hỏi này. Nó không phải là IDE mà "xử lý phần còn lại" nhưng trình biên dịch. Ngoài ra "chỉ cần xác định Danh sách" không phải là mã ngắn hơn - đó là "Chương trình cho một" giao diện ", không phải là một quy tắc" triển khai "là chủ đề lớn hơn nhiều. –

2

Trên thực tế, một phần ba là ưa thích:

ArrayList<Object> array = new ArrayList<Object>(); 
array.add(Integer.valueOf(3)); 
array.add("ss"); 

Điều này tránh autoboxing (Integer.valueOf(3) so 3) và không tạo ra một đối tượng String không cần thiết.

Eclipse than phiền khi bạn không sử dụng đối số kiểu với kiểu chung chung như ArrayList, vì bạn đang sử dụng thứ được gọi là kiểu thô, không được khuyến khích. Nếu một lớp là generic (nghĩa là, nó có các tham số kiểu), thì bạn nên luôn sử dụng các đối số kiểu với lớp đó.

Tự động tạo hộp thư, là tùy chọn cá nhân. Một số người không sao với nó, và một số thì không. Tôi không thích nó, và tôi bật cảnh báo cho autoboxing/autounboxing.

2

Bạn nhận được cảnh báo vì ArrayList là một phần của Generics java. Về cơ bản, đó là một cách để bắt lỗi loại của bạn tại thời gian biên dịch. Ví dụ, nếu bạn khai báo danh sách mảng của bạn với các kiểu Integer (ArrrayList<Integer>) và sau đó cố gắng thêm Strings vào nó, bạn sẽ nhận được một lỗi tại thời gian biên dịch - tránh các sự cố khó chịu khi chạy.

Cú pháp đầu tiên là có khả năng tương thích ngược và nên tránh bất cứ khi nào có thể (lưu ý rằng generics không có trong phiên bản cũ của java).

Ví dụ thứ hai và thứ ba tương đương nhiều. Khi bạn cần truyền một đối tượng và không phải là kiểu nguyên thủy cho phương thức add, thì 3 của bạn được chuyển đổi nội bộ thành Integer(3). Bằng cách viết một chuỗi trong ngoặc kép, bạn đang tạo đối tượng String hiệu quả. Khi gọi String("ss") bạn đang tạo đối tượng String mới có giá trị bằng với tham số ("ss").

Trừ khi bạn thực sự cần lưu trữ các loại khác nhau trong Danh sách của mình, tôi khuyên bạn nên sử dụng khai báo loại thích hợp, ví dụ: ArrayList<Integer> = new ArrayList<Integer>() - nó sẽ giúp bạn tiết kiệm rất nhiều đau đầu trong thời gian dài.

Nếu bạn cần nhiều kiểu dữ liệu trong danh sách, thì ví dụ thứ hai là tốt hơn.

2

Hai biến thể cuối cùng giống nhau, int được tự động đóng gói Integer khi bạn cần Object. Nếu bạn không viết bất kỳ lớp nào trong <> nó sẽ là Object theo mặc định. Vì vậy, không có sự khác biệt, nhưng nó sẽ là tốt hơn để hiểu nếu bạn viết Object.

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