数组
数组概念
- 数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
- 数组既可以存储基本数据类型,也可以存储引用数据类型。
定义格式
- 格式1:数据类型[] 数组名;
- 格式2:数据类型 数组名[];
数组的初始化
动态初始化:初始化时只指定长度,由系统分配没默认值
数据类型[] 数组名 = new 数据类型[数组长度]
数组长度是数组的元素个数
例如;
int[] num = new int[];
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
数据类型[] 数组名 = new 数据类型[数组长度] {元素1,元素2,..........}
数据类型[] 数组名 = {元素1,元素2,..........}
例如;
//数据类型[] 数组名 = new 数据类型[数组长度] {元素1,元素2,..........} int[] num = new int[]{1,2,3}; //数据类型[] 数组名 = {元素1,元素2,..........} int[] num = {1,2,3}
注意不能动静结合(要么动态创建,要么静态创建)
int[] num = new int[3]{1,2,3};这是错误的
数组的异常
- 数组角标越界异常:ArrayIndexOutOfBoundsException
出现的原因:访问了数组中不存在的索引值,索引值是非法!(大于或者等于数组长度,索引值为负)
解决方案:及时检查错误,然后更新代码!class ArrayTest{ public static void main(String[] args){ //创建一个数组,静态初始化 int[] arr = {1,2,3} ; System.out.println(arr[0]) ; System.out.println(arr[1]) ; System.out.println(arr[2]) ; System.out.println(arr[4]) ; //编译不会报错,jvm 检查java语法没问题 } }
- 数组是引用类型,引用类型的默认值是null(空对象),
空指针异常:NullPointerException
出现的原因:
1)在数组中的,数组对象已经为null,还要访问里面的元素
2)在后期可能会使用某些类的功能的时候,但是这个类的对象已经为null了
class ArrayTest{ public static void main(String[] args){ //创建一个数组,静态初始化 int[] arr = {1,2,3} ; System.out.println(arr[0]) ; System.out.println(arr[1]) ; System.out.println(arr[2]) ; //将数组赋值为null arr = null; System.out.println(arr[0]) ; } }
解决方案:(在idea中,使用断点来调试程序!debug)
在某段代码中,如果出现空指针,在使用该对象的时候,进行非空判断!class ArrayTest{ public static void main(String[] args){ //创建一个数组,静态初始化 int[] arr = {1,2,3} ; System.out.println(arr[0]) ; System.out.println(arr[1]) ; System.out.println(arr[2]) ; //将数组赋值为null arr = null; //对arr进行非空判断 if(arr!=null){ System.out.println(arr[0]) ; }else{ System.out.println("数组为null。。") ; } } }
求数组中最大值和最小值
class ArrayTest10{ public static void main(String[] args){ int[] arr = {11,32,22,12,10}; int max = getMax(arr); int min = getMin(arr); System.out.println("最大值为:"+max+", 最小值为:"+min); } public static int getMax(int[] arr){ //假设arr[0]为最大值 int max = arr[0]; //遍历数组 for(int i = 0 ; i < arr.length ; i++){ if(arr[i]>max){ max=arr[i]; } } return max; } public static int getMin(int[] arr){ //假设arr[0]为最小值 int min = arr[0]; //遍历数组 for(int i = 0 ; i < arr.length ; i++){ if(arr[i]<min){ min=arr[i]; } } return min; } }
数组顺序反转
class ArrayTest{ public static void main(String[] args){ int[] arr = {33,2,55,6,1,9}; arrSort(arr); arrShow(arr); } //对数组顺序进行反转 public static void arrSort(int[] arr){ for(int x = 0 ; x < arr.length/2 ; x++){ int temp = arr[x]; arr[x] = arr[arr.length-1-x]; arr[arr.length-1-x] = temp; } } //打印数组 public static void arrShow(int[] arr){ System.out.print("["); for(int x = 0 ; x < arr.length ; x++){ if(x == arr.length-1){ System.out.print(arr[x]+"]"); }else{ System.out.print(arr[x]+", "); } } } }
数组查询对应下标
class ArrayTest{ public static void main(String[] args){ int[] arr = {33,2,55,6,1,9}; int num = 9; int index = arrQuery(arr,num); System.out.println("数组的下标:"+index); } public static int arrQuery(int[] arr,int num){ //找不到输出-1 int index = -1; for(int x = 0 ; x < arr.length ; x++){ if(arr[x] == num){ index = x; break; } } return index; } }
数组冒泡排序
class ArrayTest{ public static void main(String[] args){ int[] arr = {33,2,55,6,1,9}; arrSort(arr); arrShow(arr); } //冒泡排序 public static void arrSort(int[] arr){ for(int x = 0 ; x < arr.length-1 ; x++){ for(int y = 0 ; y < arr.length-1-x ; y++){ if(arr[y]>arr[y+1]){ int temp = arr[y]; arr[y] = arr[y+1]; arr[y+1] = temp; } } } } //打印 public static void arrShow(int[] arr){ System.out.print("["); for(int x = 0 ; x < arr.length ; x++){ if(x == arr.length-1){ System.out.print(arr[x]+"]"); }else{ System.out.print(arr[x]+", "); } } } }
内存分配
创建数组的内存分配
如图int[] arr在栈中创建数组的引用,然后再堆中开辟空间存储数组对象,产生地址值并把地址值赋值给引用
首次创建对象时,类中的静态方法/静态字段首次被访问时,java解释器必须先查找类路径,以定位.class文件;(2)然后载入.class(这将创建一个class对象),有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。(3)当用new XX()创建对象时,首先在堆上为对象分配足够的存储空间。(4)这块存储空间会被清0,这就自动地将对象中的所有基本类型数据都设置成了缺省值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。(5)执行所有出现于字段定义处的初始化动作(非静态对象的初始化)。(6)执行构造器。