เกร็ดเล็กเกร็ดน้อยใน Java | AWT headless, การเรียงลำดับใน Map และการปัดทศนิยม

เนื่องจากเรื่องที่จะเขียนนั้นสั้นมาก ได้มาจากการค้นหาข้อมูลเพื่อแก้ปัญหาในงานที่ทำ จึงขอรวมไว้ในโพสต์เดียวเลย

  1. โปรแกรมบนเครื่องที่ไม่มีจอภาพ ซึ่งศัพท์เฉพาะทางจะเรียกว่าเฮดเล็สเซิร์ฟเวอร์ (headless server) เช่น เครื่องเซิร์ฟเวอร์แบบเบลด (Blade server) การรันจะต้องระบุจาวาพร็อพเพอร์ตี้ -Djava.awt.headless=true ด้วย เพราะถ้าไม่ใส่ จะทำให้เกิดข้อผิดพลาด NoClassDefFoundError ได้ งงอยู่นาน คิดว่าคลาสพาธ (classpath) มีปัญหา
  2. ลำดับการเก็บข้อมูลในแม็พ (Map) อาจจะไม่ได้เรียงตามลำดับการใส่ข้อมูลเสมอไป ถ้าต้องการเรียงลำดับข้อมูล มี 2 ทางเลือกคือ ใช้ LinkedHashMap เพื่อเรียงลำดับตามการใส่ข้อมูลก่อนหลัง และ TreeMap ซึ่งจะเรียงลำดับตามค่าคีย์แบบน้อยไปหามาก ก่อนหน้านี้เข้าใจผิดคิดว่า HashMap ธรรมดาจะเรียงตามลำดับการใส่ข้อมูล
  3. คลาสแม็ธ (Math) สามารถปัดทศนิยมเป็นจำนวนเต็มได้ แต่ถ้าต้องการปัดให้ยังเหลือทศนิยมอยู่ ใช้วิธีการทางคณิตศาสตร์มาเสริมได้ เช่น ถ้าต้องการปัดให้เหลือทศนิยม 2 ตำแหน่ง ให้เขียนคำสั่ง (double) Math.round(value * 100) / 100 วิธีนี้ทำงานได้เร็วกว่าการใช้คลาสอื่นๆมาช่วย เช่น DecimalFormat เป็นเทคนิคที่ใช้งานได้ผลและทำงานในระดับคณิตศาสตร์ล้วนๆ

ที่มา:

สแลช (SLASH)

Advertisements

ใน Java ใช้ NIO หรือ IO ดีกว่ากัน

ใน Java มี 2 ทางเลือกในการใช้งานไอโอ (I/O) คือ ไอโอ (IO) กับ เอ็นไอโอ (NIO) โดยเอ็นไอโอนั้นสามารถเลือกได้ว่าจะใช้งานแบบบล็อกกิ้ง (blocking) หรือไม่ โดยส่วนมากเลือกใช้เอ็นไอโอเพียงเพราะว่าใหม่กว่า น่าจะต้องดีกว่า จึงเกิดคำถามในการออกแบบโปรแกรมว่า แบบไหนดีกว่ากัน เมื่อค้นหาข้อมูลจึงพบการวิเคราะห์ที่น่าสนใจในบล็อก jenkov.com

ไอโอจะใช้สตรีม (stream) เป็นหลัก ในขณะทีเอ็นไอโอนั้นจะใช้งาน(ไบต์)บัฟเฟอร์ (ByteBuffer) เป็นหลัก ส่วนการทำงานแบบน็อนบล็อกกิ้ง (non-blocking) จะใช้งานผ่านเซเล็กเตอร์ (Selector) ซึ่งข้อดีก็คือสามารถควบคุมการทำงานได้มากกว่า 1 แชนแนล (channel)

บ่อยครั้งที่เขียนโปรแกรม พยายามที่จะใช้เอ็นไอโอแต่เนื่องจากข้อมูลในบัฟเฟอร์มีอยู่มาก เพื่อความสมบูรณ์ของข้อมูล ยังไงก็ต้องวนรอบ (loop) การส่งด้วยคำสั่ง ByteBuffer.hasRemaining() และ ByteBuffer.flush() อยู่ดี จึงอาจจะไม่เกิดประโยชน์ที่จะมาใช้งานน็อนบล็อกกิ้ง การเขียนโปรแกรมโดยใช้เอ็นไอโอนั้นทำให้โครงสร้างโปรแกรมซับซ้อนขึ้นมามาก

ตอนท้ายของบล็อกอ้างอิงได้สรุปแบบเข้าใจง่ายๆว่า

  • เอ็นไอโอเหมาะกับการกระจายข้อมูลเล็กๆไปยังหลายแชนแนลพร้อมๆกัน เช่น ระบบแชท หรือ ระบบพีทูพี (P2P: Peer-to-peer) จึงสามารถใช้ประโยชน์ของน็อนบล็อกกิ้งได้เต็มประสิทธิภาพมากกว่า
  • ไอโอเหมาะกับการใช้แชนแนลน้อยๆแต่แบนด์วิดธ์ (bandwidth) สูงๆ ส่งข้อมูลทีละมากๆ เช่น ระบบที่มีแชนแนลที่ต่อถาวรและส่งข้อมูลจากจุดหนึ่งไปยังอีกจุดหนึ่งเท่านั้น (Dedicated channel)

โปรดใช้วิจารณญาณในการเลือก เพราะเป็นเพียงข้อแนะนำ ไม่ใช่ว่าจะถูกต้องเสมอไป ถ้าสนใจตามไปดูการวิเคราะห์ทั้งหมดได้เลย

ที่มา: http://tutorials.jenkov.com/java-nio/nio-vs-io.html

สแลช (Slash)