ทดสอบ 1:
ก่อนอื่นให้ดูชุดการเปรียบเทียบประเภทสตริง โดยไม่ต้องกังวลใจเพิ่มเติมเพียงป้อนรหัส:
การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {String a = "Java Book Garden"; String B = "Java Book Garden"; String c = สตริงใหม่ ("Java Book Garden"); สตริง d = สตริงใหม่ ("Java Book Garden"). Intern (); if (a == b) {system.out.println ("a == b"); } else {system.out.println ("a! = b"); } if (A.Equals (b)) {system.out.println ("A.Equals (b)"); } else {system.out.println ("! a.equals (b)"); } if (a == c) {system.out.println ("a == c"); } else {system.out.println ("a! = c"); } if (A.Equals (C)) {System.out.println ("A.Equals (C)"); } else {system.out.println ("! a.equals (c)"); } if (a == d) {system.out.println ("a == d"); } else {system.out.println ("a! = d"); } if (a.equals (d)) {system.out.println ("a.equals (d)"); } else {system.out.println ("A.Equals (d)"); -ผลลัพธ์ผลลัพธ์:
a == ba.equals (b) a! = ca.equals (c) a == da.equals (d)
สรุป:
ผลลัพธ์ A == B: เมื่อโปรแกรมกำลังทำงานมันจะสร้างพูลบัฟเฟอร์สตริง เมื่อ String A = "Java Book Garden", "Java Book Garden" ถูกวางไว้ในสระบัฟเฟอร์สตริง เมื่อ String b = "Java Book Garden" สร้างสตริงโปรแกรมจะค้นหาวัตถุที่มีค่าเดียวกันในสระบัฟเฟอร์สตริงนี้ก่อน ดังนั้นเมื่อ B ถูกสร้างขึ้นโปรแกรมจะพบค่าเดียวกันและอ้างอิงวัตถุที่อ้างอิงโดย ดังนั้น A และ B อ้างถึงวัตถุเดียวกันดังนั้น A == b
เป็นผลให้ a! = c: string c = สตริงใหม่ ("Java Book Garden") ใหม่วัตถุใหม่ดังนั้นจึงไม่ได้ค้นหาจากพูลสตริงบัฟเฟอร์และสร้างวัตถุใหม่โดยตรง ดังนั้น A! = c.
ผลลัพธ์ A == D: เมื่อมีการเรียกวิธีการฝึกงานหากพูลมีสตริงเท่ากับวัตถุสตริงนี้ (วัตถุถูกกำหนดโดยวิธีการเท่ากับ (วัตถุ)) สตริงในพูลจะถูกส่งคืน มิฉะนั้นเพิ่มวัตถุสตริงนี้ไปยังพูลและส่งคืนการอ้างอิงไปยังวัตถุสตริงนี้ D ทั้งหมดเรียกวัตถุของ
เท่ากับการเปรียบเทียบค่าดังนั้นเมื่อค่าเท่ากันพวกเขาจะเท่ากัน
ทดสอบ 2:
นี่คือการทดสอบชุดของประเภท int และประเภทจำนวนเต็ม:
การทดสอบระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {int a = 127; int a1 = 127; int b = 128; จำนวนเต็ม C = 127; จำนวนเต็ม C1 = 127; จำนวนเต็ม d = 128; จำนวนเต็ม D1 = 128; if (a == a1) {system.out.println ("a == a1"); } else {system.out.println ("a! = a1"); } if (b == b1) {system.out.println ("b == b1"); } else {system.out.println ("b! = b1"); } if (c == c1) {system.out.println ("c == c1"); } else {system.out.println ("c! = c1"); } if (d == d1) {system.out.println ("d == d1"); } else {system.out.println ("d! = d1"); -ผลลัพธ์ผลลัพธ์:
a == a1b == b1c == c1d! = d1
ผลลัพธ์ "A == A1" และ "B == B1": int เป็นประเภทพื้นฐานและค่าจะถูกเก็บไว้โดยตรงในขณะที่จำนวนเต็มเป็นวัตถุและชี้ไปที่วัตถุนี้ที่มีการอ้างอิง การเปรียบเทียบส่วนใหญ่ทำจาก "A == A1" และ "B == B1"
ผลลัพธ์ "C == C1" และ "D! = D1" อาจมีคำถามที่นี่ทำไม "D! = D1" ลองมาดูซอร์สโค้ดของจำนวนเต็มด้วยกัน
/** * แคชเพื่อรองรับความหมายของตัวตนของวัตถุของ autoboxing สำหรับค่าระหว่าง * -128 และ 127 (รวม) ตามที่ JLS ต้องการ * * แคชเริ่มต้นจากการใช้งานครั้งแรก ขนาดของแคช * อาจถูกควบคุมโดยตัวเลือก -xx: AutoboxCachemax = <size> * ในระหว่างการเริ่มต้น VM, java.lang.integer.integercache.high คุณสมบัติ * อาจถูกตั้งค่าและบันทึกไว้ในคุณสมบัติของระบบส่วนตัวในคลาส * sun.misc.vm */ คลาสคงที่คลาสคงที่ integercache {คงที่ int int low = -128; int สุดท้ายคงที่สูง; แคชจำนวนเต็มสุดท้ายคงที่ []; {// ค่าสูงอาจถูกกำหนดค่าโดยคุณสมบัติ int h = 127; String IntegercachehighPropValue = sun.misc.vm.gm.getSavedProperty ("java.lang.integer.integercache.high"); if (IntegercachehighPropValue! = null) {int i = parseInt (IntegerCachehighPropValue); i = math.max (i, 127); // ขนาดอาร์เรย์สูงสุดคือจำนวนเต็ม max_value h = math.min (i, integer.max_value -(-low) -1); } สูง = h; แคช = จำนวนเต็มใหม่ [(สูง - ต่ำ) + 1]; int j = ต่ำ; สำหรับ (int k = 0; k <cache.length; k ++) แคช [k] = จำนวนเต็มใหม่ (j ++); } Private IntegerCache () {}} /** * ส่งคืนอินสแตนซ์ {@code Integer} แทนค่า * {@code int} ที่ระบุ หากไม่จำเป็นต้องใช้อินสแตนซ์ {@code Integer} ใหม่โดยทั่วไปวิธีนี้ควรใช้ในการตั้งค่ากับ * ตัวสร้าง {@link #Integer (int)} เนื่องจากวิธีนี้น่าจะเป็นพื้นที่และประสิทธิภาพที่ดีขึ้นอย่างมีนัยสำคัญโดย * แคชที่ร้องขอบ่อยครั้ง * * วิธีนี้จะแคชค่าในช่วง -128 ถึง 127, * รวมและอาจแคชค่าอื่น ๆ นอกช่วงนี้ * * @param ฉัน {@code int} ค่า * @return อินสแตนซ์ {@code integer} แทน {@code i} * @Since 1.5 */ ค่าคงที่ค่าคงที่สาธารณะ (int i) {ยืนยัน IntegerCache.high> = 127; if (i> = integercache.low && i <= integercache.high) return integercache.cache [i + (-integercache.low)]; ส่งคืนจำนวนเต็มใหม่ (i); -สรุป: ที่นี่จำนวนเต็มจะเริ่มต้นพูลคงที่ [-128,127] หากค่าอยู่ในช่วงนี้วัตถุเดียวกันจะถูกอ้างอิง หากไม่ได้อยู่ในช่วงนี้ก็จะเห็นได้จากซอร์สโค้ดว่าวัตถุใหม่ที่ส่งคืนคือ: ส่งคืนจำนวนเต็มใหม่ (i);
ดังนั้นผลลัพธ์ "C == C1" หมายถึงวัตถุเดียวกันและผลลัพธ์ "D! = D1" หมายถึงวัตถุใหม่ใหม่ดังนั้นจึงแตกต่างกัน