`
wxl24life
  • 浏览: 290833 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中的数组

 
阅读更多

下面主要以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]的值。

// JAVA
int a[100];
System.out.printf("%d",a[100]); // out of bound??

javac时编译器同样不会报错,java执行时抛出异常java.lang.ArrayIndexOutOfBoundException。

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








分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics