数组是相同类型的有序集合
描述的是相同类型的若干数据,按照一定先后顺序排列组合成
每一个数据称为数组的元素,每个数组元素都可以通过一个下标来访问【下表从0开始】
也可以直接声明+创建
int[] nums2=new int[10]; 数组通过索引访问,数组索引从0开始,获取数组的长度用arrays.length package com.javastudy.array; public class ArrayDemo01 { //数组定义 public static void main(String[] args) { int[] nums1;//推荐这种方法定义数组,在数据类型后面加[], // 这里只是声明了一个数组但是没有分配空间 //int num2[]; nums1=new int[10];//这里面可以存放10个int类型的数字,这里是创建了一个数组 //给数组元素赋值 //int[] nums2=new int[10];//这样可以把声明和创建放在一起 nums1[0]=1; nums1[1]=2; nums1[2]=3; nums1[3]=4; nums1[4]=5; nums1[5]=6; nums1[6]=7; nums1[7]=8; nums1[8]=9; nums1[9]=10; //计算所有元素的和 int sum=0; for (int i = 0; i < nums1.length; i++) {//nums1.length代表数组的长度 sum=sum+nums1[i]; } System.out.println(nums1[9]);//如果数组没有赋值那么输出默认值0 System.out.println("总和为:"+sum); } } 输出: 10 总和为:55堆
存放new的对象和数组可以被所有的线程共享,不会存放别的对象引用栈
存放基本变量类型(会包括这个基本类型的具体数组)引用对象的变量(会存放这个引用在堆里面的具体地址)方法区
可以被所有线程共享包含了所有的class和static变量代码举例:
package com.javastudy.array; public class ArrayDemo05 { public static void main(String[] args) { int[][]array={{1,2}, {2,3}, {3,4}, {4,5}};//这实际上是定义的一个4行2列的数组 /* 1,2 array[0] 2,3 array[1] 3,4 array[2] 4,5 array[3] */ System.out.println(array[0][0]); System.out.println(array[0]);//这时输出的是array[0]这个对象,不是具体数值 System.out.println(array[0][1]); System.out.println(array.length);//这里输出的是外面的也就是4 System.out.println(array[0].length);//这时候输出的是里面的为2 System.out.println("=============="); //把他们都遍历出来 for (int i = 0; i < array.length; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println(array[i][j]); } } } } 输出: 1 [I@29453f44 这里输出的是一个对象 2 4 2 ============== 1 2 2 3 3 4 4 5API提供了一个工具类叫Arrays类,里面有很多方法可以供我们去调用,可以查看JDK帮助文档。
常用的几个方法:
打印数组元素,可以直接调用Arrays.toString( )这个方法去打印数组元素,也可以自己写方法。 package com.javastudy.array; import java.util.Arrays; public class ArrayDemo06 { public static void main(String[] args) { int[] a = {1,2,5,64,8,121,8646,2533,8121,4115,5925}; System.out.println(a);//[I@29453f44 //打印数组元素 System.out.println(Arrays.toString(a)); } } 输出: [I@29453f44 [1, 2, 5, 64, 8, 121, 8646, 2533, 8121, 4115, 5925] 数组排序,使用Arrays里面的sort方法。 package com.javastudy.array; import java.util.Arrays; public class ArrayDemo06 { public static void main(String[] args) { int[] a = {1,2,5,64,8,121,8646,2533,8121,4115,5925}; Arrays.sort(a);//升序 System.out.println(Arrays.toString(a)); } } 输出: [1, 2, 5, 8, 64, 121, 2533, 4115, 5925, 8121, 8646] 数组填充 package com.javastudy.array; import java.util.Arrays; public class ArrayDemo06 { public static void main(String[] args) { int[] a = {1,2,5,64,8,121,8646,2533,8121,4115,5925}; Arrays.fill(a,0,2,0);//把a中索引为0到2的元素填充为0 System.out.println(Arrays.toString(a)); } } 输出: [0, 0, 5, 8, 64, 121, 2533, 4115, 5925, 8121, 8646]动态图:每两个数字比大小
代码:
package com.javastudy.array; import java.util.Arrays; public class ArrayDemo07 { public static void main(String[] args) { int[] a={1,2,8,0,6,9,3,5,10,2,4,9}; int[] sort=sort(a); System.out.println(Arrays.toString(sort)); } //冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数比第二个数大就交换位置。 //2.每一次比较都会产生一个最大或者最小的数 //3.下一轮就可以少一次排序 //4.一次循环直到结束 public static int[] sort(int[] array) { //临时变量 int temp = 0; //外层循环,判断要走多少次 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 + 1] < array[j]) { //两个数进行交换 temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; flag=true; } } if (flag==false){ break; } } return array; } } 输出; [0, 1, 2, 2, 3, 4, 5, 6, 8, 9, 9, 10][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0GoNybQd-1603347984999)(D:\markdown\javase笔记图片\image-20201022104812838.png)]
上图中一共6行7列,除了0以外有8个数,第一个数在第一行第三列值为22。以此类推。
package com.javastudy.array; public 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(); } 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];//稀疏数组的行是有效数的个数+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;//如果出现不等于0的数, // 那么从第二行开始,第二行第一个数存这个有效值的横坐标 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]];//想要还原的数组的行列数, // 从稀疏数组里面存的数据里面取,这里还有个细节,他这11行11列的元素默认初始值为0 //2.给其中的元素还原他的值 for (int i = 1; i < array2.length; i++) { array3[array2[i][0]][array2[i][1]] = array2[i][2];//这行的意思是用之前 // 稀疏数组中存的有效值的数覆盖对应位置的0,注意这里i是从1开始即从第二行开始的 } //3.打印 System.out.println("输出还原的数组"); for (int[] ints : array3) { for (int anInt : ints) { System.out.print(anInt+"\t"); } System.out.println(); } } } 输出; 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ============== 有效值的个数:2 稀疏数组 11 11 2 1 2 1 2 3 2 ================= 还原 输出还原的数组 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0