Java Vector(向量)

Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能。

向量和数组相似,都可以保存一组数据(数据列表)。但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一种类似于“动态数组”的功能,向量与数组的重要区别之一就是向量的容量是可变的。

可以在向量的任意位置插入不同类型的对象,无需考虑对象的类型,也无需考虑向量的容量。

向量和数组分别适用于不同的场合,一般来说,下列场合更适合于使用向量:
如果需要频繁进行对象的插入和删除工作,或者因为需要处理的对象数目不定。
列表成员全部都是对象,或者可以方便的用对象表示。
需要很快确定列表内是否存在某一特定对象,并且希望很快了解到对象的存放位置。

向量作为一种对象提供了比数组更多的方法,但需要注意的是,向量只能存储对象,不能直接存储简单数据类型,因此下列场合适用于使用数组:

  • 所需处理的对象数目大致可以确定。
  • 所需处理的是简单数据类型。

Java向量(vector)与ArrayList

在Java中,ArrayList和Vector都实现List接口并提供相同的功能。但是,它们之间存在一些差异。

Vector类同步每个单独的操作。这意味着每当我们想对向量执行某些操作时,Vector类就会自动对该操作应用锁。

这是因为当一个线程访问一个vector时,同时另一个线程试图访问它,会生成一个称为ConcurrentModificationException的异常。因此,对每个操作持续使用锁会降低向量的效率。

但是,在ArrayList中,方法是不同步的。相反,它使用Collections.synchronizedList()方法对整个列表进行同步。

注意:由于向量(vector)不是线程安全的并且效率较低,因此建议使用ArrayList代替Vector。

创建向量(vector)

这是我们如何用Java创建向量(vector)。

Vector<Type> vector = new Vector<>();

此处,Type表示vector存储的数据类型。例如,

//创建整数类型的vector
Vector<Integer> vector= new Vector<>();

//创建字符串类型的vector
Vector<String> vector= new Vector<>();

创建向量(vector)

这是我们如何用Java创建向量(vector)。

Vector<Type> vector = new Vector<>();

此处,Type表示vector存储的数据类型。例如,

//创建整数类型的vector
Vector<Integer> vector= new Vector<>();

//创建字符串类型的vector
Vector<String> vector= new Vector<>();

向量(vector)方法

Vector类还提供List接口的可调整大小的数组实现(类似于ArrayList类)。 一些Vector方法是:

向量添加元素

  • add(element) - 向向量(vector)添加元素

  • add(index, element) - 将元素添加到指定位置

  • addAll(vector) - 将向量(vector)的所有元素添加到另一个向量(vector)

例如,

import java.util.Vector;

class Main {
    public static void main(String[] args) {
        Vector<String> mammals= new Vector<>();

        //使用add()方法
        mammals.add("Dog");
        mammals.add("Horse");

        //使用索引号
        mammals.add(2, "Cat");
        System.out.println("Vector: " + mammals);

        // 使用 addAll() 方法
        Vector<String> animals = new Vector<>();
        animals.add("Crocodile");

        animals.addAll(mammals);
        System.out.println("New Vector: " + animals);
    }
}

输出结果

Vector: [Dog, Horse, Cat]
New Vector: [Crocodile, Dog, Horse, Cat]

访问vector元素

  • get(index) - 返回由索引指定的元素

  • iterator() - 返回迭代器对象以顺序访问矢量元素

例如

import java.util.Iterator;
import java.util.Vector;

class Main {
    public static void main(String[] args) {
        Vector<String> animals= new Vector<>();
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");

        // 使用 get() 方法
        String element = animals.get(2);
        System.out.println("Element at index 2: " + element);

        // 使用 iterator()
        Iterator<String> iterate = animals.iterator();
        System.out.print("Vector: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

输出结果

Element at index 2: Cat
Vector: Dog, Horse, Cat,

删除vector元素

  • remove(index) - 从指定位置删除元素

  • removeAll() - 删除所有元素

  • clear() - 删除所有元素。它比removeAll()更高效

例如

import java.util.Vector;

class Main {
    public static void main(String[] args) {
        Vector<String> animals= new Vector<>();
        animals.add("Dog");
        animals.add("Horse");
        animals.add("Cat");

        System.out.println("Initial Vector: " + animals);

        //使用 remove() 方法
        String element = animals.remove(1);
        System.out.println("Removed Element: " + element);
        System.out.println("New Vector: " + animals);

        // 使用 clear() 方法
        animals.clear();
        System.out.println("Vector after clear(): " + animals);
    }
}

输出结果

Initial Vector: [Dog, Horse, Cat]
Removed Element: Horse
New Vector: [Dog, Cat]
Vector after clear(): []

向量(vector)其他方法

方法内容描述
set()更改向量的元素
size()返回向量的大小
toArray()将向量转换为数组
toString()将向量转换为字符串
contains()

在向量中搜索指定的元素并返回一个布尔值

/* * 基于数组的向量实现 */ package dsa; public class Vector_Array implements Vector { private final int N = 1024;//数组的容量 private int n = 0;//向量的实际规模 private Object[] A;//对象数组 //构造函数 public Vector_Array() { A = new Object[N]; n = 0; } //返回向量中元素数目 public int getSize() { return n; } //判断向量是否为空 public boolean isEmpty() { return (0 == n) ? true : false; } //取秩为r的元素 public Object getAtRank(int r)//O(1) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); return A[r]; } //将秩为r的元素替换为obj public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; A[r] = obj; return bak; } //插入obj,作为秩为r的元素;返回该元素 public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r > n) throw new ExceptionBoundaryViolation("意外:秩越界"); if (n >= N) throw new ExceptionBoundaryViolation("意外:数组溢出"); for (int i=n; i>r; i--) A[i] = A[i-1];//后续元素顺次后移 A[r] = obj;//插入 n++;//更新当前规模 return obj; } //删除秩为r的元素 public Object removeAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; for (int i=r; i<n; i++) A[i] = A[i+1];//后续元素顺次前移 n--;//更新当前规模 return bak; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值