码迷,mamicode.com
首页 > 编程语言 > 详细

数组与数组列表

时间:2016-05-15 00:17:08      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

数组

  数组代表一系列对象或者基本数据类型,所有相同的类型都封装到一起——采用一个统一的标识符名称。简单来讲,数组就是一组相关数据的集合,是一连串的变量。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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!