数组总结
数组是非常重要的数据结构,其中一维数组是最简单得的数组,其定义格式如下:
数据类型[] 数组名 = new 数据类型[数组大小]
例如:
Int [] age = new int[100] 定义了一个大小为100的整形数组,要注意的是,以这种方式声明的数组将使用java默认值来(例如,任何数值类型其默认值为0)初始化这个数组,我们可以不在new操作符中来指定数组的大小,而是提供一个初始值列表,例如,下面的语句将创建一个包含10,20,30的数组:
Int[] b = new int[]{10,20,30}
一旦定义了一个数组就可以使用下标来选择你要使用的元素,例如b[2]的值为30.
使用数组会经常出现两种异常,其中之一是由于试图在分配数组之前就使用数组变量。例如,声明这样一个数组,int [] b;但没有用new操作符为其开辟一片内存空间,这时b可以认为是一个指向空的指针变量,当我们试图访问b[2]这样的的元素时,就会抛出NullPointerException(空指针异常)异常。
另一个常见错误就是试图访问超出边界的数组,例如,有这样一个数组,int[] scores = newi int[4] 该数组的下标为从0到3,当我们使用太小的下标或太大下标时就会出错,程序将抛出ArrayIndexOutOfBoundsException(数组越界异常)。
数组的长度,每个数组都有一个名为length的实例变量,它表示数组的长度。注意length不是一个方法,所以语法只是 数组名.length; 而没有参数列表,顺便说一下,当数组变量是Null指针,你就不能查看他的长度,否则会抛出空指针异常。
数组的赋值,我们可以使用赋值语句来让两个数组变量指向同一个数组,例如:
Int [] scores;
Int [] exams;
Scores = new int[4];
Score[0] = 7;
Score [1] = 22;
Score [2] = 19;
Exams = scores;
在这些语句之后,scores指向了一个包含三个整数,7,22,19的数组,赋值语句exams = scores之后使得exams指向同一个数组。
下面的这些代码是我写的一些关于数组的常见应用的方法。
package test; public class IntArrayBag implements Cloneable{ private int[] data;//存储元素的数组 private int manyItems;//使用了多少数组 //无参数构造函数 public IntArrayBag(){ final int INITIAL_CAPACITY = 100; manyItems = 0; data = new int[INITIAL_CAPACITY]; } //含有参数的构造函数,又来实例变量 public IntArrayBag(int initialCapacity){ if(initialCapacity<0){ throw new IllegalArgumentException("initialCapacity is negativa:" + initialCapacity ); } manyItems = 0; data = new int[initialCapacity]; } //add方法 public void add(int element){ if(manyItems == data.length){ //将容量翻倍加1 ensureCapacity(manyItems*2+1); } data[manyItems] = element; manyItems++; } //addAll方法 public void addAll(IntArrayBag addend){ //如果addend为空,会抛出空指针异常 ensureCapacity(manyItems+addend.manyItems); System.arraycopy(addend, 0, data, manyItems, addend.manyItems); manyItems += addend.manyItems; } //复制方法,复制一个IntArrayBag对象 public Object clone(){ IntArrayBag answer = new IntArrayBag(); try { answer = (IntArrayBag) super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } answer.data = (int [])data.clone(); return answer; } // countOccurrences方法,统计特定元素出现的次数 public int countOccurence(int target){ int count = 0; for(int i = 0;i<manyItems;i++){ if(target == data[i]){ count++; } } return count; } // public void ensureCapacity(int minimumCapacity){ int biggerArray[]; if(data.length<minimumCapacity){ biggerArray = new int[minimumCapacity]; System.arraycopy(data, 0, biggerArray, 0, manyItems); data = biggerArray; } } //获取数组长度的方法 public int getCapacity(){ return data.length; } //移除数组中元素的方法 public boolean remove(int target){ int index;//target在data数组中的位置 index = 0; while((index<manyItems)&&(target != data[index])){ index++; } if(index == manyItems){ return false; }else { manyItems--; data[index] = data[manyItems]; return true; } } public int size(){ return manyItems; } public static IntArrayBag union(IntArrayBag b1,IntArrayBag b2){ IntArrayBag answer = new IntArrayBag(b1.getCapacity()+b2.getCapacity()); System.arraycopy(b1.data, 0, answer.data, 0, b1.manyItems); System.arraycopy(b2.data, 0, answer.data, b1.manyItems,b2.manyItems); answer.manyItems = b1.manyItems+b2.manyItems; return answer; } } package test; public class BagDemoTest { public static void main(String[] args) { // TODO Auto-generated method stub IntArrayBag age = new IntArrayBag(); age.add(1); age.add(2); age.add(3); age.add(2); System.out.println(age.size()); System.out.println(age.countOccurence(2)); age.remove(2); System.out.println(age.size()); IntArrayBag age2 =new IntArrayBag(); age2.add(3); age2.add(4); age2.add(5); age2.add(6); age2.add(3); age2.add(6); IntArrayBag total = IntArrayBag.union(age, age2); System.out.println(total.size()); } }