赞
踩
注:本文章内容多数来自哔站尚硅谷视频课程,整理于此方便后续查看
数组是相同数据类型的元素按一定顺序排列的集合
。使用数组可以将同一类型的数据存储在连续的内存位置
。
下标从0开始
)类是一个限定范围,对象是范围内的具体事物
)
类型 数组名[ ]
或类型[ ] 数组名
类型–>数组元素类型
数组名–>合法标识符(确定一个数组)
[ ]–>确定创建的是一个数组类型变量(数组标志)
在定义数组时不会为数组分配内存,故方括号中不需要指明数据元素个数
即数组长度。声明的数组名只是应用变量,用于指向一个数组
Java中没有静态数组定义,故不能写int testArry[5]
,正确写法为int testArry[]
定义数组同时给数组元素赋初值
,使用一对大括号将初值括起来,每个元素对应一个引用//类型[] 数组名 = {初值1,初值2……};
int[] testArry = {1,2,3,4}//定义了4个元素int型数组
运算符new
为数组分配空间,方括号内数字表示元素个数//类型[] 数组名 = new 类型 [数组大小]
int[] testArry = new int[4];
类型 数组名[ ] = new 类型[ 数组大小 ];
数组名[0] = new 类型(初值表);
……
数组名[数组大小-1] = new 类型(初值表);
class Animal{ String name; public Animal(String name){ this.name = name; } public String getName(){ return name; } } class AnimalTest{ Animal[] animals = new Animal[5]; animals[0] = = new Animal("大象"); animals[1] = new Animal("狮子"); animals[2] = new Animal("老虎"); animals[3] = new Animal("犀牛"); animals[4] = new Animal("长颈鹿"); for (int i = 0; i < animals.length; i++) { System.out.println(animals[i].getName()); }//返回地址,因为此处为引用数据类型,所指向的是对象所在的地址,而不是对象本身,需要调用函数获取相应对象,如下 for (int j = 0; j < animals.length; j++) { System.out.println(animals[j].getName()); } }
1.虚拟机栈:用于存放方法中声明的变量,存放数组地址(首地址)。如arr
2.堆:用于存放数组的实体(数组中的所有元素)。如1,2,3
3.对于二维数组的内存结构:
1.二维组方法名位于栈中,存放外存数组地址(首地址)
2.二维数组的外层数组元素存放内层数组地址位于堆中
3.二维数组的内层数组元素存放数组实体(元素)位于堆中
数组间赋值:
1.类型一致(都为整型、字符型、浮点型……)
2.维度一致(都为一维或二维)
数组常用算法:
数值型数组的特征值计算:最大值、最小值、总和、平均值
数组元素的赋值:杨辉三角、生成随机数……
数组的复制、赋值:前者是新开辟空间,后者是新建一个变量
数组的反转
数组的扩容和缩容
数组的查找:线性、二分(有序)
数组排序:冒泡、快速
public class ArrExer01 { public static void main(String[] args){ //1.数组的声明与初始化-->数组初始化完成则长度确定且不可变 //1.1静态初始化 int[] arr1 = new int[]{1,2,3,4,5};//表示1 System.out.println(arr1);//打印数组地址值,结构为‘类型’+@+地址值 System.out.println(arr1[0]+arr1[1]+arr1[2]+arr1[3]+arr1[4]);//打印数组内容 int[] arr2 = {1,2,3,4,5};//表示2 System.out.println(arr2); System.out.println(arr2[0]+arr2[1]+arr2[2]+arr2[3]+arr2[4]); //1.2动态初始化,确定空间大小但没有赋予内容 int[] arr3 = new int[5]; arr3[0] = 1; arr3[2] = 3; arr3[4] = 5; for (int i = 0; i < arr3.length; i++) {//数组遍历 System.out.print(arr3[i]); } System.out.println("------cut line------"); //2.数组元素默认初始化值 //2.1 整型数组默认初始化值 int[] i_arr = new int[3]; System.out.println(i_arr[0]);//默认值为0 //2.2 浮点型数组默认初始化值 double[] d_arr = new double[3]; System.out.println(d_arr[0]);//默认值为0.0 //2.3 字符型数组默认初始化值 char[] c_arr = new char[3];//默认值为0,不为‘0’,或理解为‘\u0000’ System.out.println(c_arr[0]); //判断char默认值到地为多少 if(c_arr[0] == 0){ System.out.println("char's default is 0!"); } if(c_arr[0] == '0'){ System.out.println("char's default is '0'!"); } //2.4 boolean(布尔)型数组默认初始化值 boolean[] b_arr = new boolean[3];//默认值为false System.out.println(b_arr[0]); //2.5 引用数据类型数组默认初始化值;此处String为引用数据类型,但因为JVM特殊处理后,可以返回对象值而不是地址值 String[] s_arr = new String[3];//默认值为null System.out.println(s_arr[0]); System.out.println("------cut line------"); //3.二维数组初始化与赋值 //3.1 静态初始化 int[][] arr4 = new int[][]{{1,2,3},{1,2,3,4},{1,2}};//表示方法1 int[] arr5[] = {{1,2,3},{1,2,3,4},{1,2}};//表示方法2 int arr6[][] = {{1,2,3},{1,2,3,4},{1,2}};//表示反法3 System.out.println(arr4);//打印二维数组地址 System.out.println(arr4[0]);//打印二维数组中的其中一个一维数组地址值 System.out.println(arr4[0][0]+arr4[0][1]+arr4[0][2]); //3.2 动态初始化 int[][] arr7 = new int[3][3]; arr7[0][0] = 1; arr7[1][1] = 2; arr7[2][2] = 3; for (int i = 0; i < arr7.length; i++) {//数组遍历 for (int j = 0; j < arr7[i].length; j++) { System.out.print(arr7[i][j]); } } System.out.println(); int[][] arr8 = new int[3][]; System.out.println(arr8.length);//二维数组中一维数组数 //System.out.println(arr8[0].length);//二维数组中的一个一维数组中元素个数数,此处因后一个值为空,故此代码不可执行 System.out.println("------cut line------"); //4.二维数组默认初始化值 //4.1 整型 int[][] ii_arr = new int[4][4]; //4.1.1 外层元素默认初始化值 System.out.println(ii_arr[0]);//地制值 //4.1.2 内层元素默认初始化值 System.out.println(ii_arr[0][0]);//0 //4.2 boolean(布尔)型 boolean[][] bb_arr = new boolean[4][4]; //4.2.1 外层元素默认初始化值 System.out.println(bb_arr[0]);//地制值 //4.2.2 内层元素默认初始化值 System.out.println(bb_arr[0][0]);//false //4.…… System.out.println("------cut line------"); //特别注意 int[][] ii_arr1 = new int[4][]; System.out.println(ii_arr1[0]);//地址 System.out.println(ii_arr1[0][0]);//空指针异常 } }
public class ArrExer02 { public static void main(String[] args){ int[] arr = new int[10];//动态创建数组 for (int i = 0; i < arr.length; i++) {//循环赋值 arr[i] = (int)(Math.random() * (99 - 10 + 1)) + 10;//创建一个0-99的随机数 } //1.数组计算 //1.1 求最大值 int max = arr[0]; for (int i = 0; i < arr.length; i++) { if(max < arr[i]){ max = arr[i]; } } System.out.println("最大值为:" + max); //1.2 求最小值 int min = arr[0]; for (int i = 0; i < arr.length; i++) { if(min > arr[i]){ min = arr[i]; } } System.out.println("最小值为:" + min); //1.3 求总和 int sum = 0; for (int i = 0; i < arr.length; i++) { sum += arr[i]; } System.out.println("总和为:"+sum); //1.4 求平均值 int avgValue = sum / arr.length; System.out.println("平均值为:"+avgValue); //2.数组的赋值、复制 int[] arr1,arr2;//创建两个数组 arr1 = new int[]{2,3,4,5,6,7,8,9}; //2.1 赋值 for (int i = 0; i < arr1.length; i++) { System.out.print(arr1[i] + " "); } arr2 = arr1;//数组1赋值给数组2,可以发现其地址也改变 System.out.println(); System.out.println("数组1地址:" + arr1);//打印数组1的地址 System.out.println("数组1赋值给数组2后数组2地址:" + arr2);//第一次打印数组2的地址 for (int i = 0; i < arr2.length; i++) { if(i % 2 == 0){ arr2[i] = i;//改变数组2中的值 } } for (int i = 0; i < arr1.length; i++) {//打印数组1发现值也被改变 System.out.print(arr1[i] + " "); } System.out.println(); //2.2 复制 arr2 = new int[arr1.length]; for (int i = 0; i < arr2.length; i++) { arr2[i] = arr1[i]; System.out.print(arr2[i] + " "); } System.out.println(); System.out.print("新建空间后数组2地址:" + arr2);//第二次打印数组2的地址 } }
public class ArrExer03 { public static void main(String[] args) { int[] testArr = new int[]{33,5,26,7,28,37,44,65,43,21,8,9}; System.out.print("原数组:"); for (int i = 0; i < testArr.length; i++) { System.out.print(testArr[i] + " "); } System.out.println(); ArrMethod methodArr = new ArrMethod(); //1.数组元素反转 System.out.print("反转操作后数组:"); //methodArr.swapMethod1(testArr); //System.out.println(); methodArr.swapMethod2(testArr);//方法1和2同时执行恢复为原来的顺序 System.out.println(); //2.数组的扩容和缩容 //2.1数组扩容 int[] inputArr = new int[]{111,112,113,114}; System.out.print("扩容后数组:"); methodArr.dilatationArr(testArr,inputArr); System.out.println(); //2.2数组缩容 int deleteIndex = 5; System.out.print("缩容后数组:"); //methodArr.reduceArr1(testArr,deleteIndex); //System.out.println(); methodArr.reduceArr2(testArr,deleteIndex); System.out.println(); //3.数组元素的查找 System.out.print("查找数组数据:"); int findFigure = 44; //3.1线性查找 methodArr.findArr1(testArr,findFigure); System.out.println(); //3.2二分查找 //二分查找必须在有序的数组中才能起效 int[] testArr1 = new int[]{3,5,6,7,9,10,12,15,16,17}; int findFigure1 = 10; methodArr.findArr2(testArr1,findFigure1); System.out.println(); } } class ArrMethod{ public void swapMethod1(int[] arr){//方法1,不新建数组 for (int i = 0; i < arr.length/2; i++) {//此处需要为length/2,否则会变成原来数组顺序 //交换arr[i]与arr[arr.length-1-i]位置的元素 int temp = arr[i]; arr[i] = arr[arr.length-1-i]; arr[arr.length-1-i] = temp; } System.out.println("方法1"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } public void swapMethod2(int[] arr){//方法2,新建数组 int[] newArr = new int[arr.length]; for (int i = 0; i < arr.length; i++) { newArr[i] = arr[arr.length-1-i]; } arr = newArr; System.out.println("方法2:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } public void dilatationArr(int[] arr1,int[] arr2){ int[] newArr = new int[arr1.length * 2];//扩容到原数组2倍 for (int i = 0; i < arr1.length; i++) {//此处不能用newArr的长度,不然会数组越界 newArr[i] = arr1[i]; } for (int i = 0; i < arr2.length; i++) { newArr[arr1.length + i] = arr2[i]; } arr1 = newArr; for (int i = 0; i < arr1.length; i++) { System.out.print(arr1[i] + " "); } } public void reduceArr1(int[] arr,int deleIndex){//方法1,不新建数组,在原数组中删除数组下标 for (int i = deleIndex; i < arr.length - 1; i++) { arr[i] = arr[i + 1]; } //修改最后一个元素,设置为默认值 arr[arr.length - 1] = 0; for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } public void reduceArr2(int[] arr,int deleIndex){//方法2,新建数组 int[] newArr = new int[arr.length-1]; for (int i = 0; i < deleIndex; i++) { newArr[i] = arr[i]; } for (int i = deleIndex; i < newArr.length; i++) {//此处newArr.length也可换为arr.length-1 newArr[i] = arr[i+1]; } arr = newArr; for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } public void findArr1(int[] arr,int target){ boolean isFlag = true; for (int i = 0; i < arr.length; i++) { if(target == arr[i]){ System.out.print("找到" + target + ",对应位置为:" + i); isFlag = false; break; } } if(isFlag){//或将isFlag替换为 i==arr.length System.out.print("未找到此元素:"); } } public void findArr2(int[] arr,int target){ int head = 0,end = arr.length-1; boolean isFlag = true; while(head <= end){ int middle = head + end; if(target == arr[middle]){ System.out.print("找到元素" + target + ",对应位置为:" + middle); isFlag = false; break; }else if(target < arr[middle]){ end = middle - 1; }else{//target > arr[middle] head = middle +1; } } if(isFlag){//或将isFlag替换为head > end System.out.print("未找到该元素"); } } }
为什
int[ ]
的数组可以直接打印出数值,而Animal[ ]
的数组必须调用方法才能打印出结果?
解答:
基本数据类型数组的数组元素依然是基本数据类型,所以当定义int[] i_arr = new int[2]
时候,通过打印可得到i_arr[0] = 0
;
引用类型数组的数组元素依然是引用数据类型,需要使用new分配空间,不存储对象值,只保留指向对象的地址,所以打印引用数据类型打印出的就是地址值(见**二**==>**2.2**)
public class Animal { String name; public Animal(){} public Animal(String name){ this.name = name; } public String getName(){ return name; } } class AnimalTest{ public static void main(String[] args) { Animal animal = new Animal(); System.out.println("引用地址" + animal); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。