第 5章
数组
– 一维数组、二维数组
– 高级数组观念一维数组对象
宣告一个数组并初始数组内容
指定的索引值不可超出数组范围
– 会发生 ArrayIndexOutOfBoundsException
length为数组对象的属性成员
int[] score = {90,85,55,94,77};
for(int i = 0; i < score.length; i++)
System.out.printf("score[%d] = %d\n",i,score[i]);
code\ch05\SimpleArray.java
一维数组对象
当您宣告一个数组时,其实就是在配置一个数组对象
一个完整的数组宣告方式如下
int[] arr = new int[10];
一维数组对象数据型态 初始值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char \u0000
boolean false
谜题 4
一维数组对象
int[] arr = new int[10];
System.out.print("arr初始值,");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
arr[i] = i;
}
System.out.print("\narr设定值,");
for(int i = 0; i < arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
code\ch05\ArrayDemo.java
一维数组对象
在使用 new新增数组时一并指定初始值
int[] score = new int[] {90,85,55,94,77};
for(int i = 0; i < score.length; i++)
System.out.printf("score[%d] = %d\n",i,score[i]);
code\ch05\SimpleArray2.java
一维数组对象
int length = scanner.nextInt();
float[] score = new float[length]; //动态配置长度
for(int i = 0; i < score.length; i++) {
System.out.print("输入分数,");
float input = scanner.nextFloat();
score[i] = input;
}
可以使用动态的方式来宣告数组长度,而不用在程序中事先决定数组大小
code\ch05\AverageInput.java
二维数组对象
二维数组使用「名称」与「两个索引」来指定存取数组中的元素
以对象的方式来配置一个二维数组对象
int[][] arr = {{1,2,3},
{4,5,6}};
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[0].length; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
}
int[][] arr = new int[2][3];
code\ch05\TwoDimArray.
java
二维数组对象
以对象的方式来配置一个二维数组对象
int[][] arr = new int[2][3];
二维数组对象
int[][] arr = {{1,2,3},
{4,5,6}};
int[] foo = arr[0]; //将 arr[0]所参考的数组对象指定给 foo
for(int i = 0; i < foo.length; i++) {
System.out.print(foo[i] + " ");
}
System.out.println();
foo = arr[1]; //将 arr[1]所参考的数组对象指定给 foo
for(int i = 0; i < foo.length; i++) {
System.out.print(foo[i] + " ");
}
System.out.println();
code\ch05\TwoDimArray2.java
二维数组对象
使用 new配置二维数组一并指定初值
宣告三维以上的数组
int[][] arr = new int[][] {{1,2,3},
{4,5,6}};
int[][][] arr = {
{{1,2,3},{4,5,6}},
{{7,8,9},{10,11,12}}
};
int[][][] arr = new int[2][2][3];
不规则数组
int arr[][];
arr = new int[2][];
arr[0] = new int[3]; // arr[0]参考至长度为 3的一维数组
arr[1] = new int[5]; // arr[1]参考至长度为 5的一维数组
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++)
arr[i][j] = j + 1;
}
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
} code\ch05\TwoDimArray3.java
高级的数组操作
一维数组的引用名称之声明
将同一个对象指定给两个引用名称
int[] arr = null;
int[] arr1 = {1,2,3,4,5};
int[] tmp1 = arr1;
int[] tmp2 = arr1;
System.out.print("透过 tmp1取出数组值,");
for(int i = 0; i < tmp1.length; i++)
System.out.print(tmp1[i] + " ");
code\ch05\AdvancedArray.java
高级的数组操作
将同一个对象指定给两个引用名称
System.out.print("\n透过 tmp2取出数组值,");
for(int i = 0; i < tmp2.length; i++)
System.out.print(tmp2[i] + " ");
tmp1[2] = 9;
System.out.print("\n\n透过 tmp1取出数组值,");
for(int i = 0; i < tmp1.length; i++)
System.out.print(tmp1[i] + " ");
System.out.print("\n透过 tmp2取出数组值,");
for(int i = 0; i < tmp2.length; i++)
System.out.print(tmp2[i] + " ");
System.out.println();
高级的数组操作
将同一个对象指定给两个引用名称
int[] arr1 = {1,2,3,4,5};
int[] tmp1 = arr1;
int[] tmp2 = arr1;
高级的数组操作
int[]arr之后,arr是一维数组的引用名称,
可以引用任何长度的一维数组对象
int[] arr1 = {1,2,3,4,5};
int[] arr2 = {5,6,7};
int[] tmp = arr1;
System.out.print("使用 tmp取出 arr1中的元素,");
for(int i = 0; i < tmp.length; i++)
System.out.print(tmp[i] + " ");
tmp = arr2;
System.out.print("\n使用 tmp取出 arr2中的元素,");
for(int i = 0; i < tmp.length; i++)
System.out.print(tmp[i] + " ");
System.out.println();
code\ch05\AdvancedArray2.java
数组复制
使用循环作数组复制
int[] arr1 = {1,2,3,4,5};
int[] arr2 = new int[5];
for(int i = 0; i < arr1.length; i++)
arr2[i] = arr1[i];
for(int i = 0; i < arr2.length; i++)
System.out.print(arr2[i] + " ");
System.out.println();
code\ch05\ArrayCopy.java
数组复制
使用 System类别所提供的 arraycopy()方法
在 JDK6中,也为 Arrays类别新增了数组复制的 copyOf()方法
int[] arr1 = {1,2,3,4,5};
int[] arr2 = new int[5];
System.arraycopy(arr1,0,arr2,0,arr1.length);
for(int i = 0; i < arr2.length; i++)
System.out.print(arr2[i] + " ");
System.out.println();
code\ch05\ArrayCopy2.java
Arrays类名 称 说 明
sort() 帮助您对指定的数组排序,所使用的是快速排序法
binarySearch() 让您对已排序的数组进行二元搜寻,如果找到指定的值就传回该值所在的索引,否则就传回负值
fill() 当您配置一个数组之后,会依数据型态来给定默认值,例如整数数组就初始为 0,您可以使用 Arrays.fill()方法来将所有的元素设定为指定的值
equals() 比较两个数组中的元素值是否全部相等,如果是将传回
true,否则传回 false
code\ch05\ArraysMethodDemo.java
code\ch05\ArraysMethodDemo2.java
数组比较
不可用 '=='比较两个数组的元素值是否相等
int[] arr1 = {1,2,3,4,5};
int[] arr2 = {1,2,3,4,5};
int[] tmp = arr1;
System.out.println(arr1 == tmp);
System.out.println(arr2 == tmp);
code\ch05\TestArrayValue.java
数组比较
deepEquals()与 deepToString()
int[][] arr1 = {{1,2,3},
{4,5,6},
{7,8,9}};
int[][] arr2 = {{1,2,3},
{4,5,6},
{7,8,9}};
int[][] arr3 = {{0,1,3},
{4,6,4},
{7,8,9}};
System.out.println("arr1内容等于 arr2? " +
Arrays.deepEquals(arr1,arr2));
System.out.println("arr1内容等于 arr3? " +
Arrays.deepEquals(arr1,arr3));
System.out.println("arr1 deepToString()\n\t" +
Arrays.deepToString(arr1));
foreach与数组
加强的 for循环( Enhanced forLoop)
J2SE 5.0之前
在 J2SE5.0之后
for(type element,array) {
System.out.println(element)....
}
int[] arr = {1,2,3,4,5};
for(int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
int[] arr = {1,2,3,4,5};
for(int element,arr)
System.out.println(element);
foreach与数组
如果是对象的话
二维数组
String[] names = {"caterpillar","momor","bush"};
for(String name,names)
System.out.println(name);
int[][] arr = {{1,2,3},
{4,5,6},
{7,8,9}};
for(int[] row,arr) {
for(int element,row) {
System.out.println(element);
}
}
对象数组
以下产生几个对象?
以下的声明产生几个对象?
以下产生几个对象?
int[] arr = new int[3];
int[][] arr = new int[2][3];
Integer[] arr = new Integer[3];
对象数组
以下的声明产生几个对象?
Integer[][] arr = new Integer[2][3];
数组
– 一维数组、二维数组
– 高级数组观念一维数组对象
宣告一个数组并初始数组内容
指定的索引值不可超出数组范围
– 会发生 ArrayIndexOutOfBoundsException
length为数组对象的属性成员
int[] score = {90,85,55,94,77};
for(int i = 0; i < score.length; i++)
System.out.printf("score[%d] = %d\n",i,score[i]);
code\ch05\SimpleArray.java
一维数组对象
当您宣告一个数组时,其实就是在配置一个数组对象
一个完整的数组宣告方式如下
int[] arr = new int[10];
一维数组对象数据型态 初始值
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char \u0000
boolean false
谜题 4
一维数组对象
int[] arr = new int[10];
System.out.print("arr初始值,");
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
arr[i] = i;
}
System.out.print("\narr设定值,");
for(int i = 0; i < arr.length; i++)
System.out.print(arr[i] + " ");
System.out.println();
code\ch05\ArrayDemo.java
一维数组对象
在使用 new新增数组时一并指定初始值
int[] score = new int[] {90,85,55,94,77};
for(int i = 0; i < score.length; i++)
System.out.printf("score[%d] = %d\n",i,score[i]);
code\ch05\SimpleArray2.java
一维数组对象
int length = scanner.nextInt();
float[] score = new float[length]; //动态配置长度
for(int i = 0; i < score.length; i++) {
System.out.print("输入分数,");
float input = scanner.nextFloat();
score[i] = input;
}
可以使用动态的方式来宣告数组长度,而不用在程序中事先决定数组大小
code\ch05\AverageInput.java
二维数组对象
二维数组使用「名称」与「两个索引」来指定存取数组中的元素
以对象的方式来配置一个二维数组对象
int[][] arr = {{1,2,3},
{4,5,6}};
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[0].length; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
}
int[][] arr = new int[2][3];
code\ch05\TwoDimArray.
java
二维数组对象
以对象的方式来配置一个二维数组对象
int[][] arr = new int[2][3];
二维数组对象
int[][] arr = {{1,2,3},
{4,5,6}};
int[] foo = arr[0]; //将 arr[0]所参考的数组对象指定给 foo
for(int i = 0; i < foo.length; i++) {
System.out.print(foo[i] + " ");
}
System.out.println();
foo = arr[1]; //将 arr[1]所参考的数组对象指定给 foo
for(int i = 0; i < foo.length; i++) {
System.out.print(foo[i] + " ");
}
System.out.println();
code\ch05\TwoDimArray2.java
二维数组对象
使用 new配置二维数组一并指定初值
宣告三维以上的数组
int[][] arr = new int[][] {{1,2,3},
{4,5,6}};
int[][][] arr = {
{{1,2,3},{4,5,6}},
{{7,8,9},{10,11,12}}
};
int[][][] arr = new int[2][2][3];
不规则数组
int arr[][];
arr = new int[2][];
arr[0] = new int[3]; // arr[0]参考至长度为 3的一维数组
arr[1] = new int[5]; // arr[1]参考至长度为 5的一维数组
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++)
arr[i][j] = j + 1;
}
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
} code\ch05\TwoDimArray3.java
高级的数组操作
一维数组的引用名称之声明
将同一个对象指定给两个引用名称
int[] arr = null;
int[] arr1 = {1,2,3,4,5};
int[] tmp1 = arr1;
int[] tmp2 = arr1;
System.out.print("透过 tmp1取出数组值,");
for(int i = 0; i < tmp1.length; i++)
System.out.print(tmp1[i] + " ");
code\ch05\AdvancedArray.java
高级的数组操作
将同一个对象指定给两个引用名称
System.out.print("\n透过 tmp2取出数组值,");
for(int i = 0; i < tmp2.length; i++)
System.out.print(tmp2[i] + " ");
tmp1[2] = 9;
System.out.print("\n\n透过 tmp1取出数组值,");
for(int i = 0; i < tmp1.length; i++)
System.out.print(tmp1[i] + " ");
System.out.print("\n透过 tmp2取出数组值,");
for(int i = 0; i < tmp2.length; i++)
System.out.print(tmp2[i] + " ");
System.out.println();
高级的数组操作
将同一个对象指定给两个引用名称
int[] arr1 = {1,2,3,4,5};
int[] tmp1 = arr1;
int[] tmp2 = arr1;
高级的数组操作
int[]arr之后,arr是一维数组的引用名称,
可以引用任何长度的一维数组对象
int[] arr1 = {1,2,3,4,5};
int[] arr2 = {5,6,7};
int[] tmp = arr1;
System.out.print("使用 tmp取出 arr1中的元素,");
for(int i = 0; i < tmp.length; i++)
System.out.print(tmp[i] + " ");
tmp = arr2;
System.out.print("\n使用 tmp取出 arr2中的元素,");
for(int i = 0; i < tmp.length; i++)
System.out.print(tmp[i] + " ");
System.out.println();
code\ch05\AdvancedArray2.java
数组复制
使用循环作数组复制
int[] arr1 = {1,2,3,4,5};
int[] arr2 = new int[5];
for(int i = 0; i < arr1.length; i++)
arr2[i] = arr1[i];
for(int i = 0; i < arr2.length; i++)
System.out.print(arr2[i] + " ");
System.out.println();
code\ch05\ArrayCopy.java
数组复制
使用 System类别所提供的 arraycopy()方法
在 JDK6中,也为 Arrays类别新增了数组复制的 copyOf()方法
int[] arr1 = {1,2,3,4,5};
int[] arr2 = new int[5];
System.arraycopy(arr1,0,arr2,0,arr1.length);
for(int i = 0; i < arr2.length; i++)
System.out.print(arr2[i] + " ");
System.out.println();
code\ch05\ArrayCopy2.java
Arrays类名 称 说 明
sort() 帮助您对指定的数组排序,所使用的是快速排序法
binarySearch() 让您对已排序的数组进行二元搜寻,如果找到指定的值就传回该值所在的索引,否则就传回负值
fill() 当您配置一个数组之后,会依数据型态来给定默认值,例如整数数组就初始为 0,您可以使用 Arrays.fill()方法来将所有的元素设定为指定的值
equals() 比较两个数组中的元素值是否全部相等,如果是将传回
true,否则传回 false
code\ch05\ArraysMethodDemo.java
code\ch05\ArraysMethodDemo2.java
数组比较
不可用 '=='比较两个数组的元素值是否相等
int[] arr1 = {1,2,3,4,5};
int[] arr2 = {1,2,3,4,5};
int[] tmp = arr1;
System.out.println(arr1 == tmp);
System.out.println(arr2 == tmp);
code\ch05\TestArrayValue.java
数组比较
deepEquals()与 deepToString()
int[][] arr1 = {{1,2,3},
{4,5,6},
{7,8,9}};
int[][] arr2 = {{1,2,3},
{4,5,6},
{7,8,9}};
int[][] arr3 = {{0,1,3},
{4,6,4},
{7,8,9}};
System.out.println("arr1内容等于 arr2? " +
Arrays.deepEquals(arr1,arr2));
System.out.println("arr1内容等于 arr3? " +
Arrays.deepEquals(arr1,arr3));
System.out.println("arr1 deepToString()\n\t" +
Arrays.deepToString(arr1));
foreach与数组
加强的 for循环( Enhanced forLoop)
J2SE 5.0之前
在 J2SE5.0之后
for(type element,array) {
System.out.println(element)....
}
int[] arr = {1,2,3,4,5};
for(int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
int[] arr = {1,2,3,4,5};
for(int element,arr)
System.out.println(element);
foreach与数组
如果是对象的话
二维数组
String[] names = {"caterpillar","momor","bush"};
for(String name,names)
System.out.println(name);
int[][] arr = {{1,2,3},
{4,5,6},
{7,8,9}};
for(int[] row,arr) {
for(int element,row) {
System.out.println(element);
}
}
对象数组
以下产生几个对象?
以下的声明产生几个对象?
以下产生几个对象?
int[] arr = new int[3];
int[][] arr = new int[2][3];
Integer[] arr = new Integer[3];
对象数组
以下的声明产生几个对象?
Integer[][] arr = new Integer[2][3];