2009-02-03 72 views
339

Sự khác nhau giữa hai phương pháp này là gì? Họ xuất hiện để thực hiện chính xác những điều tương tự với tôi (cũng đi cho parseFloat(), parseDouble(), parseLong() vv, làm thế nào là họ khác nhau từ Long.valueOf(string)Sự khác biệt giữa parseInt và valueOf trong java?

Edit:? Ngoài ra, mà trong số này là thích hợp và sử dụng thường xuyên hơn theo quy ước

Trả lời

318

Vâng, API cho Integer.valueOf(String) thực sự cho biết rằng String được hiểu chính xác như thể được cung cấp cho Integer.parseInt(String). Tuy nhiên, valueOf(String) trả lại đối tượng newInteger() đối tượng trong khi parseInt(String) trả về số nguyên int.

Nếu bạn muốn thưởng thức những lợi ích bộ nhớ đệm tiềm năng của Integer.valueOf(int), bạn cũng có thể sử dụng chướng mắt này:

Integer k = Integer.valueOf(Integer.parseInt("123")) 

Bây giờ, nếu những gì bạn muốn là đối tượng và không phải là nguyên thủy, sau đó sử dụng valueOf(String) thể có nhiều hấp dẫn hơn là tạo một vật thể mới ra khỏi số parseInt(String) vì trước đây luôn xuất hiện trên Integer, Long, Double, v.v.

+5

Có sự khác biệt về hiệu năng hoặc bộ nhớ giữa hai cách tiếp cận không? – Logan

+72

'Integer.valueOf (Integer.parseInt (" 123 "))' không có lợi ích hơn 'Integer.valueOf (" 123 ")' hoặc 'Integer.valueOf (123)' ngoài các chu kỳ lãng phí và kích thước của chương trình của bạn. –

+7

Có một sự khác biệt - đối tượng mới (có khả năng) được phân bổ bởi valueOf đi kèm với một chi phí (bộ nhớ cho đối tượng, xử lý, GC), trong khi int đơn giản là cực kỳ "nhẹ". (Đối với các giá trị phổ biến nhất, bạn sẽ nhận được tham chiếu đến các đối tượng đã tồn tại từ trước, giúp một chút nhỏ.) – foo

63

Từ this forum:

parseInt() lợi nhuận số nguyên nguyên thủy loại (int), theo đó valueOf trả về java.lang.Integer, là đối tượng của số nguyên . Có là những trường hợp bạn có thể muốn đối tượng Số nguyên, thay vì loại nguyên thủy.

Tất nhiên, một sự khác biệt rõ ràng là intValue là một phương pháp dụ đó parseInt là một phương pháp tĩnh.

+7

Đáng nói: phiên bản valueOf cũng sẽ sử dụng bể bơi tham khảo nội bộ để trả về đối tượng SAME cho một giá trị đã cho, không chỉ một cá thể khác có cùng giá trị nội bộ. Điều này có nghĩa là hai giây được trả về theo cách này, a.bằng (b) == true và a == b là true – basszero

+0

Như đã được chứng minh thêm, bạn đúng cho các phiên bản String, tôi đã nghĩ về các phiên bản nguyên thủy. Long.valueOf (5) sẽ luôn trả về cùng một đối tượng. Các phiên bản chuỗi trả về các đối tượng mới, các phiên bản nguyên thủy trả về cùng một đối tượng – basszero

+1

@bassezero. Ngoài ra, hồ bơi đó có giới hạn. Tôi nghĩ rằng nó là -127 đến 127. – OscarRyz

31
Integer.valueOf(s) 

cũng tương tự như

new Integer(Integer.parseInt(s)) 

Sự khác biệt là valueOf() trả về một Integer, và trả về một parseInt()int (một loại nguyên thủy). Cũng lưu ý rằng valueOf() có thể trả lại phiên bản được lưu trong bộ nhớ cache Integer, điều này có thể gây ra kết quả khó hiểu khi kết quả của các thử nghiệm == dường như không chính xác. Trước khi autoboxing có thể có một sự khác biệt trong sự tiện lợi, sau java 1.5 nó không thực sự quan trọng.

Hơn nữa, Integer.parseInt(s) cũng có thể lấy kiểu dữ liệu nguyên thủy.

+4

valueOf() có thể trả về cùng một đối tượng cho các cuộc gọi liên tiếp với cùng một đối số (và được yêu cầu cho đối số giữa -128 và 127 bao gồm). new Integer() sẽ luôn tạo một đối tượng mới. –

+0

Loại nào được sử dụng thường xuyên hơn? Tôi nên sử dụng cái nào nhất? –

+2

Nếu bạn cần một int, sử dụng parseInt(), nếu bạn cần một số nguyên, sử dụng valueOf() –

1

Biến thể * phân tích trả về các kiểu nguyên thủy và các phiên bản valueOf trả về Đối tượng. Tôi tin rằng các phiên bản valueOf cũng sẽ sử dụng một pool tham chiếu nội bộ để trả về đối tượng SAME cho một giá trị đã cho, không chỉ là một cá thể khác có cùng giá trị nội bộ.

+0

Trên thực tế, không hoàn toàn đúng sự thật. Ban đầu tôi đã tự nghĩ, nhưng Javadocs cho Integer.valueOf (String) ghi rõ rằng nó tương đương với Integer mới (Integer.parseInt (String)). Integer.valueOf (int) thực sự là cache, mặc dù vậy. –

+0

Bạn là chính xác cho các phiên bản String, tôi đã suy nghĩ về các phiên bản nguyên thủy. Long.valueOf (5) sẽ luôn trả về cùng một đối tượng. – basszero

4

Integer.parseInt chỉ có thể trả về int dưới dạng kiểu gốc.

Integer.valueOf có thể thực sự cần phân bổ đối tượng Integer, trừ khi số nguyên đó xảy ra là một trong những số nguyên được phân bổ. Chi phí này nhiều hơn.

Nếu bạn chỉ cần kiểu gốc, hãy sử dụng parseInt. Nếu bạn cần một đối tượng, hãy sử dụng valueOf.

Ngoài ra, do phân bổ tiềm năng này, hộp tự động không thực sự tốt trong mọi cách. Nó có thể làm chậm mọi thứ.

-2
  1. Trong trường hợp ValueOf -> nó đang tạo đối tượng Integer. không phải là một kiểu nguyên thủy và không phải là một phương thức tĩnh.
  2. Trong trường hợp ParseInt.ParseFloat -> nó trả về kiểu nguyên thủy tương ứng. và là một phương pháp tĩnh.

Chúng tôi nên sử dụng bất kỳ tùy thuộc vào nhu cầu của mình. Trong trường hợp ValueOf vì nó đang khởi tạo một đối tượng. nó sẽ tiêu thụ nhiều tài nguyên hơn nếu chúng ta chỉ cần giá trị của một số văn bản sau đó chúng ta nên sử dụng parseInt, parseFloat, vv ..

0

Vì valueOf trả về một đối tượng Integer mới tại sao mã dưới đây là đúng?

String base5String = "230"; 
int result = Integer.valueOf(base5String); 
+0

autoboxing (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) –

2

Vì bạn có thể đang sử dụng jdk1.5 + và ở đó, nó sẽ tự động chuyển thành int. Vì vậy, trong mã của bạn trở về Integer đầu tiên của nó và sau đó tự động chuyển đổi sang int.

mã của bạn là giống như

int abc = new Integer(123); 
0

Nếu bạn đánh dấu vào lớp Integer bạn sẽ thấy rằng phương pháp gọi valueOf parseInt. Sự khác biệt lớn là bộ nhớ đệm khi bạn gọi giá trị của API. Nó nhớ cache nếu giá trị nằm trong khoảng -128 đến 127 hãy tìm thấy bên dưới vào liên kết để biết thêm thông tin

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html

12

Nhìn vào nguồn Java: valueOf đang sử dụng parseInt:

/** 
* Parses the specified string as a signed decimal integer value. 
* 
* @param string 
*   the string representation of an integer value. 
* @return an {@code Integer} instance containing the integer value 
*   represented by {@code string}. 
* @throws NumberFormatException 
*    if {@code string} cannot be parsed as an integer value. 
* @see #parseInt(String) 
*/ 
public static Integer valueOf(String string) throws NumberFormatException { 
    return valueOf(parseInt(string)); 
} 

parseInt lợi nhuận int

/** 
* Parses the specified string as a signed decimal integer value. The ASCII 
* character \u002d ('-') is recognized as the minus sign. 
* 
* @param string 
*   the string representation of an integer value. 
* @return the primitive integer value represented by {@code string}. 
* @throws NumberFormatException 
*    if {@code string} cannot be parsed as an integer value. 
*/ 
public static int parseInt(String string) throws NumberFormatException { 
    return parseInt(string, 10); 
} 
0

tĩnh công cộng Giá trị nguyên tốOf (Chuỗi s)

  1. Đối số được hiểu là đại diện cho số nguyên thập phân đã ký, chính xác như đối số được đưa cho phương thức parseInt (java.lang.String).
  2. Kết quả là một đối tượng Integer đại diện cho giá trị nguyên được chỉ định bởi chuỗi.

  3. Nói cách khác, phương pháp này trả về một đối tượng Integer bằng với giá trị của: mới Integer (Integer.parseInt (s))

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