8.数组
(1)概念
a、数组是多个相同类型数据的组合,实现对这些数据的统一管理
b、数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型
c、数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量
d、数组一旦初始化,其长度是不可变的
(2)数组的定义
数组的声明:
String[] names 或 String names[]
初始化:
a、静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
new String[]{"xue","chen"};
b、动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
int[] arr = new int[3];
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
(3)数组的默认值
a、对于byte,short,int,long 类型的数组而言,默认值为0
b、对于float double 类型的数组而言,默认值为0.0
c、对于String 类型的数组而言,默认值为null。(数据类型为引用数据类型)
d、对于char 类型的数组而言,默认值为空格
栗子:
int[] names = new int[3];
for (int i = 0; i < names.length; i++) {
System.out.println(names[i]); // 0 0 0
}
(4)一维数组的内存结构
图8-1
注:0x5435为地址名,创建此数组是在堆中开辟空间,初始化后的变量md是此数组地址的引用。
9.二维数组
(1)静态初始化
例子:int[][] num = new int[][]{{12},{20},{14}};
(2)动态初始化
a、int[][] scores = new int[5][6]; //初始化5个组,每个组有6个人
b、int[][] scores1 = new int[5][]; // 初始化5个组,动态设置每个组里边的人数
scores1[0] =new int[3];
scores1[1] =new int[3];
scores1[2] =new int[4];
scores1[3] =new int[3];
scores1[4] =new int[6];
scores1[5] =new int[8];
(3)二维数组值的设置的及长度
int[][] scores1 = new int[3][];
scores1[0] =new int[]{2,5,6};
//scores1[0][0] = 2;
//scores1[0][1] = 5;
//scores1[0][2] = 6;
a、二维数组的长度 scores1.length
b、二维数组元素的长度 scores1[0].length
(4)二维数组的循环
int[][] nums = new int[][]{{1,2,3},{4,5},{6}};
for (int m = 0; m < nums.length; m++) {
for (int n = 0; n < nums[m].length; n++) {
System.out.print(nums[m][n] + " ");
}
System.out.println();
}
10.数组中涉及的常见算法
(1)求数组元素的最大值、最小值、平均数、总和等
//求数组的最大值
int[] arr = new int[]{1, 5, -2, 8, -28, 47, 16};
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
System.out.println("最大值为:" + max);
//求数组的最小值
int[] arr = new int[]{1, 5, -2, 8, -28, 47, 16};
int min= arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
System.out.println("最小值为:" + min);
//求数组的和与平均值
int[] arr = new int[]{1, 5, -2, 8, -28, 47, 16};
int sum = 0;
for (int i = 0; i < arr.length ; i++) {
sum += arr[i];
}
int avg = sum / arr.length;
System.out.println("数组的和为:" + sum +" 平均值为:"+avg);
(2)数组的复制、反转
//数组的复制 错误示例(下面例子将arr1赋值给arr2,当arr2的值改变时,arr1的值也会发生改变)
int[] arr1,arr2;
arr1 = new int[]{1, 5, -2, 8, -28, 47, 16};
//遍历arr1
for (int i = 0; i < arr1.length ; i++) {
System.out.print(arr1[i] + "\t");
}
System.out.println();
arr2 = arr1; //将arr1赋值给arr2
for (int i = 0; i < arr2.length ; i++) {
arr2[i] = arr2[i]+1; //改变arr2的值
}
//再次遍历arr1
for (int i = 0; i < arr1.length ; i++) {
System.out.print(arr1[i] + "\t"); //2 6 -1 9 -27 48 17
}
原因:数组其实是空间地址的引用,例子中是将arr2复制了arr1的地址,arr2值的改变就会导致arr1值的改变,然而地址是没有变的。
//正确示例
int[] arr1,arr2;
arr1 = new int[]{1, 5, -2, 8, -28, 47, 16};
//遍历arr1
for (int i = 0; i < arr1.length ; i++) {
System.out.print(arr1[i] + "\t");
}
System.out.println();
arr2 = new int[arr1.length]; //创建新的数组,长度为arr1数组的长度
for (int i = 0; i < arr2.length ; i++) {
arr2[i] = arr1[i]+1; //将arr1的值赋给arr2,
}
//再次遍历arr1
for (int i = 0; i < arr1.length ; i++) {
System.out.print(arr1[i] + "\t");
}
System.out.println();
//数组的反转
int[] arr1 = new int[]{1, 5, -2, 8, -28, 47, 16};
or (int i = 0; i < arr1.length /2 ; i++) { //只需循环的次数
int temp = arr1[i];
arr1[i] = arr1[arr1.length - 1 -i]; //后面的值给前面的
arr1[arr1.length - 1 -i] = temp; //前面的值赋给后面的
}
for (int i = 0; i < arr1.length ; i++) {
System.out.print(arr1[i] + "\t"); // 16 47 -28 8 -2 5 1
}
(3)数组的排序
//冒泡排序
int[] arr = new int[]{1, 58, 6, 4, 25, -15, 3};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j + 1] < arr[j]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
具体原理参照 http://blog.csdn.net/jianyuerensheng/article/details/51254271
//使用Arrays类的方法
import java.util.Arrays;
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}