`

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数组练习题(带答案).doc

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

    java螺旋数组代码

    ### Java螺旋数组实现详解 #### 一、螺旋数组概述 螺旋数组是指按照螺旋形路径填充或遍历一个二维数组的方式。这种数据结构及其操作在实际编程应用中具有一定的实用价值,尤其是在解决某些特定问题时,如矩阵旋转...

    java关于数组(学习笔记)

    Java中的数组是一种重要的数据结构,它允许我们存储多个同类型的元素。数组被定义为一个容器,可以一次性容纳多个数据项,这些数据项在内存中是连续存放的,这使得访问和检索元素非常高效。在Java中,数组属于引用...

    java-对象数组转换为json

    在IT领域,特别是Java编程中,对象数组与JSON之间的转换是一项常见且重要的操作。下面将深入探讨如何在Java中实现对象数组向JSON的转换,并反过来将JSON字符串转换为Java对象数组,同时也会提及一些相关技术和代码...

    5-Java数组与方法

    在Java编程语言中,数组是一种特殊的数据结构,用于存储同类型元素的集合。它们提供了一种方式来组织和管理大量数据,使得我们可以高效地访问和操作这些数据。本章将深入探讨数组的基本概念、定义以及如何在实际编程...

    Java中数组的各种应用

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

    java 部分数组递增排序

    在`SortArray_03.java`这个文件中,很可能包含了实现部分数组递增排序的代码示例。通常,这可以通过以下步骤完成: 1. **定义范围**:确定需要排序的数组子段,这通常由两个索引值表示,即起始索引和结束索引(不...

    java数组结构图

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

    同步java之数组与队列

    本文将深入探讨这两个概念,并结合给定的`Array.java`文件,分析其可能包含的Java数组和队列的实现。 首先,数组是最基本的数据结构之一,它允许存储固定数量相同类型的数据。在Java中,数组通过`[]`符号定义,例如...

    hibernate array 数组映射

    在Java的持久化框架Hibernate中,数组映射是一种常见的数据模型转换方式,它允许我们将数据库中的数据以数组的形式存储在Java对象中。本篇将详细探讨`hibernate array 数组映射`的相关知识点,包括其原理、配置、...

    Java数组传递及可变参数操作实例详解

    Java数组传递及可变参数操作实例详解 Java 数组传递是指在方法之间传递数组对象的引用,而不是传递数组对象本身。这意味着,方法中对数组的修改将会影响原数组。在 Java 中,所有对象都是通过引用进行操作的,而...

    java泛型数组

    一个常用的替代方法是使用 `java.lang.reflect.Array` 类中的 `newInstance` 方法来创建泛型数组。这种方法能够绕过编译时的限制,实现泛型数组的创建。 ```java public class ArrayMaker<T> { private Class<T> ...

    json转对象数组与对象数组转json --Java

    ### JSON转对象数组与对象数组转JSON(Java) 在Java编程语言中,处理JSON数据时经常需要进行JSON字符串与Java对象之间的转换。特别是在涉及到数组或集合的场景下,这种转换显得尤为重要。本文将详细介绍如何使用...

    java数组排序

    在Java编程语言中,数组排序是一项基础且重要的任务。它涉及到不同的算法,这些算法通过比较和交换元素来达到数组元素的有序状态。本篇将详细探讨几种常见的排序算法及其在Java中的实现。 首先,让我们从最简单的...

    java 数组的合并

    在Java编程语言中,数组是一种基础且重要的数据结构,用于存储同类型的元素序列。当我们需要将两个或多个数组合并成一个大的数组时,就需要用到数组的合并技术。本篇文章将详细探讨Java中如何实现数组的合并。 首先...

    Java数组越界问题实例解析

    Java数组越界问题实例解析 在Java中,数组是一种非常重要的数据结构,它广泛应用于各种场景中。然而,在使用数组时,开发者最容易遇到的问题之一就是数组越界问题。数组越界问题是指在访问数组时,索引值超出了数组...

    java 数组递增排序

    在Java编程语言中,数组是一种数据结构,用于存储固定数量的相同类型的数据。数组的排序是编程中的基本操作,尤其在处理大量数据时至关重要。数组的递增排序,也称为升序排序,是指将数组中的元素按照从小到大的顺序...

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

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

    java中数组的用法

    array用法

Global site tag (gtag.js) - Google Analytics