鱼C论坛

 找回密码
 立即注册
查看: 3429|回复: 1

[好文转载] Java数组(初学者必看)

[复制链接]
发表于 2017-1-9 15:45:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 零度非安全 于 2017-1-9 15:44 编辑
英文:刘志军
译文:javarevisited
链接:http://www.importnew.com/7127.html

数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同。但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构。尽管Java提供了很棒的集合API和集合类如:ArrayListHashMap,他们内部都是基于数组。如果你是来自于基于 c 或 c++ 背景的程序员,那么你会发现一些关于数组的行为和如何在 Java 工作中的异同。最值得注意的是 C 中的数组与 Java 中的数组的边界检查,c 编译器不检查如果程序访问无效的数组索引,而 java 如果程序尝试访问无效的数组索引的话 jvm 会抛出 ArrayIndexOutOfBoundException。在这篇文章中,我们看看Java中的数组,包括原生类型和对象类型的数组,下面就介绍些有关 Java 数组及属性的知识点。

Java数组101

(译注:101指介绍某件事,读者不需要任何预备知识)
1)数组在Java中是一个对象,数组实例同样是使用new操作符创建的。Array.length指定了数组长度,例如:
  1. int[] intArray = new int[10];
  2. System.out.println(intArray.length)

  3. Output: 10
复制代码
Array.length 表示数组的容量,只要数组创建了,每一个索引被初始化为默认值。

2)数组索引起始为0,负数索引在Java中是无效的,会抛出ArrayIndexOutOfBoundException ,如果你尝试用无效的索引访问数组,这个无效的索引可能是一个负索引,或者是大于等于数组长度的索引。

3)数组存储在 Java 堆的连续内存空间,所以如果你创建一个大的索引,你可以有足够的堆空间直到抛出OutofmemoryError,因为请求的内存大小在连续的内存空间不可用。

4)数组一个固定长度 的数据结构,一旦声明,你不能改变数组的长度。

5)不同类型的数组有不同的类型,例如下面例子,intArray.getClass()不同于floatArray.getClass()
  1. int[] intArray = new int[10];
  2. float[] floatArray = new float[10];
复制代码
6)你不能存储 double 值在int数组中,否则导致编译错误。
  1. int[] intArray = new int[10];
  2. intArray[5]=1.2; //compilation error
复制代码
如果尝试在运行时做这个操作,那么 Java 抛出ArrayStoreException

7)在 Java 数组中可以有不同方式的创建方式,这里就是创建数组的例子:
  1. int[] intArray;   //creating array without initializing or specifying size
  2. int intArray1[];  //another int[] reference variable can hold reference of an integer array
  3. int[] intArray2 = new int[10]; //creating array by specifying size
  4. int[] intArray3 = new int[]{1,2,3,4}; //creating and initializing array in same line.
复制代码
你既可以选择在创建数组的时候初始化数组,也可以以后通过 for 循环初始化,中括号既可以在变量的前面也可以在变量后面。

第一种方法是方便的创建多个数组如:
  1. int[] array1, array2
复制代码
这里的 array1 和 array2 是整型数组,而第二种方法你需要放两次括号如:
  1. int array1[], array2[]
复制代码
尽管在风格上没有很多不同,我读“int[] ”叫 int 数组,这种写法更容易被理解。

8)如果没有明确的初始化数组元素,那么数组就会用默认的类型值初始化,例如假若没有初始化整型数组,元素都将默认值为0,没有初始化d的boolean值是 false,对象数组是 null。

9)你可以通过使用[]操作符访问数组元素,因为数组索引起始于0,[0]返回第一个元素,[length-1] 返回最后一个元素,for 循环是一种迭代整个数组便捷方法。你可以使用 for 循环初始化整个数组、访问的每个索引或更新、获取数组元素。Java5 同样提供了加强的 for 循环,数组自己管理索引,防止ArrayIndexOutOfBoundException,这里是一个迭代的例子:

传统的方式:
  1. int[] numbers = new int[]{10, 20, 30, 40, 50};

  2. for (int i = 0; i < numbers.length; i++) {
  3.   System.out.println("element at index " + i + ": " + numbers[i]);
  4. }

  5. Output:
  6. element at index 0: 10
  7. element at index 1: 20
  8. element at index 2: 30
  9. element at index 3: 40
  10. element at index 4: 50
复制代码
加强的 for 循环
  1. for(int i: numbers){
  2.    System.out.println(i);
  3. }

  4. Output:
  5. 10
  6. 20
  7. 30
  8. 40
  9. 50
复制代码
正如你看到的,加强的for循环不需要检查数组索引,如果你想逐个地访问所有的元素这是一种很好的方法,但是同时因为你不能访问索引,你就不能修改数组元素。

10)Java 中数组可以轻易的转换成 ArrayList。ArrayList 一个基于索引的集合,它是作为数组的备选方案。ArrayList 的优点是可以改变容量大小,只需要创建个更大的数组然后拷贝内容到新数组,但你不能改变数组的大小。

11)Java API同样提供了一些便捷方法通过java.utils.Arrays类去操作数组,通过使用 Arrays 你可以排序数组,你可以做二分搜索。

12)java.lang.System类提供了实用方法拷贝元素到另一个数组。在拷贝内容从一个数组到另一个数组的时候System.arrayCopy非常强大和灵活。你可以拷贝整个或子数组,具体看你的需求。

System.arraycoy语法:
  1. public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
复制代码
如你所见,arraycopy 允许我们指定索引和长度,能很灵活给你拷贝子数组和存储到需要的位置或目标数组。这里是一个例子,拷贝前三个元素到目标数组:
  1. public static void main(String args[]) {
  2.         int[] source = new int[]{10, 20, 30, 40, 50};
  3.         int[] target = new int[5];

  4.         System.out.println("Before copying");
  5.         for(int i: target){
  6.             System.out.println(i);
  7.         }

  8.         System.arraycopy(source, 0, target, 0, 3);

  9.         System.out.println("after copying");
  10.         for(int i: target){
  11.             System.out.println(i);
  12.         }
  13. }
  14. Output:
  15. Before copying
  16. 0
  17. 0
  18. 0
  19. 0
  20. 0
  21. after copying
  22. 10
  23. 20
  24. 30
  25. 0
  26. 0
复制代码
你可以看到拷贝之前所有元素是0,之后前三个元素被替换了。

13)Java同样支持多维数组,在表示2D和3D的时候非常有用,像行和列或矩阵。多维数组也是一个数组的数组,这里是创建多维数组的例子:
  1. int[][] multiArray = new int[2][3];
复制代码
这是数组有2行3列,或者说长度是2的数组中,它的每个元素里保存的是长度为3的数组,这里是初始化多维数组的例子:
  1. int[][] multiArray = {{1,2,3},{10,20,30}};
  2. System.out.println(multiArray[0].length);
  3. System.out.println(multiArray[1].length);
复制代码
14)数组是一种非常快的数据结构,如果你已经知道元素的长度,那么就应该使用数组而非 ArrayList 等数据结构。

以上就是所有关于数组的话题,如你所见,数组是一种非常强大的数据结构。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-1 11:46:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-16 23:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表