Java中的数组

来源:互联网 发布:抢票用什么软件好 编辑:程序博客网 时间:2024/06/05 00:33

下面主要以Java中一维数组为例,说明Java中数组的用法。

先看一段代码:

public class ArrayTest {private int[] arr;public ArrayTest(int[] a){int i; for(i = 0; i < a.length; i++){arr[i] = a[i];  //对成员数组初始化赋值}}public static void main(String[] args) {int[] a = {1,2,3,4}; //+++++++++++++数组初始化ArrayTest aTest = new ArrayTest(a);}}

***  int[ ] a = {1,2,3,4}; 这是Java提供的一种初始化数组的简化形式,后面会看到还有其它的方式。

对这段代码使用javac可以正常编译,当用java命令执行时会出现java.lang.NullPointerException。如果你对java很熟悉的话,很容易找出导致该异常的原因:arr数组变量只是声明没有被初始化为一个真正的数组,即此时不允许使用 arr[i] 对数组取值

如何修正?

方法一:

public class ArrayTest {private int[] arr;public ArrayTest(int[] a){/*int i; for(i = 0; i < a.length; i++){arr[i] = a[i];  //对成员数组初始化赋值}*/arr = a; // +++++++++++++数组赋值}}

方法二:

public class ArrayTest {private int[] arr = new int[20]; // +++++++++++++声明的同时初始化public ArrayTest(int[] a){int i; for(i = 0; i < a.length; i++){arr[i] = a[i];  //对成员数组初始化赋值}}        //...}

上面给出了另外两种初始化数组的方式。

  • 方法一,Java允许将一个数组变量拷贝给两个数组变量,此时,两个变量arr和a引用了同一个数组,使用其中任何一个数组变量都可对原始数组进行改变。
  • 方法二,这是Java中比较常用的数组初始化方式。声明变量的同时,使用new操作符创建数组并赋值给数组变量。new操作符必须指明数组的大小,所以此处我给出了一个常量值,这也许不是一种好的规范,为此,可以把初始化语句放到构造中:
public class ArrayTest {private int[] arr;public ArrayTest(int[] a){arr = new int[a.length]; //+++++++++++++使用了a的长度int i; for(i = 0; i < a.length; i++){arr[i] = a[i];  //对成员数组初始化赋值} //....}

++++++++++++++++++++++++++++++++++++++++++++++++

Java数组 vs C++数组(指针)

“Java数组与C++数组在堆栈上有很大不同,但基本上与分配在堆(heap)上的数组指针一样。也就是说,

int[] a = new int[100]; //java

不同于

int a[100]; //C++

而等同于

int* a = new int[100]; //C++

Java中的 [ ] 运算符被定义为检查数组边界,而且没有指针运算,即不能通过a加1得到数组的下一个元素。”    ----引自《Java核心技术 卷1:基础知识》p77

在此针对对 “Java中的 [ ] 运算符被定义为检查数组边界” 这句话写一下自己的理解,还是通过代码进行说明:

int* a = new int[100];cout<<a[100]; // out of bound??

使用g++编译、执行都不会提示任何错误,并且可以正常输出a[100]的值。

// JAVAint a[100];System.out.printf("%d",a[100]); // out of bound??
javac时编译器同样不会报错,java执行时抛出异常 java.lang.ArrayIndexOutOfBoundException。

这实际上是Java比C++“安全”的一个例子,也是C++的“陷阱”之一。