数组Array的相关知识整理
数组:是一种容器,可以同时存放多个数据值。
数组的特点
1,数组是一种引用数据类型
2,数组当中的多个数据,类型 必须统一
在数组刚开始定义的时候,就要你确定往数组里面存的是什么样的数据类型。确定了 int 就不能把一个3.1存到数组里
3,数据的长度在程序运行期间不可改变
数组在刚开始创建的时候,我规定了只能存10个数,那么后面在使用的时候,最多只能存10个
数组(Array)的初始化,在内存当中创建一个数组,并且向其中赋予一个默认值
两种常见的初始化方式
1动态初始化(指定长度) 数据类型[] 数组名称 = new 数据类型[数组长度];
2静态初始化(指定内容) 数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,..};
静态初始化省略格式 数据类型[] 数组名称 = {元素1,元素2,..};
new:关键字在jvm里面的作用:确定数组的类型和 长度。
这种定义格式:不知道存储的数据,但是我知道要存储几个。
解析含义:
左侧数据类型,也就是数组当中保存的数据全部都是统一的类型
左侧的中括号,代表我是一个数组
左侧数组名称,给数组取一个名字
右侧的new,代表创建数组的动作
右侧数据类型必须和左边的数据类型保持一致
右侧中括号的长度,也就是数组当中,到底可以保存多少个数据是一个int数字
区别:
动态初始化(指定长度):在创建数组的时候,直接指定数组当中的数据元素个数
静态初始化(指定内容):在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定
注意事项:1-虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出来长度
2-静态初始化标准格式可以拆分成为两个步骤
3-动态初始化也可以拆分成两个步骤
4-静态初始化一旦使用省略格式,就不能拆分成两个步骤了
使用建议
如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化
直接打印数组名称,得到的是数组对应的:内存地址哈希值
二进制:01
十进制:0123456789
十六进制:0123456789abcdef
访问数组元素的格式:数组名称[索引值];
索引值:就是一个int数字。代表数组当中元素的编号。
【注意!!!】索引值从0开始,一直到“数组的长度-1”为止
例如打印数组的第一个元素
System.out.println(Array[0]);
例如元素赋值给一个变量
int snum = Array[1];
System/out.println(num);
由此得出:可以直接打印出数组当中的元素
也可以将数组当中的某一个单个元素,赋值交给变量。
访问数组元素进行赋值
int [] arr = new int[3];
//1,如何获取数组中的每一个元素
int i = arr[0];
//2.如果给数组中的每一个元素进行赋值
arr[0] = 10;
动态初始化数组
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值,规则如下
如果是整数类型,那么默认为0
如果是浮点类型,那么默认为0.0
如果是字符类型,那么默认为‘\u0000’
如果是布尔类型,那么默认为FALSE
如果是引用类型,那么默认为null
注意事项:
静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值
案例-静态初始化数据格式
int[] array = newint[]{10,11,12};
array[0]=18;
int i = array[0];
System.out.println(array[0]);
案例-数组的遍历输出:int [] arr = newint[]{10,11,12,77,6};
for (int i=0;i <arr.length;i++){
System.out.println(arr[i]);
}
数组遍历的快捷键:array.fori--回车
遍历:是一个专业的称呼。
实际的操作:就是把一个容器里面所有的元素一一的都获取出来。
在idea中遍历的快捷键 : arr.fori + 回车
如果上面已经定义了i这个变量
1,那么在自动生成了循环之后,不要进行其他任何操作,可以直接修改变量名。
2,如果已经进行了其他操作,还要再进行修改变量,可以按批量修改变量名的快捷键(shift + f6 / shift + fn + f6) //只要是使用了这个变量的地方,那么都会随之改变。
求出数组中的最值
"求最值,一定要设置一个参照物。"
" int max = arr [0];"
" 参照物一定要是在数组中存在的元素。"
int max = -1; //参照物一定要是数组中的元素,建议直接使用0索引上的。
-6 , -7 , -2 , -3 , -4 , -5 最大值
JAVA中的内存划分
JAVA的内存需要划分成为5个部分
1.栈(Stack):存放的都是方法中的局部变量
局部变量:方法的参数,或者是方法{}内部的变量
作用域:一旦超出作用域,立刻从栈内存中消失
2.堆(Heap):凡是NEW出来的东西,都在堆当中
堆内存里面的东西都有一个地址值:16进制
堆内存里面的数据,都有默认值。规则:
如果是整数 默认值为0
如果是浮点数 默认值为0.0
如果是字符 默认为‘\u0000’
如果是布尔 默认为false
如果是引用类型 默认为NULL
3.方法区(Method Area):存储class相关信息,包含方法的信息
4.本地方法栈(Native Method Stsck):与操作系统相关--了解
5.寄存器(pc Register):与CPU相关--了解
如何获取数组长度,格式 :数组名称.length
这将会得到一个int数字,代表数组的长度
【注意!】数组一旦创建。程序运行期间,长度不可变
数组索引越界异常
数组的索引编号从0开始,一直到“数组的长度-1”为止
如果访问数组元素的时候。索引编号并不存在,那么将会发生数组索引越界异常ArrayIndexOutOfBoundsException--数组越界异常 原因 索引编号错误
解决办法-修改成为正确存在的编号
记住索引的范围.
最小的索引:0
最大的索引:数组的长度 - 1.
空指针异常
所有的引用类型变量,都可以赋值为一个null值,但是代表其中什么都没有。
数组必须进行new初始化才能使用其中的元素
如果只是赋值了一个null,没有进行new创建
那么将会发生空指针异常NullPointerException
原因:忘了new
解决:补上new
null 可以赋值给所有的引用数据类型。
null 是所有的引用数据类型的默认初始化值。
目前为止引用数据类型: String (字符串) Array(数组)
String s = null;
int [] arr = null;
//但是如果这么定于了,那么s和arr的变量记录的值就是null
//切记不要使用s和arr的变量。
//如果一定要用,只能先给s和arr进行赋值。
//直接使用null那么就会报空指针异常。
//注意:
有的时候,必须要用。
1,我要在一个if判断里面创建一个数组。
在判断结束之后,我还想使用这个数组。
if(判断表达式){
int [] arr = new int[10];
}
//使用arr。不能用。
//因为这样定义,arr是一个局部变量。超出大括号所在的范围就无法使用了。
//如果我一定要在if的外面使用数组。
int a = 10;
int [] arr = null; //先给arr赋一个引用数据类型的默认初始化值
if(a == a){
arr = new int[10];
}
//使用arr
System.out.println(arr);
2. //创建一个字符串类型的数组
String [] arrStr = newString[3];//引用数据类型默认初始化值就是null
//这种情况下,如果没有赋值,那么所有的都是null
案例--求出数组中的最值: public static void main(String[]args) {
int [] array = newint[]{22,333,99,444};
int max = array[0];
for (int i =0;i<array.length;i++){
if (array[i]>max){
max = array[i];
}
}System.out.println(max);}
数组元素反转:初始化语句:int min = 0;max = array.length-1
条件判断:min < max
步进表达式:min++,max--;
循环体:用第三个变量倒手
1,当数组的长度为奇数和偶数的时候。 是不需要。
当数组的长度为偶数的时候。 min>max
当数组的长度为奇数的时候。 min=max
数组反转其实就对称位置的元素交换
用第三个变量倒手
现在表示两个位置的是两个索引
是对称位置的元素交换
两个索引值min<max时进行交换
实例-数组反转: public static void main(String[] args) {
int[] array=new int[]{1,2,3,4};
for (intmin=0,max=array.length-1;min<max;min++,max--){
int temp = array[min];
array[min]=array[max];
array[max]=temp;
}//反转
for (int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
数组作为方法参数传递地址:数组作为参数进行传递的时候,实际上就是把数组的地址值传递到方法中了。
"基本数据类型作为参数传递的时候,不会改变自己本身。"
引用数据类型作为参数传递的时候,会改变自己本身
三要素:
返回值类型:只是进行打印而已,不需要进行计算,也没有结果,用void
方法名称:printArray
参数列表:必须给我数组,我才能打印其中元素。Int[] array
数组可以作为方法的参数
当调用方法的时候像方法的小括号进行传参,传递进去的其实是数组的地址值
实例--数组作为方法参数: public static void main(String[]args){
int[] array={12,13,14,15};
printArray(array);
}
public static void printArray(int[] array) {
for (int i = 0 ; i <array.length;i++){
System.out.println(array[i]);
}
}
数组作为方法返回值-返回地址
一个方法可以有0、1 多个参数,但只能有0或1个返回值,不能有多个返回值
如果希望一个方法当中产生了多个结果数据进行返回,使用一个数组作为返回值即可
任何数据类型都能作为方法的参数类型或者返回值类型
数组作为方法的参数,传递进去的其实是数组的地址值
数组作为方法的返回值其实也是地址值
什么时候用:
当我们需要把一堆数据一起进行返回的时候。
我们可以把这些数据都放在一个数组中。
将这个数组返回。