1、数组的定义
数组是相同类型数据的有序集合;
数组描述的是若干个相同类型的数据按照一定的先后次序排列组合而成,其中每一个数据称为数组的元素,可以通过下标进行访问。
Java中创建数组的方法如下:
- 首先声明一个数组变量:dateType[] arrayRefVar; 如声明一个int类型的数组就可以使用int[] arrayName;
- 使用new操作符创建数组:dateType[] arrayRefVar = new dateType[arraySize] ;
数组的元素是通过索引进行访问的,数组索引从0开始。
对于一个位置的数组,可以通过arrayName.length获得它的数组长度。
2、数组的声明创建
在Java内部一个数组的创建过程步骤如下:
- 声明步骤Java会在栈中声明一个数组,如图中的arrayName
- 使用new操作符创建数组之后Java会在堆中获得一个内存用于存放数组,如图是创建了一个大小为4的int类型数组,数组创建的时候没一个元素都会有个默认初始值,int类型的数组初始值时0,String类型的就是null
数组被创建之后我们通常会给他进行初始化,Java中有三种初始化的方法:
- 静态初始化:int[] array = {1,2,3}; 即在声明创建的同时直接初始化
- 动态初始化:int[] array = new int[2]; array[0] = 1; array[1] = 2
- 数组的默认初始化,即数组创建时每一个元素就会有一个初始化值
静态初始化和动态初始化代码如下:
public class ArrayDemo02 {
public static void main(String[] args) {
//静态初始化:创建和赋值直接完成
int[] a = {1,2,4,5,6,4,7};
System.out.println(a[0]); //1
//动态初始化:包含默认初始化,即未自定义元素值时其已经有一个默认值了
int[] b = new int[10];
b[0] = 10;
System.out.println(b[0]);
}
}
数组的四个基本特点:
- 长度是确定的。一旦创建,其长度大小不可更改;
- 内部的元素必须是同一种类型,不允许出现混合类型;
- 数组中的元素可以是任何一种数据类型,包括基本类型和引用类型;
- 数组变量属于引用类型,可以将数组看成一个对象,数组中的元素就相当于对象的的成员变量。数组本身就是一个对象,Java的对象是在堆中,因此无论数组保持原始类型还是其他对象类型,数组对象本身是在堆中的,
3、数组边界
数组的合法下标区间是[0,length-1],如果越界就会报错:ArrayIndexOutOfBoundsException
4、数组的使用
有四种使用方法:
- 普通的for循环
- for-each循环
- 数组作为方法入参
- 数组作为返回值
对应的代码如下:
public class ArrayDemo03 {
public static void main(String[] args) {
int[] arrays = {1,2,3,4,5};
//打印全部的数组元素(普通的for循环)
for (int i = 0; i < arrays.length; i++) {
System.out.println(arrays[i]);
}
System.out.println("==========");
//计算所有元素的和
int sum = 0;
for (int i = 0; i < arrays.length; i++) {
sum += arrays[i];
}
System.out.println(sum);
//查找最大元素(普通的for循环)
int max = arrays[0];
for (int i = 1; i < arrays.length; i++) {
if (arrays[i] > max){
max = arrays[i];
}
}
System.out.println("============");
System.out.println(max);
}
}
public class ArrayDemo04 {
public static void main(String[] args) {
int[] arrays = {1,2,3,4,5};
// JDK1.5,没有下标(for-each循环)
for (int array : arrays) {
System.out.println(array);
}
int[] reverse = reverse(arrays);
printArray(reverse);
}
//打印数组元素(数组作为方法入参)
public static void printArray(int[] arrays) {
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i] + " ");
}
}
//反转数组(数组作为返回值)
public static int[] reverse(int[] arrays){
int[] result = new int[arrays.length];
//反转操作
for (int i = 0,j = arrays.length-1; i < arrays.length; i++,j--) {
result[j] = arrays[i];
}
return result;
}
}
5、多维数组
定义:多维数组可以看成数组的数组,比如二位数组就是一个特殊的一维数组,只不过其中的每一个元素都是一个一维数组。
int[][] a = new int[2][5];
调用方式同一维数组类似
public class ArrayDemo05 {
public static void main(String[] args) {
//[4][2]
/*
1,2 arrays[0]
2,3 arrays[1]
3,4 arrays[2]
4,5 arrays[3]
*/
int[][] arrays = {{1,2},{2,3},{3,4},{4,5}};
for (int i = 0; i < arrays.length; i++){
for (int j = 0; j < arrays[i].length; j++){
System.out.print(arrays[i][j] + " ");
}
System.out.println();
}
}
//打印数组元素
public static void printArray(int[] arrays) {
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i] + " ");
}
}
}
上述代码中如果使用printArray方法可以少一个for循环,即在第一个for循环中调用printArray方法打印数组。
在数组这部分有一个binarySearch,为二分查找法:
- 只能对排好序的数组进行操作,当查找的数据在数组中时就会返回元素的索引值,当查询的数据不在数组中但是在数组的数据范围内则会返回“-该数据的插入顺序”
- 如果查找的数据不在数组中且大于最大元素,则返回“-array.length+1"
- 如果查找的数据不在数组中且小于最小元素,则返回-1
import java.util.Arrays;
public class ArrayDemo06 {
public static void main(String[] args) {
int[] a = {1,5,5,4,7,6,7,9,51,64,41};
int[] b = new int[10];
//填充数组
//Arrays.fill(b,1,5,10);
//System.out.println(a); //[I@7ef20235
//对数组进行排序:升序
Arrays.sort(a);
//打印数组元素Array.toString
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
System.out.println(Arrays.binarySearch(a,8));
填充数组:Arrays.fill(b,1,5,10); 对数组b进行填充,下标1到第5个填充10,如果不设定范围则将数组内所有元素填充为10;
6、冒泡排序
- 比较数组中两个相邻的元素大小,如果第一个数比第二个数大则交换两者位置
- 每次比较中都会产生一个最大或者最小的数字
- 下一轮就会少一次排序
- 依次循环,知道结束
import java.util.Arrays;
public class ArrayDemo07 {
public static void main(String[] args) {
int[] a = {4,55,4,67,68,98,51};
sort(a);
System.out.println(Arrays.toString(a));
}
//冒泡排序
// 1、比较数组中两个相邻的元素大小,如果第一个数比第二个数大则交换两者位置
// 2、每次比较中都会产生一个最大或者最小的数字
// 3、下一轮就会少一次排序
// 4、依次循环,知道结束
public static int[] sort(int[] array){
//外部循环:确定循环次数
for (int i = 0; i < array.length-1 ; i++){
boolean flag = false;
//内部循环:确定每次循环比较次数,每循环一次下一次循环就会少比较一次
for (int j = 0; j < array.length-1-i ; j++){
if (array[j] > array[j+1]){
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
flag = true;
}
}
if (flag == false){ //如果某一轮循环没有交换产生,说明后面的元素顺序是
break;
}
}
return array;
}
}
7、稀疏数组
当一个数组中大部分元素为0或者同一值时,可以使用稀疏数组保存该数组
ublic class ArrayDemo08 {
public static void main(String[] args) {
//1、创建一个二维数组 11*11 0:没有棋子; 1:黑子 2:白子
int[][] array1 = new int[11][11];
array1[1][2] = 1;
array1[2][3] = 2;
//输出原始数组
System.out.println("输出原始数组:");
for (int[] ints : array1) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
//转换为稀疏数组保存
//1、获取有效值个数
int sum = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值个数为:" + sum);
//2、创建一个稀疏数组的数组
int[][] array2 = new int[sum+1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
//遍历一遍二维数组,将非零值存放到稀疏数组中
int count = 1;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j]!=0){
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
count++;
}
}
}
//输出稀疏数组
System.out.println("输出稀疏数组:");
for (int[] ints : array2) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
//还原
int[][] array3 =new int[array2[0][0]][array2[0][1]];
for (int i = 1; i < array2.length ;i++){
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
//输出还原数组
System.out.println("输出还原数组:");
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt + "\t");
}
System.out.println();
}
}
}