![Screen Shot 2558-11-24 at 9.35.32 AM]()
![Screen Shot 2558-11-24 at 9.35.32 AM]()
เพิ่งอ่าน blog เรื่อง
Why 1000 == 1000 Returns False, but 100 == 100 Returns True in Java ?
แค่เห็นชื่อเรื่องก็งง แต่แอบน่าสนใจ สำหรับ Java Puzzle
โดยใน blog อธิบายที่มาที่ไปได้อย่างน่าสนใจ
ซึ่งน่าจะทำให้เราเข้าใน Java ดีขึ้นมาอีกนิดนึง
ดังนั้นมาดูกันหน่อย ว่าทำไมถึงเป็นเช่นนั้น
มีการพูดคุยใน Facebook ที่นี่
[fb_embed_post href="https://www.facebook.com/somkiatspns/posts/10153769789653588/" width="550"/]
ปัญหามันเกิดจาก code ชุดนี้
เป็น code ที่น่าสนใจ และ น่าค้นหาอย่างมากมาย
[gist id="1b8b815ea6b3711e34b8" file="Aha.java"]
ลองคิดเล่น ๆ ว่า ผลการทำงานจะเป็นอย่างไร ?
...
ผลการทำงาน คือ
false
true
มาถึงตรงนี้เล่นเอางงไปเลย !!
ทำไม 100 == 100 แล้ว
ทำไม 1000 != 1000 ล่ะ
แบบนี้มันลำเอียง หรือ ทำงานไม่ถูกต้องหรือเปล่า ?
โดยพื้นฐานของภาษา Java สำหรับการใช้งาน ==
จะเท่ากัน หรือ ผลที่ได้คือ true ก็ต่อเมื่อทั้งสอง object ชี้ไปยังตำแหน่งเดียวกัน
และมีค่าเท่ากัน ดังนั้น จากความรู้นี้ ผลที่ควรได้คือ
false
false
แต่การทำงานจริง ๆ มันไม่ตามทฤษฎีเลยนะ
ซึ่งเป็นสิ่งที่น่าสนใจอย่างมาก
ดังนั้นมาหาเหตุผลกันดีกว่า
ด้วยการเปิดดู source code ของ Integer.java กัน
ซึ่งเราจะดูที่ method valueOf()
[gist id="1b8b815ea6b3711e34b8" file="Integer.java"]
จาก code จะเห็นว่ามีการเรียกใช้งาน property จาก class IntegerCache ด้วย
คำถามที่เกิดขึ้นมา ก็คือ
- IntegerCache.high มีค่าเท่าไร ?
- IntegerCache.low มีค่าเท่าไร ?
เมื่อเข้าไปดูมันคือ inner private class อยู่ใน Integer.java นั่นเอง
[gist id="1b8b815ea6b3711e34b8" file="IntegerCache.java"]
ซึ่งได้ความว่าค่า default ของแต่ละ property เป็นดังนี้
- IntegerCache.high =127
- IntegerCache.low = -128
ซึ่งตรงนี้นี่เอง เป็นเหตุผลที่ว่า ทำไม
Integer c = 100, d = 100;
จึงเป็น object ที่อ้างถึงตำแหน่งเดียวกัน
ทำให้ผลที่ได้จาก c == d เป็น true
คำถาม ทำต้องทำ Caching ด้วยล่ะ ?
คงต้องไปถามทีมสร้างละมั้ง !!
แต่ถ้าลองพิจารณาด้วยเหตุและผล ก็น่าจะได้คำตอบว่า
เพราะว่าตัวเลขช่วงนี้มันเล็ก ๆ ซึ่งมีโอกาสใช้งานบ่อย ๆ
รวมทั้งต้องการลดจำนวน memory ที่ใช้งานด้วย
ดังนั้น caching มันไว้เลย !!
ลองไปดูใน
JavaDoc ก็พบว่ามีมาตั้งแต่ Java 1.5 นะครับ
![Screen Shot 2558-11-24 at 8.58.00 AM]()
เป็นเรื่องที่ไม่เคยรู้เลยว่า การทำงานภายในของ Integer มันเป็นแบบนี้