标签:
数组
数组代表一系列对象或者基本数据类型,所有相同的类型都封装到一起——采用一个统一的标识符名称。简单来讲,数组就是一组相关数据的集合,是一连串的变量。Java中数组的定义和使用时通过方括号索引运算符进行的({}),一般来说,有两种定义数组的方法,只需在类型名或标识符后跟一对方括号即可。
int[] a1;
int a1[];
两种表示方法是完全一样的。此时只是声明了指向数组的一个对象,并未对其分配任何空间,为了创建数组相应的存储空间,就必须要写一个初始化表达式。如:
int b = {1, 2, 3, 4};
这是一种特殊的初始化表达式,必需在创建数组的地方出现,这种情况下会进行存储空间的分配(等价于使用new)。
1 public class demo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int a[] = new int[3]; 9 for(int i = 0; i<a.length;i++){ 10 System.out.println("a[" + i + "] = "+a[i]); 11 } 12 } 13 14 }
另一种分配存储空间的方式是指出数组的长度,这样做可以不必为数组的每一项赋值,因为此数组实际上已经指定了其内存空间大小,也就是不会报空指针异常,但必须注意,它会有默认值。
a[0] = 0 a[1] = 0 a[2] = 0
那么问题来了,为什么需要定义一个没有数组的数组标识符呢。
int a2[];
实际上在Java中,可以将一个数组分配给另一个,所以能引用下述语句:
a2 = a1;
这样会造成一些有趣的现象,让我们做一个测试:
1 public class demo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int a[] = new int[3]; // 实例化数组a 9 // 为数组a赋值 10 for (int i = 0; i < a.length; i++) { 11 a[i] = i; 12 System.out.println("a[" + i + "] = " + a[i]); 13 } 14 15 System.out.println("********我是分隔符**********"); 16 17 int b[]; // 声明数组b 18 b = a; // 将数组a分配给数组b 19 // 输出数组b 20 for (int i = 0; i < b.length; i++) { 21 22 System.out.println("b[" + i + "] = " + b[i]); 23 } 24 System.out.println("********我是分隔符**********"); 25 b[2] = 10; // 修改数组b中b[2]的值 26 System.out.println("b[2] = " + b[2]); // 输出b[2] 27 System.out.println("a[2] = " + a[2]); // 输出a[2] 28 29 } 30 31 }
运行结果:
a[0] = 0 a[1] = 1 a[2] = 2 ********我是分隔符********** b[0] = 0 b[1] = 1 b[2] = 2 ********我是分隔符********** b[2] = 10 a[2] = 10
可以看到,在将a分配给b后,实际上也将实际存储空间内的数组使用权交给了b,所以修改了数组b中b[2]的值同时也会修改数组a中a[2]的值。
数组列表
实际上,无论是静态初始化一个数组还是动态初始化一个数组,在创建的时候就会确定好其大小(或是说长度)。那么如果想动态的添加一个数组中的项,应该如何做呢。对于这个问题,我们就需要数组列表来帮我们解决了。
那么什么是数组列表。
实际上,无论是数组还是数组列表本质上都是一个类,那么定义一个类,就需要定义这个类的属性和方法。那么一个数组列表会有哪些属性方法呢。
1.属性
基于数组列表的功能诉求,我们需要两个属性,一个是大小,另一个是数组。因此我们需 要定义一个变脸来记录元素的个数,还要定义一个数组来存储元素。所以属性就包括:
private int count; // 保存数组的长度 private int data[]; //创建一个数组
2.方法
完成了以上,我们便需要一些方法,对于数组列表,一些基本的方法包括存放元素、获取元素个数、取出元素、修改元素和删除元素。
以创建一个int类型的数组列表为例完整代码如下:
1 /** 2 * 3 * @author 陆放为 4 * 接口类 5 */ 6 public interface C { 7 8 9 /** 10 * 添加一个元素 11 */ 12 public void store(int element); 13 14 /** 15 * 获取数组长度 16 */ 17 public int getCount(); 18 19 /** 20 * 修改元素 21 */ 22 public void upData(int index, int newElement); 23 24 /** 25 * 取出元素 26 */ 27 public int getElement(int index); 28 29 /** 30 * 删除元素 31 */ 32 public void delete(int index); 33 }
1 public class D implements C { 2 3 private int count; // 保存数组的长度 4 private int data[]; //创建一个数组 5 6 @Override 7 public void store(int element) { 8 // TODO Auto-generated method stub 9 10 // 创建一个临时数组 11 int[] temp = new int[count + 1]; 12 13 // 将原数组内容复制到临时数组中 14 for (int i = 0; i < count; i++) { 15 16 temp[i] = data[i]; 17 18 } 19 20 data = temp; 21 22 //添加新的元素 23 data[count] = element; 24 25 //让数组长度加一 26 count++; 27 28 } 29 30 @Override 31 public int getCount() { 32 // TODO Auto-generated method stub 33 return count; 34 } 35 36 @Override 37 public void upData(int index, int newElement) { 38 // TODO Auto-generated method stub 39 data[index] = newElement; 40 41 } 42 43 @Override 44 public int getElement(int index) { 45 // TODO Auto-generated method stub 46 return data[index]; 47 } 48 49 @Override 50 public void delete(int index) { 51 // TODO Auto-generated method stub 52 53 //创建一个临时数组 54 int temp[] = new int[count-1]; 55 56 //将删除项前的元素复制到临时数组中 57 for(int i = 0; i < index-1; i++){ 58 temp[i] = data[i]; 59 } 60 61 //将删除项后的元素复制到临时数组中 62 for(int i = index-1; i < count-1; i++){ 63 temp[i] = data[i+1]; 64 } 65 66 data = temp; 67 68 //数组长度减一 69 count--; 70 } 71 72 }
测试结果如下:
1 public class Demo { 2 public static void main(String[] args) { 3 System.out.println("实例化一个数组列表d"); 4 D d = new D(); 5 System.out.println("*******添加项************"); 6 for (int i = 0; i < 5; i++) { 7 d.store(i); 8 System.out.println("d的第" + i + "项为:" + d.getElement(i)); 9 } 10 System.out.println("数组长度为" + d.getCount()); 11 System.out.println("**********删除项***************"); 12 d.delete(2); 13 for (int i = 0; i < d.getCount(); i++) { 14 System.out.println("d的第" + i + "项为:" + d.getElement(i)); 15 } 16 System.out.println("数组长度为" + d.getCount()); 17 System.out.println("***********更新项*************"); 18 d.upData(3, 15); 19 for (int i = 0; i < d.getCount(); i++) { 20 System.out.println("d的第" + i + "项为:" + d.getElement(i)); 21 } 22 System.out.println("数组长度为" + d.getCount()); 23 } 24 25 }
输出结果:
实例化一个数组列表d *******添加项************ d的第0项为:0 d的第1项为:1 d的第2项为:2 d的第3项为:3 d的第4项为:4 数组长度为5 **********删除项*************** d的第0项为:0 d的第1项为:2 d的第2项为:3 d的第3项为:4 数组长度为4 ***********更新项************* d的第0项为:0 d的第1项为:2 d的第2项为:3 d的第3项为:15 数组长度为4
多维数组
关于多维数组,以二维数组为例,类似于一个二维矩阵,但实际上是也是如同一维数组一样进行链式存储,逻辑理解上可参考for循环的多重嵌套。
标签:
原文地址:http://www.cnblogs.com/aladdin-light/p/5494035.html