Java——数组、向量(Vector)详解

数组

一维数组初始化方式:
1. int []arr=new int[5]; 和int arr[] = new int[5];效果是一样的,不过开发中推荐前者。
2. int[]arr = new int[]{3,5,1,7};或者简化为int []arr = {3,5,1,7};

二维数组定义方式

//直接为每一维分配空间
int a[][] = new int[2][3];
//依次为每一维分配空间
int a[][] = new int[2][];
a[0] = new int[3];
a[1] = new int[3];

这一点在c和c++中是不同的。在c和c++中必须一次指明每一维的长度。

二维数组初始化方式

: (1)直接对每个元素进行赋值; (2)在定义数组的同时进行初始化。如:
int a[][]={{2,3},{1,5},{3,4}};
//a数组的行和列的个数可以通过length求得
a.length = 3;
a[i].length = 2;

向量(Vector)

Vector和数组非常类似,但是它可以存储多个对象,并且可以根据索引值来检索这些对象。数组和Vector的最大区别就是当空间用完以后,Vector会自动增长。同时Vector还提供了额外的方法来增加或者删除元素,而在数组中,必须手工完成。

Vector的三种构造方法

(1)public Vector();创建一个空的Vector;
(2)public Vector(int initialcapacity);创建一个Vector,其初始化大小为initial capacity.
(3)public Vector(int initialcapacity,int capacityIncrement);
创建一个Vector,其初始化大小为initial capacity,当Vector需要增长时,其增长速度由capacityIncrement决定。
注意:如果增长的速度不指定,那么Vector会将其空间增加一倍。当Vector很大的时候,这可能导致系统性能下降以及其他问题,建议设置具体的增长速度。

Vector中的几种查找函数

(1)public final int indexOf(Object obj)
从向量头开始搜索obj,返回所遇到的第一个obj对应的下标,若不存在此obj,返回-1.
(2)public final synchronized int indexOf(Object obj,int startindex) throws ArrayIndexOutOfBoundsException;
从startindex所表示的下标处开始搜索obj在Vector中第一次出现的位置,没有找到就返回-1.
(3)public final int lastindexOf(Object obj)
返回Vector中对象obj最后一次出现的位置,否则返回-1
(4)public final synchornized int lastIndexOf(Object obj,int index)throws ArrayIndexOutOfBoundsException;
从index所表示的下标处由尾至头逆向搜索obj.
(5)public final synchornized firstElement()
获取向量对象中的首个obj
(6)public final synchornized Object lastElement()
获取向量对象的最后一个obj
(7)public final boolean contains(Object ob);
查找一个对象是否在一个Vector中,只要出现一次ob指定的对象就返回true,否则返回false。

Vector中的增加和移除和改变大小操作

插入
(1)public final synchronized void adddElement(Object obj)

将obj插入向量的尾部。obj可以是任何类型的对象。对同一个向量对象,亦可以在其中插入不同类的对象。但插入的应是对象而不是数值,所以插入数值时要注意将数组转换成相应的对象。
例如:要插入整数1时,不要直接调用v1.addElement(1),正确的方法为:
Vector v1 = new Vector();
Integer integer1 = new Integer(1);
v1.addElement(integer1);

(2)public final synchronized void setElementAt(Object obj,int index)throws ArrayIndexOutOfBoundsException;

将index处的对象设置成obj,原来的对象将被覆盖。

(3)public final synchronized void insertElementAt(Object obj,int index)throws ArrayIndexOutOfBoundsException;
在index指定的位置插入obj,原来对象以及此后的对象依次往后顺延.如果该位置不存在则抛出一个ArrayIndexOutOfBoundsException异常。

移除
(1)public final synchronized boolean removeElement(Object obj)
移走一个特定的对象obj,如果对象在Vector中出现多次,只移走第一次出现的对象。成功返回true,否则返回false。
(2)public final synchronized void removeAllElement();
删除向量所有的对象
(3)public fianl synchronized void removeElementAt(int index) throws ArrayIndexOutOfBoundsException;
删除index所指的地方的对象 ,并移动其他对象来填充移走对象的空隙。如果试图从一个不存在的位置移走对象,则会抛出ArrayIndexOutOfBoundsException异常。
改变大小的操作
Vector有两种大小的概念,当前存储的元素的个数(size)和Vector的最大容量(capacity);

//capacity方法告诉用户Vector能容纳多少个对象。
public final int capacity();
//ensureCapacity方法可以增加Vector的大小
public final synchronized void ensureCapacity(int minimumCapacity);
/*告诉Vector至少能存储minimumCapacity个元素,如果Vector的当前容量比minumunCapacity的 小,将分配给Vector更多的空间;如果Vector的当前空间比minimumCapacity大,Vector也不会减少当前空间。*/

如果要减少Vector的容量,可以使用trimToSize方法:

public final synchronized void trimTosize();
//该方法将Vector的容量减少至当前存储的元素的个数。
public final int size();
//该方法告诉Vector中当前含有多少个对象:
public synchronized final void setSize(int newSize);
//该方法用于改变当前元素的个数,如果新尺寸小于原尺寸,则新尺寸以后的Vector中原有的元素将丢失;如果新尺寸大于原来的尺寸,,则新增加的元素的值会被置为null。
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
/* * 基于数组向量实现 */ 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; } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值