ถ้า String เป็นคลาสที่เหมือนกันจะสามารถเริ่มต้นได้อย่างไรโดยใช้เครื่องหมายคำพูดคู่
java.lang.String
มีการปฏิบัติพิเศษของภาษา Java
ถ้า String เป็นคลาสที่เหมือนกันจะสามารถเริ่มต้นได้อย่างไรโดยใช้เครื่องหมายคำพูดคู่
java.lang.String
มีการปฏิบัติพิเศษของภาษา Java
คำตอบ:
นักออกแบบของ Java ตัดสินใจที่จะรักษาประเภทดั้งเดิมในภาษาเชิงวัตถุแทนที่จะทำให้ทุกอย่างเป็นวัตถุเพื่อปรับปรุงประสิทธิภาพของภาษา Primitives ถูกเก็บไว้ใน call stack ซึ่งต้องการพื้นที่เก็บข้อมูลน้อยกว่าและมีราคาถูกกว่าในการจัดการ ในทางกลับกันวัตถุจะถูกเก็บไว้ในกองโปรแกรมซึ่งต้องการการจัดการหน่วยความจำที่ซับซ้อนและพื้นที่เก็บข้อมูลมากขึ้น
ด้วยเหตุผลด้านประสิทธิภาพ String ของ Java ได้รับการออกแบบให้อยู่ระหว่างดั้งเดิมและคลาส
ตัวอย่างเช่น
String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // same reference
String s4 = new String("Hello"); // String object
String s5 = new String("Hello"); // String object
หมายเหตุ: ตัวอักษรสตริงจะถูกเก็บไว้ในกลุ่มทั่วไป สิ่งนี้อำนวยความสะดวกในการแบ่งปันที่เก็บข้อมูลสำหรับสตริงที่มีเนื้อหาเดียวกันเพื่อประหยัดพื้นที่เก็บข้อมูล String
วัตถุที่จัดสรรผ่านผู้ให้บริการใหม่จะถูกเก็บไว้ในheap
และไม่มีการแชร์พื้นที่เก็บข้อมูลสำหรับเนื้อหาเดียวกัน
Java ถือว่า String เป็นคลาสพิเศษคุณสามารถเริ่มต้นได้ทั้งสองวิธี
กำหนดตัวอักษรโดยตรง
String a = "adsasdf";
เป็นวัตถุอื่น ๆ ที่ใช้คำหลักใหม่
String a = new String("adsasdf");
คุณต้องระมัดระวังเป็นพิเศษเมื่อคุณต้องการเปรียบเทียบกับ==
เครื่องหมาย:
String a = "asdf";
String b = "asdf";
System.out.println(a == b); // True
System.out.println(a.equals(b)); // True
String a = new String("asdf");
String b = new String("asdf");
System.out.println(a == b); // False
System.out.println(a.equals(b)); // True
นั่นเป็นเพราะในกรณีแรกวัตถุ a และ b จะถูกเก็บไว้ในสิ่งที่เรียกว่าliteral pool
และพวกเขาทั้งสองกำลังอ้างอิงวัตถุเดียวกันดังนั้นพวกเขาจะเท่ากันทั้งสองวิธี
แต่ในกรณีที่สอง a และ b อ้างอิงวัตถุต่าง ๆ เช่นเมื่อเราเริ่มต้นวัตถุอื่น ๆ ดังนั้นจึงไม่เท่ากันเมื่อเปรียบเทียบกับ==
โอเปอเรเตอร์ในขณะที่ค่าเท่ากัน
String ได้รับการดูแลเป็นพิเศษใน JLS: มันเป็นหนึ่งในสองชนิดที่ไม่ใช่แบบดั้งเดิมที่ตัวอักษรที่มีอยู่ (อื่น ๆ ที่เป็นClass
) *
จากJLS :
สตริงตัวอักษรเป็นการอ้างอิงถึงอินสแตนซ์ของคลาส `String [... ]
* ก็ยังมี "ประเภท null"ด้วย "null literal" null
แต่คนส่วนใหญ่ไม่คิดว่า "null type" เป็นประเภทที่เหมาะสม
null
จะได้รับมอบหมายให้ตัวแปรประเภทการอ้างอิงใด ๆ มันไม่ใช่ประเภทที่น่าสนใจ
มันเป็นคุณสมบัติของภาษาจาวา ตัวอักษรสตริงในซอร์สโค้ดจะได้รับการดูแลเป็นพิเศษ
spec ภาษาที่นี่เพียงแค่บอกว่าตัวอักษรสตริงเป็นString
ประเภท
ข้อความภายในเครื่องหมายคำพูดคู่สร้างString
วัตถุที่แท้จริง
String myString = "Some text";
โค้ดด้านบนสร้างString
วัตถุโดยใช้เครื่องหมายคำพูดคู่
สตริงที่ใช้บ่อยในภาษาการเขียนโปรแกรม ตั้งแต่จาวาเป็นวัตถุเชิงสตริงเป็นวัตถุ เพื่อหลีกเลี่ยง String ใหม่ที่ยุ่งยาก ("someString"); คำสั่งทุกครั้งที่คุณต้องการวัตถุสตริง java ช่วยให้คุณเพียงแค่สร้างวัตถุสตริงโดยใช้สตริงตัวอักษร
แต่คุณควรคำนึงถึงความเสมอภาคของสตริง นี่คือการทดสอบ JUnit สั้น ๆ เพื่อแสดงให้เห็นว่าฉันหมายถึงอะไร
@Test
public void stringTest() {
// a string literal and a string object created
// with the same literal are equal
assertEquals("string", new String("string"));
// two string literals are the same string object
assertSame("string", "string");
// a string literal is not the same object instance
// as a string object created with the same string literal
assertFalse("string" == new String("string"));
// java's String.intern() method gives you the same
// string object reference for all strings that are equal.
assertSame("string", new String("string").intern());
}
new String(String src)
เท่านั้นคุณจะไม่สามารถให้ตัวสร้างสตริงได้ตามตัวอักษร คุณจะต้องเริ่มต้นchar []
และจากนั้นใช้ตัวString(char [] src)
สร้างเพื่อสร้างสตริงหรือคุณจะต้องอ่านสตริงจากไฟล์
เพียงพูดถึง สตริงตัวอักษรเป็นการอ้างอิงถึงอินสแตนซ์ของคลาส String คุณสามารถเขียนโค้ดดังนี้:
"ABC" .getBytes (); "A: B: C" .split ( ":"); "愛" .codePointAt (0);
-สตริงเป็นชั้นในJava คุณมีความถูกต้องเกี่ยวกับมันดังนั้นเราจึงสามารถเริ่มต้นด้วยnew
คำหลักได้เสมอ
-แต่เมื่อเราทำสิ่งที่ชอบ:
String s = "";
ข้อความข้างต้นมีการทำเครื่องหมายโดยคอมไพเลอร์จะเป็นวัตถุ String พิเศษแล้วJVM ระหว่างการโหลดของชั้น (โหลดจะทำก่อนที่จะเริ่มต้น) เห็นว่านี่คือสิ่งที่เป็นที่รู้จักกันเป็นตัวอักษรสตริงซึ่งถูกเก็บไว้ในสระว่ายน้ำตัวอักษรสตริง
-ดังนั้นสตริงสามารถสร้างขึ้นโดยใช้new()
และโดย""
วิธีการ แต่อย่างหลังให้สตริงตัวอักษรที่อยู่ในกองแม้ในขณะที่ไม่มีการอ้างอิงถึงวัตถุสตริงนั้นเพราะมันมีการอ้างอิงจากสระว่ายน้ำตัวอักษรสตริง
Java ทำกระบวนการสองขั้นตอนสำหรับเรา
String str = "hello";
เทียบเท่ากับ
char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);
เช่น [. NET] [1] มีสิ่งที่คล้ายกัน
String(Char[]) constructor
ทำ
String(char[] value)
เพิ่มการอ้างอิง: -
"hello"
เป็นตัวอักษรสตริงและจะถูกใส่ลงไปในสระว่ายน้ำอย่างต่อเนื่องโดยคอมไพเลอร์ดูJLS §3.10.5และJVMs §5.1
Java.lang.String
ไม่ใช่แค่ชั้นเรียน มันเป็นส่วนสำคัญของภาษาหลัก คอมไพเลอร์มีน้ำตาลซินแทคติคสำหรับมัน ยกตัวอย่างเช่นเป็นเหมือนย่อสำหรับ""
new String("")
เมื่อเขียน""
คอมไพเลอร์จะปรับสตริงที่เหมือนกันให้เหมาะสมกับอินสแตนซ์เดียวกันเพื่อประหยัดพื้นที่"a" + 5 == "a5" ==> true
คอมไพเลอร์มีน้ำตาลประโยคสำหรับสิ่งต่าง ๆ มากมายรวมถึงไม่ต้องทำกล่อง / unbox ระหว่างรุ่นวัตถุและชนิดดั้งเดิมไม่มีแม่หมายถึงวัตถุตัวสร้างเริ่มต้น ...
""
new String("")
ไม่ได้เป็นตัวย่อสำหรับ หากคุณใช้""
สิ่งแรกที่จะทำคือค้นหาการจับคู่ในกลุ่มสตริงของ JVM และหากเป็นจริงจะส่งคืนสตริงนั้น โดยการใช้new String("")
คุณจะสร้างสตริงใหม่เสมอแม้ว่าตัวสตริงจะมีอยู่แล้วในพูลสตริง (เพราะจะไม่ถูกเก็บไว้ในพูลสตริง)
" "
เป็นสตริงอยู่แล้ว!