Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 1997

เพิ่งรู้ว่า Integer ใน Java นั้น 100 เท่ากับ 100 แต่ 1000 ไม่เท่ากับ 1000

$
0
0

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 มันเป็นแบบนี้

Viewing all articles
Browse latest Browse all 1997

Trending Articles