数组
数组概述
数组是相同类型数据的有序集合
数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成
每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问他们
数组声明创建
必须声明变量
数组的元素是通过索引访问的,数组索引从0开始
获取数组长度: arrays.length
package Xuexi.array; public class Demo01 { //变量的类型 变量名字 = 变量的值; //数组类型 public static void main(String[] args) { int[] nums;//1.定义,声明一个数组 //int nums2[]; //效果相同,不是首选方法 nums = new int[10];//2.创建一个数组 nums[0]=1;//3.给数组元素赋值 nums[1]=2; nums[2]=3; nums[3]=4; nums[4]=5; nums[5]=6; nums[6]=7; nums[7]=8; nums[8]=9; nums[9]=10; //计算所有元素的和 int sum=0; //获取数组长度:arrays。Length for (int i = 0; i < nums.length; i++) { sum = sum + nums[i]; } System.out.println(sum); } }
内存分析
Java内存:堆、栈、方法区
三种初始化
静态初始化、动态初始化、数组的默认初始化
package Xuexi.array; public class ArrayDemo02 { public static void main(String[] args) { //静态初始化 int[] a = {1,2,3,4,5,6,7,8}; System.out.println(a[0]); //动态初始化:包含默认初始化 int[] b = new int[10]; b[0] = 10; System.out.println(b[0]); } }
数组的四个基本特点
-
长度是确定的,一旦创建,打小就无法改变
-
其元素必须相同类型,不出现混合类型
-
数组中元素可以实任何数据类型,包括基本类型和引用类型
-
数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量
-
数组本身就是对象,java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的
数组边界
下标合法区间:[0,length-1]
小结:数组是相同数据类型的有序集合
数组也是对象
数组长度是确定的,不可变。如果越界,则报:ArrayIndexOutofBounds
数组使用
普通的For循环
For~Each循环
package Xuexi.array; public class ArrayDemo03 { public static void main(String[] args) { int[] arrays = {1,2,3,4,5}; //打印全部的数组元素 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 = sum + arrays[i]; } System.out.println("sum="+sum); System.out.println("=================="); //查找最大元素 int max = arrays[0]; for (int i = 0; i < arrays.length; i++) { if(arrays[i]>max){ max = arrays[i]; } } System.out.println("max="+max); } }
package Xuexi.array; public class ArrayDemo04 { public static void main(String[] args) { int[] arrays = {1,2,3,4,5}; //JDK1.5,没有下标 //for (int array : arrays) { // System.out.println(array); //} //printArray(arrays); int[] reverse=reverse(arrays); printArray(reverse); } //反转数组 public static int[] reverse(int[] arrays){ int[] result = new int[arrays.length]; //反转的操作 for (int i = 0, j=result.length-1;i< arrays.length; i++,j--) { //result[] = arrays[i]; result[j]=arrays[i]; } return result; } //打印数组元素 public static void printArray(int [] arrays){ for (int i = 0; i < arrays.length; i++) { System.out.println(arrays[i]+" "); } } }
数组作方法入参
数组作返回值
多维数组
多维数组可以看成数组的数组,比如二维数组就是一个特殊的一堆数组,其每一个元素都是一个一维数组
二维数组
int a[][] = new int[2][5];
(两行五列的数组)
package Xuexi.array; public class ArrayDemo05 { public static void main(String[] args) { int[][] array = {{1,2},{2,3},{3,4},{4,5}}; //printArray(array[0]); //System.out.println(array[2][0]); //System.out.println(array[2][1]); for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println(array[i][j]); } } } //打印数组元素 //public static void printArray(int [] arrays){ // for (int i = 0; i < arrays.length; i++) { // System.out.print(arrays[i]+" "); //} //} }
Arrays类
数组的工具类java.util.Arrays
查看JDK帮助文档
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而”不用“使用对象来调用
具有以下功能:
-
给数组赋值:通过fill方法
-
对数组排序:通过sott方法,升序
-
比较数组:通过equals方法比较数组中元素值是否相等
-
查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作
package Xuexi.array; import java.lang.reflect.Array; import java.util.Arrays; public class ArrayDemo06 { public static void main(String[] args) { int[] a = {1,2,3,4,6564,7867,9878,6,455}; //有序输出 Arrays.sort(a);//对数组进行排序 System.out.println(Arrays.toString(a)); Arrays.fill(a,0);//数组填充 System.out.println(Arrays.toString(a)); } public static void printArray(int[] a){} }
冒泡排序
两层循环,外层冒泡轮数,里层依次比较
package Xuexi.array; import java.util.Arrays; public class ArrayDemo07 { public static void main(String[] args) { int[] a = {1,4,45,3,6545,756,7,65}; int[] sort = sort(a);//调用完我们自己写的排序方法以后,返回一个排序后的数组 System.out.println(Arrays.toString(sort)); } public static int[] sort(int[] array) { //临时变量 int temp = 0; //外层循环,判断我们这个要走多少次 for (int i = 0; i < array.length - 1; i++) { boolean flag = false;//通过flag表示位减少没有意义的比较 //内层循环,如果第一个数比第二个数大,则交换位置 for (int j = 0; j < array.length - 1 - i; j++) { if (array[j + 1] > array[j]) { temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; flag = true; } } if(flag== false){ break; } } return array; } }
稀疏数组
一种数据结构
一个数组大部分元素为0,可以使用稀疏数组来保存该数组
稀疏数组处理方式:
-
记录数组一共几行几列,有多少不同值
-
把具有不同值的元素和行列机值记录在一个小规模数组中,从而缩小程序的规模
编写五子棋游戏,有存盘退出和续上盘的功能
package Xuexi.array; public class ArrayDemo08 { public static void main(String[] args) { //1.创建2维数组,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(); } System.out.println("========================"); //转换为稀疏数组保存 //获取有效值的个数 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; 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= 0; for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { if(array1[i][j]!=0){ count++; array2[count][0] = i; array2[count][1] = j; array2[count][2] = array1[i][j]; } } } //输出稀疏数组 System.out.println("稀疏数组"); for (int i = 0; i < array2.length; i++) { System.out.println(array2[i][0]+"\t" +array2[i][1]+"\t" +array2[i][2]+"\t"); } System.out.println("==================="); System.out.println("还原"); //1.读取稀疏数组 int[][] array3 = new int[array2[0][0]][array2[0][1]]; //2.给元素还原值 for (int i = 1; i < array2.length; i++) { array3[array2[i][0]][array2[i][1]] = array2[i][2]; } //3.打印 System.out.println("输出还原的数组"); for (int[] ints:array1){ for(int anInt : ints){ System.out.print(anInt+"\t"); } System.out.println(); } } }