`

Java Array 数组

阅读更多
数组是对象,是相同类型元素的集合。声明数组变量时的数组类型(即type[])中的type可以是任意数据类型,包括基本类型和引用类型。声明后数组的元素数据类型type便确定下来,该数组只能存放该类型的元素。数组创建后其长度就确定下来,且长度是固定、不可变的。

数组的length,是属性,String的length()是方法,为防止记混,可做如下推想:取长度的方式,无论是String(length())、集合类(size())、File(length())等,都是通过方法调用来取的。数组在java中是特殊的,因为在jdk中你连它的源码都看不到,据说实现自jvm底层。既然数组特殊,那人家的取长度方式也与众不同,就说得过去了。

数组变量的声明、数组对象的创建和数组元素的初始化(Declaring/Creating/Initializing)
数组变量的声明(常简称为数组的声明) Declaring:格式为 数组类型+数组名称
数组类型写做type[],其中type是该数组所含元素的数据类型。数组变量声明并没有实际创建数组,只是告诉编译器该数组变量会引用一个包含指定类型元素的数组对象。数组变量的声明中不可以包含任何的长度信息(即[]中为空)!原因是长度是Heap中的数组对象的属性,数组变量不存在长度这一说(只是个存于栈中的指向Heap中实际数组对象的引用)。声明后的数组变量是可以指向任何可达的Heap中同类型数组对象的,这些数组对象的长度都是固定的,但不一定相等。
数组对象的创建 Creating:
创建数组对象时,其长度必须指定(SIZE OF ARRAY MUST BE SPECIFIED WHEN WE CREATE IT)!其长度或者通过array initializer(eg.{1,2,4})或者通过dimension expression(eg.[int])确定。
两种方式创建数组对象(JLS10.3:http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.3):
1 array creation expression(即new的方式)(jls15.10:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.10)
格式:new type Dim ArrayInitializernew type DimExpr
引用
说明:两种格式的区别是:前一种创建数组对象,并对数组元素做了初始化;后一种只是创建。
Dim指dimension:维度,即[]..
ArrayInitializer指array initializer
DimExpr指dimension expressions:dimension里加可以转化为int类型的常量,如:[5]、[i](i为int),dimension expressions确定了数组对象的长度。

这里需要注意的是, 不存在格式为“new type DimExpr ArrayInitializer”的数组创建格式,原因是dimension expressions和array initializer都可以确定数组的长度,所以同时使用是不允许的。
int[] ia1 = new int[3];//OK
int[] ia2 = new int[]{1,2,3};//OK
int[] ia3 = new int[]; //compile error:创建数组时必须指定长度length
int[] ia4 = new int[5]{1,2,3,4,5}; //compile error:Cannot define dimension expressions when an array initializer is provided

2 array initializer (JLS10.6:http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6
格式简单举例(int[]为例):{1,2,3}
array initializer必须用在数组变量的声明中,或作为array creation expression的组成部分。使用array initializer的方式创建数组对象,其实包含了数据对象的创建和数组元素的初始化。数组对象的长度length等于array initializer的{}中的元素数量。
//正确:在数组变量声明中使用array initializer
int[] ia4 = {1,2,3,4,5};
		
//正确:array initializer作为array creation expression的组成部分
int[] ia5;
ia5 = new int[]{1,2,3,4,5};
		
//不正确:array initializer必须用在数组变量声明中
int[] ia6;
ia6 = {1,2,3,4,5}; //Compile error:Arrays constants can only be used in initializers error

数组元素的初始化 Initializing:
创建数组对象时只要使用了array initializer {} (数组变量的声明中使用也好,作为array creation expression的组成部分也罢),则数组对象的长度由array initializer确定,且数组元素的初始化也由array initializer做了
未使用array initializer的情况下,编译器使用默认值对数组元素进行初始化。具体默认值,视数组元素类型type,策略同java成员变量的默认初始化:
http://wuaner.iteye.com/admin/blogs/1666376


一个数组对象可以赋给一个Object引用
Object obj = new int[10];



参阅资料:

JLS Chapter 10. Arrays:http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html
Java Tutorials:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
引用
An array is a container object that holds a fixed number of values of a single type. The length of an array is established when the array is created. After creation, its length is fixed.
Like declarations for variables of other types, an array declaration has two components: the array's type and the array's name. An array's type is written as type[], where type is the data type of the contained elements; the square brackets are special symbols indicating that this variable holds an array. The size of the array is not part of its type (which is why the brackets are empty). An array's name can be anything you want, provided that it follows the rules and conventions as previously discussed in the naming section. As with variables of other types, the declaration does not actually create an array — it simply tells the compiler that this variable will hold an array of the specified type.





Java数组浅析
http://pengcqu.iteye.com/blog/492188
引用

数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访问它。数组提供了一种将有联系的信息分组的便利方法。
注意:如果你熟悉C/C++,请注意, Java数组的工作原理与它们不同。

1、数组不是集合,它只能保存同种类型的多个原始类型或者对象的引用。数组保存的仅仅是对象的引用,而不是对象本身。

2、数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

3、数组声明的两种形式:一、int[] arr; 二、int arr[]; 推荐使用前者,这符合Sun的命名规范,而且容易了解到关键点,这是一个int数组对象,而不是一个int原始类型。

4、在数组声明中包含数组长度永远是不合法的!如:int[5] arr; 。因为,声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。

5、在数组构造的时候必须指定长度,因为JVM要知道需要在堆上分配多少空间。反例:int[] arr = new int[];

6、多维数组的声明。int[][][] arr; 是三维int型数组。

7、一维数组的构造。形如:String[] sa = new String[5];
或者分成两句:String[] sa; sa = new String[5];

8、原始类型数组元素的默认值。对于原始类型数组,在用new构造完成而没有初始化时,JVM自动对其进行初始化。默认值:byte、short、 int、long--0 float--0.0f double--0.0 boolean--false char--'"u0000'。(无论该数组是成员变量还是局部变量)

9、对象类型数组中的引用被默认初始化为null。如:Car[] myCar = new Car[10]; 相当于从myCar[0]到myCar[9]都这样被自动初始化为myCar[i] = null;

10、对象类型的数组虽然被默认初始化了,但是并没有调用其构造函数。也就是说:Car[] myCar = new Car[10];只创建了一个myCar数组对象!并没有创建Car对象的任何实例!

11、多维数组的构造。float[][] ratings = new float[9][]; 第一维的长度必须给出,其余的可以不写,因为JVM需要知道赋给变量ratings的对象的长度

12、数组索引的范围。数组中各个元素的索引是从0开始的,到length-1。每个数组对象都有一个length属性,它保存了该数组对象的长度。(注意和String对象的length()方法区分开来,这两者没有统一起来是很遗憾的。)

13、Java有数组下标检查,当访问超出索引范围时,将产生ArrayIndexOutOfBoundsException运行时异常。注意,这种下标检查不是在编译时刻进行的,而是在运行时!也就是说int[] arr = new int[10]; arr[100] = 100; 这么明显的错误可以通过编译,但在运行时抛出!

Java的数组下标检查是需要额外开销的,但是出于安全的权衡还是值得的,因为很多语言在使用数组时是不安全的,可以任意访问自身内存块外的数组,编译运行都不会报错,产生难以预料的后果!


数组工具类java.util.Arrays的使用:
引用
JDK docs对java.util.Arrays的阐述:This class contains various methods for manipulating arrays (such as sorting and searching). This class also contains a static factory that allows arrays to be viewed as lists.
Arrays.toString举例:
/**
* 输出:
* [I@c17164
* [1, 4, 6, 7, 9]
*/
int[] ia = new int[]{1,4,6,7,9};
System.out.println(ia);
System.out.println(Arrays.toString(ia));
分享到:
评论

相关推荐

    Java array 数组用法源码集.rar

    Java array 数组用法源码集,比如测试数组、划分成绩等级、从方法中返回数组、二分查找法、求二维数组的长度、锯齿数组、处理二维数组等,相信通过这些基础的数组操作实例,会对你了解Java中的数组有很好的帮助作用...

    java关于数组(学习笔记)

    关于数组Array(学习笔记) 简介: 数组就是一个容器,可以同时容纳多个元素。意思是“一组数据”。 Java语言中的数组是一种引用数据类型。不属于基本数据类型,父类同样是Object类。因为是引用数据类型,所以数组的...

    Java中数组的各种应用

    java中数组的各种用法,工程中以代码的形式,例举java中数组的应用,对初学者有帮助,大鸟就不要看了

    java数组结构图

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

    java中数组的用法

    array用法

    java泛型数组

    泛型数组的创建

    java 数组(array).txt

    java 数组(array)

    Java数组与集合

    java数组与集合,主要内容包括笔记整理、小例子等等等,具体内容自个看

    java数组的学习、代源,源码

    public class Array1 { /** * 数组的使用: 1.告诉计算机声明一个数组并制定数组中装的数据类型 2.告诉计算机要开辟几个空间来装数据 3.给开辟的每一个空间赋值 4.使用 */ public static void main(String[] ...

    java基于数组的向量实现(算法源码)

    * 基于数组的向量实现 */ package dsa; public class Vector_Array implements Vector { private final int N = 1024;//数组的容量 private int n = 0;//向量的实际规模 private Object[] A;//对象数组 //...

    Java_Arrays:用Java处理数组-包括用户输入

    Java_Arrays 用Java处理数组-包括用户输入该文件创建包装在菜单系统中的以下数组: TVShows-创建一个新的阵列列表,该列表允许用户根据需要进行多次打印,添加,查看和删除。 MySize Array-包含一个double-用户可以...

    java数组遍历 删除remove(示例代码)

    java数组遍历 删除remove。需要的朋友可以过来参考下,希望对大家有所帮助

    Java基础入门自学课件 第04章 数组(共25页).ppt

    Java基础入门自学课件 第04章 数组(共25页).ppt

    java 数组转list

    本资源是java 数组转list实用代码

    java array

    本节内容包括 数组基本概念 数组的声明与创建 数组的特性 数组拷贝 命令行参数 工具类java.util.Arrays 多维数组

    java-c语法8---数组---马克-to-win java视频

    java语法 数组 马克-to-win java视频 array 的详细介绍

    java 数组中两个数的和 等于另一个数x

    有一个数组,有一个数x,是否存在数组中两个数之和等于x 两种方法实现,时耗对比 方法1: 先sort, head位置=0, tail位置=x的位置 如果 array[head]+ array[tail] > x; tail--; else head++; 方法2: 暴力破解,两...

    javascript Array 数组常用方法

    Array.join()方法将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串。可以自己指定分隔的符号,如果不指定,默认使用逗号 var arr = [1,2,3]; console.log(arr.join());//1,2,3 console.log(arr....

    Java程序设计基础:一维数组应用数组作为方法返回值类型.pptx

    数组作为方法返回值类型 学习目标 1 理解方法返回值类型是数组 引用类型的方法签名; 2 理解并学会数组作为方法返 回值类型的方法编写; 3 理解并熟知数组作为返回值 类型的方法调用。 方法的返回值类型 方法的...

    Java基础之数组拷贝

    在java中,我们可以将一个数组变量直接拷贝给另一个数组变量。但拷贝后,两个数组变量引用的是同一个数组。若改变其中一个数组中的内容,另一个数组也会同时改变。 (注:如果想打印数组内的所有值,可以使用Arrays....

Global site tag (gtag.js) - Google Analytics