微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!
数组操作专题提供数组操作的最新资讯内容,帮你更好的了解数组操作。
05-02 Java 一维数组、内存分配、数组操作
数组的定义动态初始化/*数组:存储同一种数据类型的多个元素的容器。定义格式:A:数据类型[] 数组名;B:数据类型 数组名[];举例:A:int[] a; 定义一个int类型的数组a变量B:int a[]; 定义一个int类型的a数组变量注意:效果可以认为是一样的,都是定义一个int数组,但是念法上有些小区别。推荐使用第一种。如何对数组进行初始化呢?A:何谓初始化呢? 就是为数组开辟内存空间,并为每个数组元素赋予值B:有几种方式呢?a:动态初始化 只指定长度,由系统给出初始化值b:静态初始化 给出初始化值,由系统决定长度动态初始化的格式:数据类型[] 数组名 = new 数据类型[数组长度];举例:int[] arr = new int[3];如何获取数组中的元素呢?通过:数组名[索引]索引其实就是每个元素的编号,从0开始,最大索引是数组的长度-1。*/class ArrayDemo {public static void main(String[] args) {//定义一个数组//int[] a;//可能尚未初始化变量a//System.out.println(a);int[] arr = new int[3];/*左边:int:说明数组中的元素的数据类型是int类型[]:说明这是一个数组arr:是数组的名称右边:new:为数组分配内存空间。int:说明数组中的元素的数据类型是int类型[]:说明这是一个数组3:数组长度,其实也就是数组中元素的个数*/System.out.println(arr); //[I@175078b 地址值。//我要地址值没有意义啊,我就要数据值,怎么办呢?//不用担心,java为你考虑到了。//其实数组中的每个元素都是有编号的,并且是从0开始。最大编号是数组的长度-1。//用数组名和编号的配合就可以获取数组中的指定编号的元素。这个编号的专业叫法:索引//通过数组名访问数据的格式是:数组名[索引];System.out.println(arr[0]);//0System.out.println(arr[1]);//0System.out.println(arr[2]);}}Java中的内存分配图: 数组的内存图解----   一个数组  数组的内存图解 -----   2个数组 数组内存图解  ----  3个数组/*定义第一个数组,定义完毕后,给数组元素赋值。赋值完毕后,在输出数组名称和元素。定义第二个数组,定义完毕后,给数组元素赋值。赋值完毕后,在输出数组名称和元素。定义第三个数组,把第一个数组的地址值赋值给它。(注意类型一致),通过第三个数组的名称去把元素重复赋值。最后,再次输出第一个数组数组名称和元素。*/class ArrayDemo4 {public static void main(String[] args) {//定义第一个数组int[] arr = new int[3];arr[0] = 88;arr[1] = 33;arr[2] = 66;System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println("----");//定义第二个数组int[] arr2 = new int[3];arr2[0] = 22;arr2[1] = 44;arr2[2] = 55;System.out.println(arr2);System.out.println(arr2[0]);System.out.println(arr2[1]);System.out.println(arr2[2]);System.out.println("----");//定义第三个数组int[] arr3 = arr;arr3[0] = 100;arr3[1] = 200;System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);}}3个数组内存图解: 数组的静态初始化、及内存分配静态初始化/*数组的静态初始化:格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};简化格式:数据类型[] 数组名 = {元素1,元素2,…};举例:int[] arr = new int[]{1,2,3};简化后:int[] arr = {1,2,3}; //这里是大括号注意事项:不要同时动态和静态进行。如下格式:int[] arr = new int[3]{1,2,3}; //错误*/class ArrayDemo5 {public static void main(String[] args) {//定义数组int[] arr = {1,2,3};System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);}}  静态初始化、及内存图: 数组操作中两个小问题:越界和空指针 /*数组操作的两个常见小问题:ArrayIndexOutOfBoundsException:数组索引越界异常原因:你访问了不存在的索引。NullPointerException:空指针异常原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。作用:请自己把所有的场景Exception结尾的问题总结一下。以后遇到就记录下来。现象,原因,解决方案。*/class ArrayDemo6 {public static void main(String[] args) {//定义数组int[] arr = {1,2,3};//System.out.println(arr[3]);//引用类型的常量:空常量 nullarr = null;System.out.println(arr[0]);}} 数组操作数组遍历:/*数组遍历:就是依次输出数组中的每一个元素。注意:数组提供了一个属性length,用于获取数组的长度。格式:数组名.length*/class ArrayTest {public static void main(String[] args) {//定义数组int[] arr = {11,22,33,44,55};//获取每一个元素//如何获取呢?我们知道数组名结合编号(索引)就可以找到数据System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println(arr[3]);System.out.println(arr[4]);System.out.println("--------------------");//虽然这种做法可以,但是不是我想要的//我们发现,代码的重复度很高//输出语句,数组名都是相同的,仅仅是索引是变化的//我们就可以使用循环搞定索引值for(int x=0; x<5; x++) {//x=0,1,2,3,4System.out.println(arr[x]);}System.out.println("--------------------");//从0开始我们是明确的,但是为什么到5呢,我们是数了一下数组的个数//继续看下个数组如何遍历int[] arr2 = {1,2,3,4,5,6,7,8,9,10,11,2,2,3,4,5,7,8,5,3,5,6,8,7,8,5,3,5,6,8,7,8,5,3,5,6,8,7,8,5,3,5,6,8,7,8,5,3,5,6,8};//而我们在很多时候,数组的元素不能靠数//这个时候,数组就给我们提供了一个属性:length专门用于获取数组的长度//格式:数组名.length 返回数组的长度System.out.println(arr.length);System.out.println(arr2.length);System.out.println("--------------------");//改进第一个程序for(int x=0; x<arr.length; x++) {System.out.println(arr[x]);}System.out.println("--------------------");//我们如果想要对多个数组进行遍历,每个数组的遍历我们都把代码写一遍,麻烦不//麻烦,所以,我们准备用方法改进。//用方法改进后,请调用printArray(arr);System.out.println("--------------------");printArray(arr2);System.out.println("--------------------");printArray2(arr);}/*遍历数组的方法两个明确:返回值类型:void参数列表:int[] arr*/public static void printArray(int[] arr) {for(int x=0; x<arr.length; x++) {System.out.println(arr[x]);}}//请看改进版本public static void printArray2(int[] arr) {System.out.print("[");for(int x=0; x<arr.length; x++) {if(x == arr.length-1) { //这是最后一个元素System.out.println(arr[x]+"]");}else {System.out.print(arr[x]+", ");}}}}数组取最值:/*数组获取最值(获取数组中的最大值最小值)分析:A:定义一个数组,并对数组的元素进行静态初始化。B:从数组中任意的找一个元素作为参照物(一般取第一个),默认它就是最大值。C:然后遍历其他的元素,依次获取和参照物进行比较,如果大就留下来,如果小,就离开。D:最后参照物里面保存的就是最大值。*/class ArrayTest2 {public static void main(String[] args) {//定义一个数组int[] arr = {34,98,10,25,67};//调用方法int max = getMax(arr);System.out.println("max:"+max);//请获取数组中的最小值int min = getMin(arr);System.out.println("min:"+min);}/*需求:获取数组中的最大值两个明确:返回值类型:int参数列表:int[] arr*/public static int getMax(int[] arr) {//从数组中任意的找一个元素作为参照物int max = arr[0];//然后遍历其他的元素for(int x=1; x<arr.length; x++) {//依次获取和参照物进行比较,如果大就留下来,如果小,就离开。if(arr[x] > max) {max = arr[x];}}//最后参照物里面保存的就是最大值。return max;}public static int getMin(int[] arr) {//从数组中任意的找一个元素作为参照物int min = arr[0];//然后遍历其他的元素for(int x=1; x<arr.length; x++) {//依次获取和参照物进行比较,如果小就留下来,如果大,就离开。if(arr[x] < min) {min = arr[x];}}//最后参照物里面保存的就是
06-01 Java 二维数组格式、二维数组内存图解、二维数组操作
二维数组格式1/*二维数组:就是元素为一维数组的一个数组。格式1:数据类型[][] 数组名 = new 数据类型[m][n];m:表示这个二维数组有多少个一维数组。n:表示每一个一维数组的元素有多少个。注意:A:以下格式也可以表示二维数组a:数据类型 数组名[][] = new 数据类型[m][n];b:数据类型[] 数组名[] = new 数据类型[m][n];B:注意下面定义的区别int x;int y;int x,y;int[] x;int[] y[];int[] x,y[];//这个x是一维数组,y是二维数组*/class Array2Demo {public static void main(String[] args) {//定义一个二维数组int[][] arr = new int[3][2];//定义了一个二维数组arr//这个二维数组有3个一维数组的元素//每一个一维数组有2个元素//输出二维数组名称System.out.println(arr); //地址值 [[I@175078b//输出二维数组的第一个元素一维数组的名称System.out.println(arr[0]); //地址值 [I@42552cSystem.out.println(arr[1]); //地址值 [I@e5bbd6System.out.println(arr[2]); //地址值 [I@8ee016//输出二维数组的元素System.out.println(arr[0][0]); //0System.out.println(arr[0][1]); //0}}格式1内存图解:  二维数组格式2/*格式2:数据类型[][] 数组名 = new 数据类型[m][];m:表示这个二维数组有多少个一维数组。列数没有给出,可以动态的给。这一次是一个变化的列数。*/class Array2Demo2 {public static void main(String[] args) {//定义数组int[][] arr = new int[3][];System.out.println(arr); //[[I@175078bSystem.out.println(arr[0]); //nullSystem.out.println(arr[1]); //nullSystem.out.println(arr[2]); //null//动态的为每一个一维数组分配空间arr[0] = new int[2];arr[1] = new int[3];arr[2] = new int[1];System.out.println(arr[0]); //[I@42552cSystem.out.println(arr[1]); //[I@e5bbd6System.out.println(arr[2]); //[I@8ee016System.out.println(arr[0][0]); //0System.out.println(arr[0][1]); //0//ArrayIndexOutOfBoundsException//System.out.println(arr[0][2]); //错误arr[1][0] = 100;arr[1][2] = 200;}} 二维数组格式2  内存图解:二维数组格式3 /*格式3:基本格式:数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};简化版格式:数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};举例:int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};int[][] arr = {{1,2,3},{4,5},{6}};*/class Array2Demo3 {public static void main(String[] args) {//定义数组int[][] arr = {{1,2,3},{4,5},{6}};System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.println(arr[2]);System.out.println(arr[0][0]); //1System.out.println(arr[1][0]); //4System.out.println(arr[2][0]); //6System.out.println(arr[0][1]); //2System.out.println(arr[1][1]); //5//越界System.out.println(arr[2][1]); //错误}}二维数组格式3  内存图解: 遍历二维数组/*需求:二维数组遍历外循环控制的是二维数组的长度,其实就是一维数组的个数。内循环控制的是一维数组的长度。*/class Array2Test {public static void main(String[] args) {//定义一个二维数组int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};//用方法改进//调用方法printArray2(arr);}/*需求:遍历二维数组两个明确:返回值类型:void参数列表:int[][] arr*/public static void printArray2(int[][] arr) {for(int x=0; x<arr.length; x++) {for(int y=0; y<arr[x].length; y++) {System.out.print(arr[x][y]+" ");}System.out.println();}}}二维数组求和:/*公司年销售额求和某公司按照季度和月份统计的数据如下:单位(万元)第一季度:22,66,44第二季度:77,33,88第三季度:25,45,65第四季度:11,66,99分析:A:把题目的数据用二维数组来表示int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};B:如何求和呢?求和其实就是获取到每一个元素,然后累加即可。C:定义一个求和变量sum,初始化值是0。D:通过遍历就可以得到每一个二维数组的元素。E:把元素累加即可。F:最后输出sum,就是结果。*/class Array2Test2 {public static void main(String[] args) {//把题目的数据用二维数组来表示int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};//定义一个求和变量sum,初始化值是0。int sum = 0;//通过遍历就可以得到每一个二维数组的元素。for(int x=0; x<arr.length; x++) {for(int y=0; y<arr[x].length; y++) {//把元素累加即可。sum += arr[x][y];}}//最后输出sum,就是结果。System.out.println("一年的销售额为:"+sum+"万元");}} 二维数组树出杨辉三角:打印杨辉三角形(行数可以键盘录入)/*需求:打印杨辉三角形(行数可以键盘录入)11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1分析:看这种图像的规律A:任何一行的第一列和最后一列都是1B:从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。步骤:A:首先定义一个二维数组。行数如果是n,我们把列数也先定义为n。这个n的数据来自于键盘录入。B:给这个二维数组任何一行的第一列和最后一列赋值为1C:按照规律给其他元素赋值从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。D:遍历这个二维数组。*/import java.util.Scanner;class Array2Test3 {public static void main(String[] args) {//创建键盘录入对象Scanner sc = new Scanner(System.in);//这个n的数据来自于键盘录入。System.out.println("请输入一个数据:");int n = sc.nextInt();//定义二维数组int[][] arr = new int[n][n];//给这个二维数组任何一行的第一列和最后一列赋值为1for(int x=0; x<arr.length; x++) {arr[x][0] = 1; //任何一行第1列arr[x][x] = 1; //任何一行的最后1列}//按照规律给其他元素赋值//从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和。for(int x=2; x<arr.length; x++) {//这里如果y<=x是有个小问题的,就是最后一列的问题//所以这里要减去1//并且y也应该从1开始,因为第一列也是有值了for(int y=1; y<=x-1; y++) {//每一个数据是它上一行的前一列和它上一行的本列之和。arr[x][y] = arr[x-1][y-1] + arr[x-1][y];}}//这个时候,要注意了,内循环的变化必须和曾经讲过的九九乘法表类似for(int x=0; x<arr.length; x++) {for(int y=0; y<=x; y++) {System.out.print(arr[x][y]+"t");}System.out.println();}}}