2012-01-03 68 views
6

nếu phương thức trả về Double, tại sao chúng ta gọi phương thức "doubleValue" trên đó? nó đã trả về gấp đôi và tính toán, xuất hiện để đánh giá chính xác.Double vs doubleValue trong Java

Trả lời

9

Trước khi Java 1.5 tự động đấm bốc (và unboxing) không tồn tại trong Java. Vì vậy, bạn sẽ cần điều này để trích xuất nguyên thủy cơ bản từ một Double.

Nếu bạn không quen với tự động đấm bốc, bạn có thể đọc thêm tại đây. http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

+0

Vì vậy, từ liên kết, nó gợi ý rằng bạn nên thực hiện lần truy cập hiệu suất từ ​​tự động hộp và tự động phát. Trong một vòng lặp hiệu suất quan trọng, sau đó bạn có thể gọi myDouble.doubleValue() để tránh phải trả tiền phạt không? – MedicineMan

+2

@MedicineMan Không, unboxing chỉ là trình biên dịch sẽ biến 'double foo = myDouble' thành' double foo = myDouble.doubleValue() 'cho bạn - gọi phương thức một cách rõ ràng không quan trọng. Phần lớn các hit hiệu suất là trong việc tạo ra đối tượng 'Double' đóng hộp ở vị trí đầu tiên (và, có thể ở mức độ thấp hơn, trong việc phải truy cập bộ nhớ heap thay vì một stack var để lấy giá trị). – yshavit

+0

yshavit đóng đinh nó. Cách duy nhất để tránh hình phạt là tránh bất kỳ sự chuyển đổi nào giữa Double <--> double. Tuy nhiên, điều đó thường không thực tế, đặc biệt nếu bạn muốn sử dụng bất kỳ Bộ sưu tập nào. Ngoài ra, nó sẽ là một trường hợp * rất hiếm khi mà đây thực sự là một nút cổ chai hiệu suất cho một ứng dụng. – rfeak

1

Bạn gọi 'doubleValue' trên đối tượng Double để chuyển đổi từ đối tượng được đóng hộp thành kiểu dữ liệu nguyên thủy. Vì hầu hết thời gian Double được tự động unboxed thành double, bạn thường không cần phải làm điều này, nhưng nếu bạn muốn rõ ràng trong chuyển đổi của mình, bạn có thể gọi phương thức này.

1

Bạn muốn gọi doubleValue nếu bạn cần lấy số double từ số Double. Trước đây là một kiểu nguyên thủy, trong khi kiểu sau là một kiểu đối tượng bao bọc, về cơ bản gói gọn một giá trị nguyên thủy bên trong một đối tượng bất biến. Nếu có thể (và tôi nói điều này mà không biết chính xác mục đích của mã của bạn), hãy sử dụng double cho tất cả các tính toán của bạn; chỉ sử dụng Double nếu bạn cần lưu trữ các giá trị trong một số Collection hoặc Map; đó là vì các loại đối tượng tiêu thụ nhiều bộ nhớ hơn và có thể phải chịu các hoạt động đúc.

Dễ dàng nhầm lẫn double với Double (điều tương tự áp dụng cho các loại nguyên thủy khác so với loại trình bao bọc), vì trình biên dịch sẽ tự động chuyển đổi từ người này sang người khác khi cần trong quá trình được gọi là tự động đấm bốc -unboxing), vì vậy bạn phải cẩn thận một chút để sử dụng đúng loại.

+0

Và chỉ để thêm vào này một chút, và một cách rõ ràng nhà nước nó: toán học hoạt động và thử nghiệm (số học, so sánh, vv) không thể được thực hiện với 'Double' s, chỉ 'double' s. – yshavit

1

doubleGiá trị trả về số nguyên thủy từ đối tượng Double. Tùy thuộc vào kịch bản, bạn sẽ muốn nhận được gấp đôi của một đôi.