数组
1. 数组概述
- 数组的定义:
- 数组是相同类型数据的有序集合
- 数组描述的是相同类型的若干个数控,按照一定的先后次序排列组合而成
- 其中,每一个数据称为一个数组元素,每个数组元素可以通过下标来指示(下标从0开始)
- 数组也是对象,数据元素相当于对象的成员变量
- 数组长度是确定的不可变的
2.数组声明和创建
-
数组变量定义语法:
- dataType[ ] arrayRefVar; ---常用定义方法
- dataType arrayRefVar[ ]; -----C和C++写法
-
Java用new关键字创建数组:
- dataType[ ] arrayRefVar=new dataType[arraySize] ; ----分配内存
-
数组赋值:
- 数组元素用下标索引,从0开始
- 初始化赋值、for循环赋值
- 数组长度:数组名.length
-
学习代码:
package com.bbh.array; public class ArrayDemo01 { public static void main(String[] args) { int[] nums;//声明一个数组,名字为num,类型是int[] 基类型是int,[]代表是数组类型 nums=new int[10];//创建数组,分配10个空间,可以存放10个数组元素 //动态初始化,数组元素未赋值的,默认为0,string类型默认为null nums[0]=1; nums[1]=2; nums[2]=3; int sum=0; for (int i = 0; i <nums.length ; i++) {//nums.length 获取数组长度 sum+=nums[i]; } System.out.println("数组元素的和为"+sum); } }
-
数组初始化:数组长度一经确定无法改变(静态)
-
静态初始化:
-
//数组静态初始化 int[] array={1,2,3,4,5};//定义并初始化一个长度为5的数组
-
-
动态初始化:
-
//数组动态初始化 int[] array2=new int[5]; array2[0]=1; array2[1]=2; array2[2]=3; array2[3]=4;
-
-
默认初始化:数组也是引用类型,它的元素相当于类的实例变量,因此数组分配空间时,其所有元素就像实例变量一样被隐式初始化0。
-
//数组默认初始化,未初始化的默认初始化为0 System.out.println(array2[4]);//输出0
-
-
-
数组的基本特点:
- 数组长度一经确定,不可改变
- 数组元素必须是相同类型
- 数组元素可以是任意数据类型,包括基本类型和引用类型
- 数组变量属于引用类型,数组可以看成是对象,数组中的每个元素相当于该对象的成员变量
- 数组本身就是对象,Java中对象是保存在堆中的,因此数组无论保存原始类型还是其他对象类型都是保存在堆中
-
数组边界:
- 下标的合法区间:[0,length-1],
- 如果越界就会报错---java.lang.ArrayIndexOutOfBoundsException: 10
(+)Java内存分析
-
简单分析:
-
例如数组的存放(上个代码为例):
3.数组使用
-
普通的for循环
-
for each 增强for循环:array.for 适合打印输出
-
数组作为方法入参
-
数组作为返回值
-
练习代码:
package com.bbh.array; public class ArrayDemo03 { public static void main(String[] args) { //用for循环打印数组 int [] arrays={1,2,3,4}; System.out.println("打印数组所有元素"); for (int i = 0; i <arrays.length ; i++) { System.out.print(arrays[i]+" "); } System.out.println(); System.out.println("======================="); //计算数组元素的和 int sum=0; for (int i = 0; i <arrays.length ; i++) { sum+=arrays[i]; } System.out.println("数组元素的总和"); System.out.print("sum="+sum); System.out.println("======================="); //查找数组元素中的最大值 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="+max); System.out.println("======================="); //用增强for循环打印数组:arrays.for System.out.println("用增强for循环打印数组"); for (int array : arrays) { System.out.println(array); } System.out.println("======================="); System.out.println("反转了的数组"); //调用反转数组的方法 int[] revers=revers(arrays); } //数组作为参数和返回值使用 //反转数组 public static int[] revers(int[] arrays){ int [] result=new int[arrays.length]; for (int i = 0,j=arrays.length-1; i <arrays.length ; i++,j--) { result[i]=arrays[j]; System.out.println(result[i]); } return result;//数组作为返回值 } }
4.多维数组
-
多位数组可以看成是数组的数组
-
二维数组:int array[ ] [ ]=new int [ ] [ ]
-
练习代码:
package com.bbh.array; public class ArrayDemo04 { public static void main(String[] args) { //二维数组 int[][] array={{1,2},{3,4},{4,5},{5,6}}; //打印输出二维数组 for (int i = 0; i <array.length ; i++) {//第一维长度 for (int j = 0; j <array[i].length ; j++) {//第二维长度 System.out.print(array[i][j]+","); } System.out.print("\t"); } } }
5.Arrays类
-
数组的工具类java.util.Arrays
-
由于数组对象本身没有什么方法可以使用,但API中提供了一个工具类Arrays供我们使用
-
常用方法:
- 给数组赋值:fill
- 数组排序:sort
- 比较数组:equals 比较数组中元素值是否相等
- 查找数组元素:通过binarySearch方法对排序好的数组进行二分查找
-
练习代码:
package com.bbh.array; import java.util.Arrays; //Arrays类的使用 public class ArrayDemo05 { public static void main(String[] args) { int[] a={1,3,4,2,5,67,889}; //使用工具类打印数组(toString) System.out.println("打印输出数组"); System.out.println(Arrays.toString(a)); System.out.println("============================"); //使用工具类对数组排序输出(sort) Arrays.sort(a); System.out.println("排序后输出数组"); System.out.println(Arrays.toString(a)); System.out.println("============================"); //使用数组填充方法 fill //将数组a中下标二的元素(包括)到下标四的元素(不包括)用0填充 Arrays.fill(a,2,4,0); System.out.println("填充后输出数组"); System.out.println(Arrays.toString(a)); } }
(+)冒泡排序
-
冒泡排序两层循环,外层冒泡轮数,里层依次比较
-
时间复杂度O(n*n)
-
代码:
package com.bbh.array; import java.util.Arrays; public class ArrayDemo { public static void main(String[] args) { int[] array={2,4,56,76,74,1,3,24,6}; sort(array); } /** * 冒泡排序: * 1.比较数组中两个相邻的元素,把小的交换到前面 * 2.每一次比较都可以确定一个元素的最终位置 * 3.因此下一次可以少一次比较 * 4.依次循环直到结束 */ public static void sort(int[] array) { //排序次数循环 for (int i = 0; i <array.length-1 ; i++) { boolean flag=false;//通过设置flag标识位减少没有意义的比较 //每次排序的循环 for (int j = 0; j < array.length - i - 1; j++) { if (array[j] > array[j + 1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; flag=true; } } if (flag==false){ break; } } System.out.println(Arrays.toString(array)); } }
6.稀疏数组
-
当一个数组大部分元素为0 或者为相同值的元素时,可以用稀疏数组来保存
-
稀疏数组处理 方式:
- 记录数组的值不同的元素的值及其行号、列号
- 记录在三元组中(存元素值、行号列号、还有数组大小及有效值的个数) ,相同元素只存一次 从而缩小数组规模
-
用稀疏数组编写棋盘存盘和续上盘的功能:
-
题目:
-
代码实现:
-