เรื่องราวหลากหลายเทคโนโลยีน่ารู้เพื่อคุณ
Group Blog
 
 
กรกฏาคม 2551
 12345
6789101112
13141516171819
20212223242526
2728293031 
 
20 กรกฏาคม 2551
 
All Blogs
 
ปริศนา Java 1

หลังจากเอาวีดีโอขึ้นไปให้ดูกัน มาทดสอบความรู้ Java กันดีกว่า

ก็มีเสียงบ่นว่าวีดีโอยาวจัง ไม่มีเวลาดู ผมก็เลยคิดว่าจะหยิบยกปริศนาภาษา Java จากวีดีโอมาคุยให้ฟังแล้วกันนะครับ เริ่มจากปริศนาแรกเลยนะครับ

import java.util.*;
public class ShortSet {
public static void main(String[] args) {
Set s = new HashSet();
for (short i = 0; i < 100; i++) {
s.add(i);
s.remove(i-1);
}
System.out.println(s.size());
}
}

คำถามคือผลลัพธ์จากโปรแกรมนี้คืออะไร
a. 1
b. 100
c. Throw Exception
d. None of the above

ลองมาไล่โปรแกรมดูนะครับ ถ้าไล่โปรแกรมไปตามปกติจะเห็นว่าเป็นการนำเอาตัวเลข 0 ถึง 99 ใส่ลงใน Set แต่ในการใส่ในแต่ละครั้งจะมีการเอาตัวที่อยู่ก่อนหน้าออก ถ้าลองไล่ดูที่ i = 0, จะได้ set {0} และเมื่อพยายามจะ เอา (0-1 = -1 ) ออกจาก set จะพบว่าไม่มี -1 ดังนั้นจึงไม่มีการเอาอะไรออก ในรอบแรกนี้ set จะมีค่า {0} ในรอบที่ 2 i = 1 จะได้ set คือ {0,1} และเมื่อเอา (1-1 = 0) ออกจะได้ว่า set คือ {1} ดังนั้นถ้าทำอย่างนี้ไปเรื่อย ๆ ในรอบสุดท้ายเราจะได้ set คือ {99} ดังนั้นผลลัพธ์ของโปรแกรมที่สั่งพิมพ์คือขนาดของ Set ก็จะต้องเป็น 1
แต่ถ้าลอง run โปรแกรมดูจะได้ผลลัพธ์คือ 100 ซึ่งคือข้อ b.ครับ คำถามคือทำไม...
คำตอบคือตอนแรกควรจะมาเข้าใจ interface Set กันก่อน ซึ่งมีหน้าตาดังนี้ครับ
Interface Set {
boolean add(E e);
boolean remove (Object o);
...
}

ให้สังเกตุนะครับว่าสำหรับ add จะรับพารามิเตอร์เป็นประเภทที่ระบุไว้ นั่นหมายความว่าเราไม่สามารถใส่ข้อมูลประเภทอื่น ๆ ที่ไม่ได้ระบุไว้ตั้งแต่ตอนสร้าง set ลงใน set ได้ แต่ remove พารามิเตอร์้เป็น Object ซึ่งหมายถึงจะเป็นประเภทข้อมูลอะไรก็ได้ ซึ่งก็ดูประหลาดนะครับ แต่เหตุผลหนึ่งของการทำอย่างนี้ก็คือในเรื่องของ backward compatability และเขาก็บอกว่าได้ลองคิดถึงการที่จะออกแบบให้ใช้ remove(E e) แล้วแต่ปรากฏว่ามันใช้ไม่ได้ในหลายกรณี เขายกตัวอย่างว่าสมมติว่าถ้าเราต้องการจะหาintersection ระหว่าง Set ของ Number กับ Set ของ Long ซึ่งในกรณีนี้เราจะต้องสามารถดึง object ของ Long ออกมาจาก Number ได้
เอาละครับคราวนี้ก็มาดูว่าอะไรทำให้ผลลัพธ์ไม่ได้ตามที่ต้องการ
จากบรรทัด s.remove(i-1) จะเห็นว่าผลลัพธ์ของ i-1 จะเป็น int และจากคุณสมบัติ Autoboxing ก็จะทำให้ได้ผลลัพธ์เป็น object ของ Integer ให้สังเกตุว่าข้อมูลใน Set ที่เราใส่เข้าไปเป็น Short แต่เวลาจะเอาออกเราหา
object ของ Integer ซึ่ง object ของ Integer และ Object ของ Short ไม่สามารถเทียบกันได้ดังนั้นการ remove แต่ละครั้ง จึงไม่มีการเอาอะไรออกจาก set ถ้าจะให้โปรแกรมนี้ทำงานตามที่ต้องการ พอจะตอบได้ไหมครับว่าต้องแก้ตรงไหน ....

ใช่แล้วครับ ต้องแก้บรรทัด s.remove(i-1) เป็น s.remove((short) (i-1)) ซึ่งจะทำให้ได้ผลลัพธ์เป็น Short สิ่งที่ได้จากปริศนา Java นี้ก็คือผลลัพธ์ของการคำนวณเกี่ยวกับจำนวนเต็มจะได้เป็น int หรือ long ดังนั้นให้หลีกเลี่ยงการใช้ short ในโปรแกรมนะครับ เขายกตัวอย่างว่ากรณีเดียวที่น่าจะใช้ short ก็คือการใช้ array ของ short เท่านั้น

หมายเหตุ : บทความนี้ผู้เขียนยินดีที่จะให้นำไปเผยแพร่ต่อได้ แต่ขอให้อ้างอิงที่มาว่ามาจากผู้เขียนด้วย


Create Date : 20 กรกฎาคม 2551
Last Update : 26 กรกฎาคม 2551 19:56:56 น. 2 comments
Counter : 724 Pageviews.

 
สุดยอดเลยครับ ได้ความรู้มากๆ
ทำงานกับ JAVA มา 5-6 ปี T_T ความรู้นี้หายเกลี้ยง

ขอบคุณมากครับ อย่าลืมมาอัพแบ่งปันอีกนะครับ ชอบๆ :)


โดย: สุดลึก วันที่: 6 สิงหาคม 2551 เวลา:18:13:04 น.  

 
คำตอบคือ 1 ครับ
แล้วก็ไม่เห็นเกี่ยวอะไรกับที่อธิบายเลย ....


โดย: DreamGlider วันที่: 2 สิงหาคม 2556 เวลา:2:20:13 น.  

ชื่อ : * blog นี้ comment ได้เฉพาะสมาชิก
Comment :
  *ส่วน comment ไม่สามารถใช้ javascript และ style sheet
 

motokop
Location :


[ดู Profile ทั้งหมด]

ฝากข้อความหลังไมค์
Rss Feed
Smember
ผู้ติดตามบล็อก : 2 คน [?]




สวัสดีครับ สำหรับบล็อกนี้ผมก็ตั้งใจจะให้เป็นข่าวสารที่น่าสนใจทางคอมพิวเตอร์ ทั้งข้อมูลด้านเทคโนโลยีที่น่าสนใจ การพัฒนาโปรแกรม และงานวิจัยต่าง ๆ อาจแทรกไปด้วยเรื่องอื่นๆ บ้าง ตามแต่อารมณ์และสถานการณ์ครับ ยินดีรับความคิดเห็นของทุกคนครับ
Visit InfoServe for backgrounds.

เพื่อนที่กำลังชมบล็อก:

ผู้ชมทั้งหมด:

Friends' blogs
[Add motokop's blog to your web]
Links
 

 Pantip.com | PantipMarket.com | Pantown.com | © 2004 BlogGang.com allrights reserved.