`
wxl24life
  • 浏览: 293271 次
  • 性别: 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++的“陷阱”之一。








分享到:
评论

相关推荐

    Java中数组的各种应用

    在Java编程语言中,数组是一种基础且重要的数据结构,它允许程序员存储同类型的多个元素。本文将深入探讨Java中数组的各种应用,旨在帮助初学者理解并掌握数组的使用。 一、数组定义与初始化 在Java中,数组可以...

    java中数组的介绍

    java数组的介绍以及怎么用,用在什么地方

    Java中数组常用方法的总结

    我对Java中数组的方法做了一下总结,希望能帮到各位

    java中数组的用法

    array用法

    Java中数组的声明.doc

    ### Java中数组的声明 #### 一、一维数组的声明与创建 在Java中,数组是一种特殊的数据结构,用于存储相同类型的多个元素。数组在内存中是连续存储的,并且...希望本文能够帮助读者更好地掌握Java数组的相关知识。

    JAVA中数组的定义.doc

    Java中的数组是一种特殊的变量,它能够存储同一类型的多个值,这些值通过索引来访问。数组在Java中扮演着基础且重要的角色,它们是程序中数据结构的基础构建块。以下是关于Java中数组的详细说明: 一、一维数组的...

    java中数组的定义及使用方法详解.pdf

    Java 中数组的定义及使用方法详解 数组是 Java programming 语言中的一种基本数据结构,用于存储一组相关的变量。数组可以是一维数组、二维数组或多维数组,数组的每个元素的数据类型都是相同的。使用数组可以避免...

    Java中数组与集合的相互转换实现解析

    Java中数组与集合的相互转换实现解析 Java中数组和集合是两种不同的数据结构,数组是一种固定长度的数据结构,而集合是一种可变长度的数据结构。它们之间的转换是非常重要的,在实际开发中经常会遇到这种情况。...

    JAVA中数组的访问是如何进行的呢.txt

    1. **类型一致性**:数组中的所有元素必须具有相同的类型,无论是基本数据类型(如`int`, `double`)还是引用类型(如`String`, `Object`)。 2. **长度固定**:一旦数组被创建,其长度就不可更改。这意味着在创建...

    java中数组列表ArrayList的使用.doc

    这个方法把 ArrayList 的元素 Copy 到一个新的数组中。 在使用 ArrayList 时,需要注意线程同步的问题,如果使用非线程同步的实例,那么在多线程访问的时候,需要自己手动调用 lock 来保持线程同步。同时,...

    java中数组查找的常见算法

    java中数组查找的常见算法

    Java数组练习题(带答案).doc

    Java数组是Java编程语言中的基本数据结构之一,用于存储固定数量的同类型元素。了解和熟练掌握数组的使用是学习Java的重要环节。本篇练习题涵盖了数组的基本概念、操作和异常处理,下面是针对题目中涉及知识点的详细...

    Java中数组的定义与使用

    Java中数组的定义与使用

    Java中数组和对象数组的区别是什么.txt

    Java中数组和对象数组的区别是什么.txt

    Java中数组实例---一维数组.pdf

    在Java编程语言中,数组是一种特殊的数据结构,用于存储同一类型的数据集合。在这个文档中,我们专注于一维数组的实例,主要探讨了如何创建、初始化和输出一维数组的元素。以下是详细的知识点解析: 1. **数组声明*...

    Java中数组反转与多线程应用深度解析

    本文详细介绍了Java中数组反转的几种方法,并探讨了如何使用多线程技术来优化数组反转过程。通过合理地设计多线程任务和同步机制,可以显著提高数组反转的效率。这些技术的应用不仅限于数组反转,还可以扩展到其他...

    讲述Java中数组的基本使用以及简单排序_Array.zip

    讲述Java中数组的基本使用以及简单排序_Array

    java中数组

    主要介绍了java中数组的使用,适合理不清概念的读者使用,还有些关于栈、堆的使用。

    java数组结构图

    对数组的总结和分析,通过这个结构记住它,在开发的过程中使用

Global site tag (gtag.js) - Google Analytics