คลาสเวกเตอร์คืออะไร
อย่างที่เราเขียนไว้ในคำนำ คลาสVectorจาก Java Collection Framework ช่วยขจัดปัญหาเรื่องขนาดคงที่ของอาร์เรย์ Java Vector เป็นอาร์เรย์ไดนามิกประเภทหนึ่งและสามารถขยายหรือย่อขนาดได้ การใช้ คลาสคอลเลกชัน Vectorเราสามารถจัดเก็บกลุ่มขององค์ประกอบเป็นวัตถุง่ายๆ และจัดการกับมันด้วยวิธีการต่างๆ คลาส Vector มีอยู่ในแพ็คเกจjava.util ดังนั้น สามารถใช้ Vector ใน Java ได้หากคุณไม่ทราบขนาดของอาร์เรย์ล่วงหน้า หรือหากคุณต้องการ "อาร์เรย์" ที่สามารถเปลี่ยนขนาดได้ตลอดอายุการใช้งานของโปรแกรม ต้องบอกทันทีว่าเวกเตอร์คลาสค่อนข้างเก่าแล้วและคอลเลกชั่นต่อมาปรากฏว่าสามารถแทนที่ได้ในกรณีส่วนใหญ่ “อะนาล็อก” ยอดนิยมของ Java Vector คือคลาสArrayList ความแตกต่างที่สำคัญที่สุดระหว่างคลาสเหล่านี้คือ Vector จะซิงโครไนซ์ ในขณะที่ ArrayList ไม่ใช่ เราจะพูดถึงความแตกต่างอื่น ๆ ระหว่างสองคลาสนี้และอะนาล็อกที่ทันสมัยกว่าของ คลาส Vectorในภายหลังในหัวข้อ "เกิดอะไรขึ้นกับคลาส Vector"วิธี Java Vector
นี่คือวิธี Java Vector :-
void add(int index, Object element)แทรกองค์ประกอบที่ระบุในตำแหน่งที่ระบุของเวกเตอร์
-
การเพิ่มบูลีน (Object o)เพิ่มองค์ประกอบที่ระบุที่ส่วนท้ายของเวกเตอร์
-
บูลีน addAll(Collection c)เพิ่มองค์ประกอบทั้งหมดในคอลเลกชันที่ระบุที่ส่วนท้ายของเวกเตอร์ ตามลำดับที่ส่งคืนโดยตัววนซ้ำคอลเลกชันที่ระบุ
-
บูลีน addAll(int ดัชนี, คอลเลกชัน c)แทรกองค์ประกอบทั้งหมดภายในคอลเลกชันที่ระบุลงในเวกเตอร์ในตำแหน่งที่ระบุ
-
โมฆะ addElement (Object obj)เพิ่มองค์ประกอบที่ระบุที่ส่วนท้ายของเวกเตอร์นี้ เพิ่มขนาดทีละหนึ่ง
-
int capacity()ส่งคืนความจุปัจจุบันของเวกเตอร์นี้
-
void clear()ลบองค์ประกอบทั้งหมดออกจากเวกเตอร์นี้
-
Object clone()ส่งคืนการโคลนของเวกเตอร์นี้
-
บูลีนมี (องค์ประกอบวัตถุ)ทดสอบว่าวัตถุที่ระบุเป็นส่วนประกอบในเวกเตอร์นี้หรือไม่
-
บูลีนcontainAll(Collection c)คืนค่าจริงหากเวกเตอร์มีองค์ประกอบทั้งหมดของคอลเลกชันที่ระบุ
-
void copyInto(Object[] anArray)คัดลอกส่วนประกอบของเวกเตอร์นี้ไปยังอาร์เรย์ที่ระบุ
-
Object elementAt(int index)ส่งคืนส่วนประกอบที่ดัชนีที่ระบุ
-
องค์ประกอบการแจงนับ ()ส่งคืนการแจงนับส่วนประกอบของเวกเตอร์นี้
-
void sureCapacity(int minCapacity)เพิ่มความจุของเวกเตอร์นี้ หากจำเป็น เพื่อให้แน่ใจว่าสามารถเก็บจำนวนส่วนประกอบที่กำหนดโดยอาร์กิวเมนต์ความจุขั้นต่ำเป็นอย่างน้อย
-
บูลีนเท่ากับ (วัตถุ o)เปรียบเทียบวัตถุที่ระบุกับเวกเตอร์นี้
-
วัตถุ firstElement()ส่งคืนองค์ประกอบแรก (องค์ประกอบที่ดัชนี 0) ของเวกเตอร์นี้
-
Object get(int index)ส่งคืนองค์ประกอบในตำแหน่งที่ระบุในเวกเตอร์นี้
-
int hashCode()ส่งคืนค่ารหัสแฮชสำหรับเวกเตอร์นี้
-
int indexOf(Object elem)ค้นหาการเกิดขึ้นครั้งแรกของอาร์กิวเมนต์ที่กำหนด ทดสอบความเท่าเทียมกันโดยใช้วิธีการเท่ากับ
-
int indexOf(Object elem, int index)ค้นหาการเกิดขึ้นครั้งแรกของอาร์กิวเมนต์ที่กำหนด เริ่มต้นที่ดัชนี และทดสอบความเท่าเทียมกันโดยใช้วิธีการเท่ากับ
-
เป็นโมฆะ insertElementAt (Object obj, int index)แทรกวัตถุที่ระบุเป็นส่วนประกอบในเวกเตอร์นี้ที่ดัชนีที่ระบุ
-
บูลีน isEmpty()ทดสอบเวกเตอร์นี้เพื่อหาส่วนประกอบที่ขาดหายไป
-
Object lastElement()ส่งคืนองค์ประกอบสุดท้ายของเวกเตอร์
-
int lastIndexOf(Object elem)ส่งคืนดัชนีของการเกิดขึ้นครั้งล่าสุดของวัตถุที่ระบุในเวกเตอร์นี้
-
int lastIndexOf(Object elem, int index)ค้นหาย้อนหลังสำหรับวัตถุที่ระบุ เริ่มต้นที่ดัชนีที่ระบุ และส่งกลับดัชนีไปยังวัตถุนั้น
-
ลบวัตถุ (ดัชนี int)ลบองค์ประกอบที่ตำแหน่งที่ระบุในเวกเตอร์นี้
-
การลบบูลีน (Object o)จะลบการเกิดขึ้นครั้งแรกขององค์ประกอบที่ระบุในเวกเตอร์นี้ ถ้าเวกเตอร์ไม่มีองค์ประกอบ มันจะไม่เปลี่ยนแปลง
-
บูลีน removeAll(Collection c)จะลบองค์ประกอบทั้งหมดออกจากเวกเตอร์ที่มีอยู่ใน Collection ที่ระบุ
-
void removeAllElements()จะลบส่วนประกอบทั้งหมดออกจากเวกเตอร์และกำหนดขนาดเป็นศูนย์
-
บูลีน removeElement(Object obj)จะลบอาร์กิวเมนต์ที่เกิดขึ้นครั้งแรก (ดัชนีต่ำสุด) ออกจากเวกเตอร์นี้
-
ถือเป็นโมฆะ removeElementAt (ดัชนี int)ลบองค์ประกอบที่ดัชนี
-
โมฆะที่ได้รับการป้องกัน removeRange(int fromIndex, int toIndex)ลบองค์ประกอบทั้งหมดที่มีดัชนีอยู่ระหว่าง fromIndex, inclusive และ toIndex ออกจากรายการนี้
-
บูลีนretainAll(Collection c)เก็บเฉพาะองค์ประกอบในเวกเตอร์ที่มีอยู่ในคอลเล็กชันที่ระบุ
-
ชุดวัตถุ (ดัชนี int องค์ประกอบวัตถุ)แทนที่องค์ประกอบในตำแหน่งที่ระบุในเวกเตอร์นี้ด้วยองค์ประกอบที่ระบุ
-
void setElementAt(Object obj, int index)ตั้งค่าส่วนประกอบที่ดัชนีที่ระบุของเวกเตอร์นี้เป็นวัตถุที่กำหนด
-
void setSize(int newSize)กำหนดขนาดของเวกเตอร์นี้
-
int size()ส่งคืนจำนวนส่วนประกอบในเวกเตอร์นี้
-
List subList(int fromIndex, int toIndex)ส่งคืนการแสดง (มุมมอง) ของส่วนหนึ่งของรายการนี้ระหว่าง fromIndex รวม และ toIndex เท่านั้น
-
Object[] toArray()ส่งคืนอาร์เรย์ที่มีองค์ประกอบทั้งหมดของเวกเตอร์นี้ในลำดับที่ถูกต้อง
-
Object[] toArray(Object[] a)ส่งคืนอาร์เรย์ที่มีองค์ประกอบทั้งหมดของเวกเตอร์นี้ในลำดับที่ถูกต้อง ประเภทการดำเนินการของอาร์เรย์ที่ส่งคืนคือประเภทของอาร์เรย์ที่ระบุ
-
String toString()ส่งกลับการแสดงสตริงของเวกเตอร์นี้ที่มีการแสดงสตริงของแต่ละองค์ประกอบ
-
void trimToSize()ตัดความสามารถของเวกเตอร์นี้เป็นขนาดปัจจุบันของเวกเตอร์
ตัวอย่าง Java Vector
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
Vector vector = new Vector();
System.out.println("the size of the empty vector = " + vector.size());
//adding some vector elements
vector.add("Johnny");
vector.add("Ivy");
vector.add("Ricky");
System.out.println(vector);
//adding more vector elements
vector.add("Johnny");
vector.add("Paul");
System.out.println(vector);
System.out.println("the size of the vector = " + vector.size());
System.out.println("the first element of the vector = " + vector.firstElement());
//here the program will print out the first appearance of "Johnny" element
System.out.println(vector.indexOf("Johnny"));
//program will print out the first appearance of "Johnny" element starting from the element 1
System.out.println(vector.indexOf("Johnny", 1));
vector.clear(); //deleting all vector elements
System.out.println("the size of the vector after clear method = " + vector.size());
}
}
ผลลัพธ์ของโปรแกรมนี้อยู่ด้านล่าง:
เกิดอะไรขึ้นกับ Vector Class?
ตามเอกสารของคลาส Java Vectorหากคุณไม่ต้องการการใช้งานเธรดอย่างปลอดภัยในโปรแกรมของคุณ ขอแนะนำให้ใช้ArrayListแทนVector (Collection Framework ผู้เข้าร่วมที่มีประสิทธิภาพมากกว่า) ลองเปลี่ยนตัวอย่างด้าน บน เล็กน้อยโดยใช้ คลาส ArrayListแทนVector
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List vector = new ArrayList();
//Vector vector = new Vector();
System.out.println("the size of the empty vector = " + vector.size());
vector.add("Johnny");
vector.add("Ivy");
vector.add("Ricky");
System.out.println(vector);
vector.add("Johnny");
vector.add("Paul");
System.out.println(vector);
System.out.println("the size of the vector = " + vector.size());
//System.out.println("the first element of the vector = " + vector.firstElement());
//here the program will print out the first appearance of "Johnny" element
System.out.println(vector.indexOf("Johnny"));
//program will print out the first appearance of "Johnny" element starting from the element 1
//System.out.println(vector.indexOf("Johnny", 1));
vector.clear();
System.out.println("the size of the vector after clear method = " + vector.size());
}
}
เราแสดงความคิดเห็นในบรรทัดด้วยvector.indexOf("Johnny", 1)เนื่องจากไม่มีวิธีการดังกล่าวในรูปแบบนี้ในคลาสArrayList ด้วยเหตุผลเดียวกัน บรรทัด vector.firstElement()จึงถูกใส่ความคิดเห็น ในส่วนอื่นๆ ทั้งหมด โปรแกรมให้ผลลัพธ์เหมือนกับอันแรก แน่นอน ในตัวอย่างดังกล่าว มันไม่ชัดเจนว่าทำไมArrayList ถึงดีกว่าVector สิ่งนี้ต้องการความรู้เพิ่มเติมเกี่ยวกับเธรด เราแสดงเหตุผลไว้ที่นี่ ประการแรก แม้ว่า คลาส Vectorจะได้รับการซิงโครไนซ์ แต่ก็ไม่สามารถเรียกได้ว่าปลอดภัยสำหรับเธรดอย่างสมบูรณ์ แม้ว่าสิ่งนี้จะดูแปลกก็ตาม ความจริงก็คือVector ซิงโครไนซ์แต่ละการดำเนินการ ไม่ใช่ Vectorทั้งหมดเช่นนั้นเอง นี่อาจเป็นปัญหาในโปรแกรมที่คุณจำเป็นต้องซิงโครไนซ์ทั้งชุดของการดำเนินการแทนที่จะดำเนินการทีละรายการ สมมุติว่า ถ้าเธรดหนึ่งกำลังวนซ้ำบนเวกเตอร์ และอีกเธรดกำลังแก้ไขอินสแตนซ์ของเวกเตอร์ในเชิงโครงสร้าง ตัววนซ้ำจะส่งConcurrentModificationException ปรากฎว่าสองเธรดสามารถทำงานกับ อินสแตนซ์ Vectorได้ในเวลาเดียวกันหากดำเนินการต่างกัน ประการที่สองเวกเตอร์คลาสไม่มีประสิทธิภาพที่ดีที่สุดเนื่องจากวัตถุมีอาร์เรย์และการซิงโครไนซ์ที่ปรับขนาดได้ การรวมกันนี้หมายถึงค่าใช้จ่ายเพิ่มเติมสำหรับการดำเนินการบล็อก ไม่ว่าจะต้องมีการซิงโครไนซ์หรือไม่ก็ตาม แน่นอน สิ่งนี้ส่งผลต่อประสิทธิภาพการทำงาน นอกจากนี้ การซิงโครไนซ์เวกเตอร์ในแต่ละการดำเนินการยังส่งผลเสียต่อประสิทธิภาพ เนื่องจากเราจะได้รับการล็อกครั้งแล้วครั้งเล่าสำหรับการดำเนินการแต่ละครั้ง หากมีการซิงโครไนซ์ทั้งอินสแตนซ์ของคลาส การล็อกก็จะได้รับเพียงครั้งเดียว ซึ่งมีประสิทธิภาพมากกว่ามาก ประการที่สามVectorรองรับวิธีการดั้งเดิมบางอย่าง ตัวอย่างเช่นelement(). วิธีนี้จะส่งคืนการแจงนับส่วนประกอบของเวกเตอร์ โปรแกรมเมอร์มักใช้ Iterator หรือ ListIterator ในการแจงนับ และด้วยเหตุผลหลายประการ โดยเฉพาะอย่างยิ่ง การแจงนับไม่มี เมธอด remove()ที่กำหนดไว้ ซึ่งหมายความว่ารายการไม่สามารถแก้ไขโครงสร้างได้ระหว่างการวนซ้ำ นอกจากนี้ ซึ่งแตกต่างจาก ListIterator การแจงนับไม่ได้เสนอการเข้าถึงแบบสองทิศทาง อย่างที่คุณเห็นVectorมีปัญหาค่อนข้างน้อย จะทำอย่างไรถ้าคุณยังต้องการการใช้งาน List interface แบบปลอดภัยสำหรับเธรด ในกรณีนี้ArrayListจะไม่ช่วยอะไร แต่คุณสามารถใช้ ตัวอย่างเช่น คลาส CopyOnWriteArrayListแทนVector ; มันถูกวางตำแหน่งเป็นตัวแปรที่ปลอดภัยสำหรับเธรดของArrayList. คุณยังสามารถซิงโครไนซ์ArrayList โดยใช้ วิธี Collections synchronizedList()
GO TO FULL VERSION