มาดูรหัสชิ้นหนึ่ง:
คลาสสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {จำนวนเต็ม num1 = 100; จำนวนเต็ม num2 = 100; จำนวนเต็ม num3 = 200; จำนวนเต็ม num4 = 200; '' '// ผลลัพธ์ผลลัพธ์' 'System.out.println (num1 == num2); System.out.println (num3 == num4); - เดาว่าผลลัพธ์คืออะไร?
หลายคนคิดว่าผลลัพธ์นั้นเป็นจริง แต่ผลลัพธ์ไม่ได้เป็นเช่นนี้
จริง
เท็จ
ทำไมผลลัพธ์นี้? หากผลลัพธ์ถูกอธิบายโดยหน่วยความจำ NUM1 และ NUM2 จะชี้ไปที่วัตถุเดียวกันในขณะที่ NUM3 และ NUM4 ชี้ไปที่วัตถุที่แตกต่างกัน ถัดไปบอกคุณว่าทำไมลองดูที่ซอร์สโค้ดของวิธีการของค่าจำนวนเต็มประเภท:
ค่าคงที่ของจำนวนเต็มสาธารณะ (int i) {ยืนยัน IntegerCache.high> = 127; if (i> = integercache.low && i <= integercache.high) return integercache.cache [i + 128]; ส่งคืนจำนวนเต็มใหม่ (i); -การใช้งาน IntegerCache:
'' '// Integercache คลาสภายในโปรดทราบว่าคุณสมบัติของมันถูกกำหนดให้เป็นขั้นสุดท้ายคงที่' 'IntegerCache คลาสส่วนตัวแบบคงที่ {คงที่สุดท้าย int สูง; '' '// Cache Upper Bound, Null ชั่วคราว' 'Cache Integer Final Integer Final []; '' '// Cache Integer Array' '' '// block ทำไมจึงถูกกำหนดเป็นบล็อก' 'คงที่ {สุดท้าย int low = -128; '' '// แคชต่ำกว่าขอบเขตไม่เปลี่ยนรูป เฉพาะขอบเขตบนเท่านั้นที่สามารถเปลี่ยน '' '' '' '// ค่าสูงเท่านั้นที่สามารถกำหนดค่าได้โดยคุณสมบัติ' '' '' // h ค่าซึ่งสามารถปรับได้โดยการตั้งค่าพารามิเตอร์ autoboxcachemax ของ JDK (มีคำอธิบายด้านล่าง) และช่วงเวลาแคชอัตโนมัติถูกตั้งค่าเป็น [-128, n] โปรดทราบว่าขอบเขตล่างของช่วงเวลาได้รับการแก้ไข int h = 127; ถ้า (IntegercachehighPropValue! = null) {'' // ใช้ long.decode ที่นี่เพื่อหลีกเลี่ยงวิธีการเรียกใช้ที่ '' '' '' // ต้องการแคช autoboxing ของจำนวนเต็มเพื่อเริ่มต้น long.decode (Integercachehighpropvalue) .intvalue (); '' '// ใช้อันที่ใหญ่กว่าเป็นขอบเขตบน แต่มันไม่สามารถมากกว่าขอบเขตของจำนวนเต็ม max_value' '' i = math.max (i, 127); '' '// ขนาดอาร์เรย์สูงสุดคือจำนวนเต็ม max_value' '' h = math.min (i, integer.max_value - -low); } สูง = h; '' '// ขอบเขตบนถูกกำหนด' '' '' '' // คุณสามารถสร้างบล็อกแคชให้ความสนใจกับขนาดอาร์เรย์แคช '' 'cache = ใหม่จำนวนเต็ม [(สูง - ต่ำ - ต่ำ) + 1]; // int j = ต่ำ; สำหรับ (int k = 0; k <cache.length; k ++) แคช [k] = จำนวนเต็มใหม่ (j ++); '' '// -128 ถึงค่าสูงจะถูกจัดสรรให้กับแคชอาร์เรย์หนึ่งทีละหนึ่ง' ''} integercache ส่วนตัว () {}}ผ่านรหัสสองชิ้นนี้จะเห็นได้ว่าเมื่อสร้างวัตถุประเภทจำนวนเต็มผ่านวิธีการค่าของค่าช่วงค่าคือ [-128, 127] ในช่วงเวลานี้ตัวชี้ชี้ไปที่การอ้างอิงวัตถุมีอยู่แล้วใน IntegerCache.Cache เมื่อค่าเกินช่วงนี้วัตถุใหม่จะถูกสร้างขึ้น
สิ่งหนึ่งที่ควรทราบคือไม่ใช่ทุกประเภทในช่วงนี้ให้ดูที่สองประเภท:
ชั้นเรียนสาธารณะหลัก {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {double i1 = 100.0; double i2 = 100.0; double i3 = 200.0; double i4 = 200.0; System.out.println (i1 == i2); System.out.println (i3 == i4); -ผลลัพธ์ผลลัพธ์สุดท้าย:
เท็จ
เท็จ
ด้วยเหตุผลเฉพาะว่าทำไมสิ่งนี้จึงเป็นผลลัพธ์คุณสามารถตรวจสอบการใช้วิธีสองค่าของวิธีการสองครั้งในซอร์สโค้ด มันแตกต่างจากวิธีการจำนวนเต็มของวิธีการเนื่องจากจำนวนของค่าจำนวนเต็มในช่วงที่กำหนดมี จำกัด แต่หมายเลขจุดลอยตัวไม่ได้
โปรดทราบว่า การใช้วิธีการที่มีค่าของจำนวนเต็ม, สั้น, ไบต์, อักขระและความยาวนั้นคล้ายคลึงกัน
การใช้วิธีการของค่าของสองเท่าและลอยตัวคล้ายกัน
ดึงลงมาหนึ่งและผลลัพธ์ของประเภทบูลีนมีสองจริงหรือเท็จ ดูโดยตรงที่ซอร์สโค้ด:
ค่าบูลแบบคงที่สาธารณะ (บูลีน b) {return (b? true: false); -ความจริงและเท็จหมายถึงดังนี้:
บูลีนสุดท้ายคงที่สาธารณะจริง = ใหม่บูลีน (จริง); '' '/**' '' '' '' ** วัตถุ </รหัส> boolean </code> ที่สอดคล้องกับ primitive '' '' '' '' value <code> false </code> '' '' '' **/'' '' '' '' '' '*บูลีนสุดท้ายคงที่สาธารณะเท็จ = ใหม่บูลีน (เท็จ);
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น