Thursday, December 31, 2009

ยืดๆ หดๆ กับ ArrayList



ห่างหายจากการเขียนบล็อกไปเดือนหนึ่ง ตอนนี้พ้นช่วงสอบ ทั้งสอบกลางภาคและสอบเข้าทำงาน คืนวันสิ้นปีแบบนี้ก็ขอเขียนบล็อกกันสักหน่อยครับ เผื่อความรู้อันน้อยนิดของผมจะพอเป็นประโยชน์แก่คนอื่นบ้าง (คนเราเกิดมาแล้ว หากไม่ทำประโยชน์ให้โลกบ้าง ก็เกิดมาหนักแผ่นดินเปล่าๆ)

หลายๆ คนที่เขียนโปรแกรมด้วยภาษา Java ก็คงจะคุ้นเคยกับเจ้า ArrayList ซึ่งมีความสามารถในการยืดหดขนาดของตัวเอง (^ ^") ตอนที่มีการเพิ่มหรือลบข้อมูลเหมือนกับ Linked List และยังเข้าถึงข้อมูลในindex ที่ต้องการได้โดยตรง(direct access) ราวๆกับอาร์เรย์ทั่วๆไป เจ้า ArrayList ได้นำข้อดีของทั้งArray และLinked List มารวมไว้ด้วยกัน

เวลาเราใช้่ArrayList ในโปรแกรมของเรา ถ้าต้องการดูขนาดของArrayList เราก็จะเรียกใช้เมธอดที่ชื่อว่า size() ซึ่งเมธอดนี้จะรีเทิร์นผลลัพธ์เป็นเลขจำนวนเต็มบอกถึงจำนวนข้อมูลที่อยู่ในArrayList นั้นๆ และเมื่อเราจะเพิ่มข้อมูลลงไปตรงตำแหน่งท้ายสุดของArrayList เราก็ใช้เมธอด add(E element) ซึ่งใช้เวลาการทำงานเท่ากับ O(1) หรือ add(int index, E element) ในกรณีที่ต้องการระบุตำแหน่งที่ต้องการใส่ข้อมูลใหม่ลงไป ซึ่งใช้เวลาการทำงานเท่ากับ O(n) เนื่องจากต้องเลื่อนข้อมูลทุกตัวไปทางขวามือหนึ่งช่อง ส่วนเวลาต้องการข้อมูลก็เรียกใช้เมธอด get(int index) ซึ่งใช้เวลาในการทำงานเท่ากับ O(1) ถ้าจะลบก็ใช้เมธอด remove(int index) ซึ่งใช้เวลาในการทำงานเท่ากับ O(1) เช่นกัน (เนื่องจากทั้งสองเมธอดเป็นการทำงานแบบ direct access)

เวลาเราใช้เมธอด add() หรือ remove() ขนาดของArrayList ก็จะเปลี่ยนไปด้วย (ทดสอบได้ด้วยการเรียกจากเมธอด size() ) ดูแล้วราวกับว่าArrayList จะปรับเปลี่ยนขนาดของตัวเองได้เหมือนกับ Linked List แต่จริงๆ แล้วเจ้าArrayList ก็มีลิมิตของตัวเองเหมือนกันนะจ้ะ !!!??!!




จริงๆ แล้วArryaList จะจองหน่วยความจำไว้ค่าหนึ่ง แล้วเมื่อเราเพิ่มข้อมูล(เรียกเมธอด add()) ไปเรื่อยๆจนพื้นที่ตรงนั้นเต็ม ArrayList ก็จะทำการเพิ่มหน่วยความจำให้เองโดยอัตโนมัติ ซึ่งขั้นตอนการจองหน่วยความจำตรงนี้ ผู้เขียนโปรแกรมเองไม่จำเป็นต้องทำเอง ทั้งหมดล้วนทำงานอยู่เบื้องหลัง แต่ผู้เขียนโปรแกรมเองก็สามารถที่จะสั่งให้ArrayList เพิ่มขนาดได้ด้วยเช่นกัน โดยการเรียกเมธอด ensureCapacity(int minCapacity) โดยที่อาร์กิวเมนต์ minCapacity คือจำนวนช่องที่เราจะขอเพิ่มขนาดของArrayList

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

No comments:

Post a Comment