数组:一组连续的存储空间,能存储多个相同类型的值。
声明数组的方式:
方式一:先声明,后初始长度
数据类型[] 数组名;
数组名 = new 数据类型[数组长度];
方式二:
数据类型[] 数组名 = new 数据类型[数组长度];
方式三:在创建的同时,初始化元素值
数据类型[] 数组名 = new 数据类型[]{元素值1.....};
方式四:
数据类型[] 数组名 = {元素值1....};
int[] a = new int[5];
特点:
长度是固定的
数据类型是相同的
数组的下标:
数组的下标:也叫角标或者索引 index 是数组连续空间的一个别名。
从0 下标开始表示第一个,一个数组的最大下标,是数组长度-1
数组的访问(赋值或取值) 格式: 数组名[下标]
特别注意:数组的下标从0开始
数组的异常:
当访问数组时,如果角标超过数组的边界,
会报角标越界异常 "ArrayIndexOutOfBoundsException";
数组的遍历:
//取值 for遍历数组
数组名.length 可以动态的获得数组长度
for(int i =0;i<arr1.length;i++){
System.out.println(arr[i]);
}
数组扩容:
创建数组时,必须显示指定长度,并在创建之后不可更改长度
扩容思路:
创建大于原数组长度的新数组
将原数组中的元素依次复制到新数组中
方式:
①遍历将原数组中所有元素逐一赋值给新数组
②System.arraycopy(原数组,原数组起始,新数组,新数组起始,长度)
③java.util.Arrays.copyOf(原数组,新长度); //返回带有原值的新数组
内存结构前瞻:
内存初探:分为
栈:
基本数据类型
作为参数,只是传递的值(该值的副本),不影响原数值
堆:
引用数据类型
作为参数,传递的是地址值,此时操作的就是同一个堆中的对象,会影响原数值
排序:
冒泡排序:相邻的两元素比较大小(如果前元素大于后元素就交换位置),每次都会把比较后
的最大值落在后面
public class TestMaoPao {
public static void main(String[] args) {
//冒泡排序
int[] arr = {2,1,4,3,5,6};
for(int i = 0;i<arr.length-1;i++){ //趟数
for(int j = 0;j<arr.length-i-1;j++){ //每次对比可以减少一次排好的
if(arr[j]>arr[j+1]){
int a = 0;
a = arr[j];
arr[j] = arr[j+1];
arr[j+1] = a;
}
}
}
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}
数组类型的返回值:
public static void main(String[] args) {
int[] a = {11,22,33,44,55};
int[] b = expand(a);
for(int i = 0;i<b.length;i++){
System.out.print(b[i]+"\t");
}
}
public static int[] expand(int[] oldArray){
int[] newArray = new int[oldArray.length * 2];
for(int i = 0;i<oldArray.length;i++){
newArray[i] = oldArray[i];
}
return newArray;
}
可变长参数:
概念:可接收多个同类型实参,个数不限,使用方式与数组相同
语法:数据类型... 形参名 //必须定义在形参列表的最后,且只能有一个
示例:
public static void printArray(int... oneArray){
//方法体
}
二维数组:
概念:一维数组中的一维数组,数组中的元素还是数组
特点:
对二维数组来说,表示出来就是行和列。
二维数组中访问元素 数组名[行下标][列下标]
扩展:
三维数组
int[][][] arr = {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}};
//三维数组 数组里面存数组2,数组2里面存数组3