ความแตกต่างระหว่างการแคสต์ไปยัง String และ String.valueOf


คำตอบ:


150

การแคสต์ไปยังสตริงจะใช้ได้เฉพาะเมื่อวัตถุนั้นเป็นสตริงเท่านั้น:

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

จะไม่ทำงานเมื่อวัตถุเป็นอย่างอื่น:

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

String.valueOf()อย่างไรก็ตามจะพยายามแปลงสิ่งที่คุณส่งผ่านไปเป็นStringไฟล์. มันจัดการทั้ง primitives ( 42) และ object ( new Integer(42)โดยใช้ object นั้น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"

หมายเหตุโดยเฉพาะอย่างยิ่งตัวอย่างสุดท้าย: ผ่านnullไปจะกลับสตริงString.valueOf()"null"


14
@AdamStelmaszczyk: ฉันสงสัยว่ามีอะไรที่เกี่ยวข้อง บางทีการแคสต์จะเร็วกว่าเล็กน้อย แต่ความแตกต่างอื่น ๆ (การจัดการแบบว่างความสามารถในการจัดการประเภทอื่น ๆ ) มีความสำคัญมากกว่าความแตกต่างด้านประสิทธิภาพเล็กน้อยที่อาจมี
Joachim Sauer

4
เพื่อผลักดันคำถามนี้ต่อไปอีกเล็กน้อยมีความแตกต่างอย่างมีนัยสำคัญระหว่างการโทรString.valueOf()และobj.toString()? (สิ่งแรกที่อยู่ในใจของฉันคือobj.toString()จะผ่านข้อยกเว้นหากobjเป็นโมฆะ)
เควิน

3
@ Kevin: ประเภทอ้างอิง (aka "วัตถุ") nullที่แตกต่างเป็นสิ่งที่เกิดขึ้นกับ ถ้าคุณดูที่การดำเนินการString.valueOf()ใน JDK ของคุณคุณจะเห็นว่าทั้งหมดมันไม่อ้างอิง null toString()ไม่ใช่คือการโทร
Joachim Sauer

1
พยายามแล้ว str = String.valueOf(null)ใน Java 7 Update 80 มันพ่นไฟล์NullPointerException.
เงิน

1
@silver: อันที่จริงฉันย่อมากเกินไป String.valueOf((Object) null)จะส่งคืน String "null" เรียกมันด้วยตัวอักษรnullจะเรียก String # valueOf (ถ่าน []) ซึ่งอันที่จริงพ่น NPE nullเมื่อคุณผ่านใน
Joachim Sauer

19

String.valueOf(foo)จะเรียกfoo 's .toString()วิธีการและกำหนดผลในการที่บาร์ เป็นโมฆะและพิมพ์การทำงานที่ปลอดภัย

การแคสต์จะกำหนดfooให้กับไฟล์แถบหากประเภทตรงกัน ClassCastExceptionมิฉะนั้นการแสดงออกจะโยน


5
+1 สำหรับการอธิบายที่String.valueOf(Object)เรียกร้องObject.toString()
Ryan Amos

4

ทั้งสองสร้างเหมือนกัน การส่งออกStringในกรณีของ

Casting ล้มเหลวในกรณีของวัตถุที่ให้มาไม่ใช่ a string.


3

การแคสต์หมายความว่าออบเจ็กต์ต้องเป็นประเภท String ในขณะที่String.valueOf()สามารถใช้ประเภทอื่นได้เช่นกัน


2

วิธีการ String.valueOf ใช้เพื่อรับการสร้างสตริงใหม่ของอ็อบเจ็กต์พารามิเตอร์

ค่า (String) ร่ายค่าอ็อบเจ็กต์เป็นสตริง

คุณสามารถใช้เมธอด String.valueOf เพื่อรับการแสดงสตริงของอ็อบเจ็กต์โดยไม่ต้องกังวลเกี่ยวกับการอ้างอิง null หากคุณพยายามที่จะส่ง String บนการอ้างอิง null คุณจะได้รับ 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");

เอาท์พุต :strCastOfObj is null


0

อันแรกคือString.valueOfส่งกลับสตริงก็ต่อเมื่อวัตถุนั้นเป็นชนิดที่แสดงได้ซึ่งเป็นชนิดค่าหรือสตริง .. มิฉะนั้นจะส่งข้อยกเว้น

ในอันหลังนี้คุณกำลังแคสต์โดยตรงซึ่งอาจล้มเหลวหากวัตถุไม่ใช่สตริง

ตัวอย่างออนไลน์

http://ideone.com/p7AGh5


ข้อยกเว้นประเภทใด
Yousha Aleayoub

0

ใน String.valueOf (); string as work typecasting ทุกอาร์กิวเมนต์ที่ส่งผ่านใน valueof () วิธีการแปลงใน String และเช่นเดียวกับ integer.string () แปลงจำนวนเต็มเป็นสตริงเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.