Sự khác biệt giữa truyền sang String và String.valueOf


88

Sự khác biệt giữa

Object foo = "something";
String bar = String.valueOf(foo);

Object foo = "something";
String bar = (String) foo;

17
Uh, chúng không giống nhau chút nào ...
Nhận thức

Câu trả lời:


148

Truyền sang chuỗi chỉ hoạt động khi đối tượng thực sự là một chuỗi:

Object reallyAString = "foo";
String str = (String) reallyAString; // works.

Nó sẽ không hoạt động khi đối tượng là thứ khác:

Object notAString = new Integer(42);
String str = (String) notAString; // will throw a ClassCastException

String.valueOf()tuy nhiên sẽ cố gắng chuyển đổi bất cứ thứ gì bạn chuyển vào nó thành a String. Nó xử lý cả nguyên mẫu ( 42) và đối tượng ( new Integer(42), sử dụng đối tượng đó toString()):

String str;
str = String.valueOf(new Integer(42)); // str will hold "42"
str = String.valueOf("foo"); // str will hold "foo"
Object nullValue = null;
str = String.valueOf(nullValue); // str will hold "null"

Đặc biệt lưu ý ví dụ cuối cùng: chuyển nulltới String.valueOf()sẽ trả về chuỗi "null".


13
@AdamStelmaszczyk: Tôi nghi ngờ có bất kỳ điều gì có liên quan. Có thể quá trình truyền nhanh hơn một chút, nhưng những khác biệt khác (xử lý rỗng, khả năng xử lý các loại khác) quan trọng hơn đáng kể so với bất kỳ sự khác biệt hiệu suất nhỏ nào có thể có.
Joachim Sauer

3
Để đẩy câu hỏi này đi xa hơn một chút, có sự khác biệt đáng kể nào giữa cách gọi String.valueOf()obj.toString()? (Điều đầu tiên xuất hiện trong đầu tôi là obj.toString()sẽ thông qua một ngoại lệ nếu objlà giá trị không.)
Kevin

3
@Kevin: đối với các loại tham chiếu (còn gọi là "đối tượng"), sự khác biệt duy nhất là những gì xảy ra với null. Nếu bạn nhìn vào việc triển khai String.valueOf()trong JDK của mình, bạn sẽ thấy rằng tất cả những gì nó làm cho các tham chiếu không null là gọi toString().
Joachim Sauer

@JoachimSauer Tôi luôn nghĩ String.valueOf()là tao nhã hơn một dàn diễn viên. Nhưng nếu String.valueOf()mọi thứ diễn ra đều làm được, và hơn thế nữa, thì có lý do nào khiến người ta chọn sử dụng một diễn viên không? Tại sao nó không được dùng nữa?
Shahid M Zubair

1
@silver: Thật vậy, tôi đã đơn giản hóa quá mức. String.valueOf((Object) null)sẽ trả về Chuỗi "null". Gọi nó bằng một ký tự nullsẽ gọi String # valueOf (char []) thực sự ném NPE khi bạn chuyển vào null.
Joachim Sauer

19

String.valueOf(foo)gọi phương thức của foo.toString() và gán kết quả cho thanh . Nó là null và loại hoạt động an toàn.

Quá trình truyền sẽ chỉ gán foo cho thanh , nếu các loại khớp nhau. Nếu không, biểu thức sẽ ném ra một ClassCastException.


5
+1 Để giải thích lời String.valueOf(Object)kêu gọi đóObject.toString()
Ryan Amos

4

Cả hai đều tạo ra cùng một đầu ra trong trường hợp String.

Casting không thành công trong trường hợp đối tượng được cung cấp không phải là string.


2

Truyền có nghĩa là đối tượng cần có kiểu String, trong khi String.valueOf()cũng có thể có các kiểu khác.


2

Phương thức String.valueOf được sử dụng để lấy lại chuỗi ký tự của đối tượng tham số của nó.

(Chuỗi) giá trị chuyển giá trị đối tượng thành chuỗi.

Bạn có thể sử dụng phương thức String.valueOf để lấy biểu diễn chuỗi của một đối tượng mà không cần lo lắng về các tham chiếu rỗng. Nếu bạn cố gắng ép kiểu String trên một tham chiếu rỗng, bạn sẽ nhận được một NullPointerException.


1
final Object obj = null;
final String strValOfObj = String.valueOf(obj);
final String strCastOfObj = (String) obj;
if (strValOfObj == null) System.out.println("strValOfObj is null");
if (strCastOfObj == null) System.out.println("strCastOfObj is null");

Đầu ra :strCastOfObj is null


0

Cái đầu tiên, tức là, chỉ String.valueOftrả về một chuỗi nếu đối tượng là một kiểu có thể biểu diễn là một kiểu giá trị hoặc một Chuỗi. Nếu không, nó ném ngoại lệ.

Trong cái thứ hai, bạn đang truyền trực tiếp có thể không thành công nếu đối tượng không phải là một chuỗi.

Ví dụ trực tuyến.

http://ideone.com/p7AGh5


Loại ngoại lệ nào?
Yousha Aleayoub

0

trong String.valueOf (); string as work typecasting tất cả đối số được truyền trong phương thức valueof () chuyển đổi trong String và giống như integer.string () chỉ chuyển đổi số nguyên thành chuỗi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.