CodeGym /จาวาบล็อก /สุ่ม /จาวาเว็กเตอร์
John Squirrels
ระดับ
San Francisco

จาวาเว็กเตอร์

เผยแพร่ในกลุ่ม
คุณอาจเคยเจออาร์เรย์ใน Java แล้ว และคุณรู้ว่าหนึ่งในข้อเสียเปรียบหลักของพวกเขาคือความคงที่ของขนาด เมื่อคุณสร้างอาร์เรย์ที่มีขนาดที่กำหนดแล้ว คุณจะไม่สามารถเปลี่ยนแปลงได้ในภายหลัง มี Java Collection framework หลายคลาสในภาษา Java ที่แก้ปัญหานี้ได้ หนึ่งในนั้นคือ Java Vector Class จะกล่าวถึงในบทความนี้

คลาสเวกเตอร์คืออะไร

อย่างที่เราเขียนไว้ในคำนำ คลาส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());

   }
}
ผลลัพธ์ของโปรแกรมนี้อยู่ด้านล่าง:
ขนาดของเวกเตอร์ว่าง = 0 [Johnny, Ivy, Ricky] [Johnny, Ivy, Ricky, Johnny, Paul] ขนาดของเวกเตอร์ = 5 องค์ประกอบแรกของเวกเตอร์ = Johnny 0 3 ขนาดของเวกเตอร์หลังล้าง วิธีการ = 0

เกิดอะไรขึ้นกับ 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()

Vector มีปัญหาจริง ๆ ... ทำไมยังเป็น Java และทำไมต้องสอน?

คำถามเกิดขึ้น: ทำไมเราถึงเรียน คลาส Vectorเลย? แล้วทำไมมันถึงยังไม่ถูกลบออกจาก Java? ความจริงก็คือว่า Java ยอมรับหลักการของความเข้ากันได้แบบย้อนกลับ ซึ่งหมายความว่าโค้ดเก่าทั้งหมดที่เขียนเมื่อหลายปีก่อนจะถูกเข้าใจโดย Java เวอร์ชันใหม่ นอกจากนี้ยังมีแอปพลิเคชั่นระดับองค์กรสองสามตัวในสภาพแวดล้อม Java ที่ได้รับการสนับสนุนมานานหลายทศวรรษ ค่อนข้างเป็นไปได้ที่คุณจะต้องจัดการกับ "ไดโนเสาร์" ในงานของคุณ ดังนั้นคุณต้องเตรียมพร้อมสำหรับความประหลาดใจ เช่น โค้ดที่มีคลาสดั้งเดิมที่ไม่มีประสิทธิภาพ
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION