2011-07-28 8 views
5

Khi sử dụng một đối tượng nhiều lần, tốt hơn là xóa dữ liệu bằng cách đặt nó thành rỗng, hoặc khởi tạo một đối tượng mới?Hiệu suất Java: Khi xóa một đối tượng, tốt hơn là đặt thành null hoặc tạo đối tượng mới.

Object a = new Object(); 
    for(...){ 
     ... 
     a = null; 
     **OR** 
     a = new Object(); 
    } 

Dưới đây là ví dụ tôi đề cập đến:

Customer a = new Customer(); 
Collection<Customer> data = new ArrayList<Customer>(); 

     while (rs != null && rs.next()) { 
      a = new Customer(); 
      a.setCustId(rs.getLong("CUST_ID")); 
      a.setPerNo(period); 
      a.setName(rs.getString("cust_nm")); 

      if(a!= null) 
       data.add(a); 
     } 

Tôi đang tự hỏi liệu

a = new Customer(); 

là cách tốt nhất để làm điều này hoặc nếu nó nên được thực hiện theo cách hiểu của tôi, nếu bạn tạo một khách hàng mới, bạn đang tạo một đối tượng mới và chỉ một đối tượng mới đó. Vì vậy, đối tượng cũ a đã trỏ đến sẽ được chọn bởi bộ thu gom rác - tương tự trong trường hợp thiết lập nó thành null. Đây có phải là một sự hiểu biết chính xác?

+0

Bạn phải tạo khách hàng mới cho mỗi hàng của tập kết quả, nếu không bạn sẽ kết thúc với cùng một đối tượng trong danh sách cùng số lần vì có các hàng trong tập kết quả với các thuộc tính được đặt theo hàng cuối cùng trong tập kết quả. Ngoài ra kiểm tra null là không cần thiết, 'a' không thể rỗng. –

+1

Trừ khi một cái gì đó đang xảy ra giữa 'a.setName' và' if (a! = Null) ', rằng' if (a! = Null) 'kiểm tra là hoàn toàn dư thừa. Nó sẽ * luôn * vượt qua. – CPerkins

Trả lời

14

Tôi muốn:

for (...) { 
    Object a = new Object(); 
    ... 
} 

Tại sao làm cho phạm vi bất kỳ lớn hơn nó cần phải được?

Tương tự như vậy, trừ khi tôi cần một đối tượng mới, tôi sẽ không tạo một đối tượng nào vì mục đích đó.

Thật khó để nói nhiều hơn từ mô tả được đưa ra mặc dù - nếu bạn có thể đưa ra một ví dụ hoàn chỉnh hơn và thực tế hơn, chúng tôi có thể đưa ra các đề xuất cụ thể hơn.

(Lưu ý rằng không có dấu hiệu cho thấy bạn muốn sử dụng một đối tượng nhiều lần, rất nhiều như sử dụng một biến liên tục Họ khái niệm rất khác nhau..)

EDIT: Nhìn vào ví dụ cụ thể của bạn , tôi muốn viết nó như thế này:

Collection<Customer> data = new ArrayList<Customer>(); 

while (rs != null && rs.next()) { 
    Customer a = new Customer(); 
    a.setCustId(rs.getLong("CUST_ID")); 
    a.setPerNo(period); 
    a.setName(rs.getString("cust_nm")); 

    data.add(a); 
} 

Lưu ý rằng điều này không tạo ra bất kỳ Customer đối tượng có đủ điều kiện để thu gom rác thải - trong khi mã ban đầu của bạn tạo ra một thể hiện của Customer trước khi vào vòng lặp, và sau đó bỏ qua đối tượng mới được tạo, thay vì tạo một đối tượng mới và gán lại giá trị a.

+0

Tôi đã chỉnh sửa câu hỏi của mình để làm rõ những gì tôi đang cố gắng nói. Tôi có thể hiểu lầm, nhưng đề xuất của bạn sẽ hiệu quả hơn như thế nào? Tôi hiểu nó như định nghĩa một đối tượng a và sau đó instantiating nó như là một đối tượng mới, để mỗi khi nó vòng nó sẽ tạo ra một đối tượng mới thay vì sửa đổi một hiện có. - Cảm ơn trước vì đã giúp đỡ. –

+0

@Brad: Bạn không định nghĩa một đối tượng * * 'a', bạn đang khai báo một biến * *' a'. Nó không phải là vấn đề hiệu quả - đó là vấn đề * mã neater *. Từ một quan điểm hiệu quả của xem nó không quan trọng cho dù bạn khai báo biến bên trong hoặc bên ngoài vòng lặp. –

6

Làm nhanh các đối tượng mà bạn cần đến chúng. Không phải nơi bạn không làm. Và đừng lo lắng về mức độ tối ưu hóa này cho đến khi một trình thông báo cho bạn biết.

Chỉnh sửa: Với câu trả lời cập nhật của bạn, sẽ rõ ràng hơn cho người đọc khai báo biến và tạo đối tượng khách hàng của bạn bên trong vòng lặp, như Jon đã đề xuất. Đối với câu hỏi về hiệu suất và thu gom rác thải, bạn cần phải improve your grasp of the basic language concepts.

+0

Đây là câu trả lời hay nhất. – Joseph

1

Tham chiếu NULLing rõ ràng là bắt buộc đối với các trường hợp đặc biệt trong đó bạn rõ ràng muốn "dừng" tham chiếu đến đối tượng và không làm như vậy sẽ dẫn đến rò rỉ bộ nhớ thực. Ví dụ, bạn có thể có một cái nhìn tại mảng được hỗ trợ thực hiện List mà các khe mảng NULLs để tránh trỏ đến các tham chiếu/đối tượng không còn được sử dụng nữa.

1

Tôi nghĩ rằng sự nhầm lẫn của bạn xuất phát từ việc không hiểu rằng các đối tượng được chuyển qua tham chiếu. Nếu bạn đang đến từ một nền C, hiểu rằng trong Java, Customer a = new Customer(); thực sự làm điều gì đó như

Customer* a = (Customer*) malloc (sizeof(Customer)); 
initializeCustomer (a); //the constructor initializes the state of the object. 

Vì bạn thực sự cần bộ nhớ mới cho mỗi khách hàng bạn thêm vào danh sách của bạn, bạn không thể tránh việc tạo ra một đối tượng khách hàng mới cho mỗi lần lặp của vòng lặp.