数组的基本知识点
数组
定义: 相同类型数据的集合。数组的内存是连续的
创建数组:
数据类型[ ]数组名称={初始化数据};
数据类型[ ]数组名称=new 数据类型[ ]{初始化数据};
数据类型[ ]数组名称=new 数据类型[数组长度];
int[] array1={1,2,3,4,5};//默认new(静态初始化)
int[] array2=new int[]{1,2,3,4,5};//1和2是不能在[]中写出长度,若想得到数组长度,array1.length(数组名.length不是方法,是数组的属性)
int[] array3=new int[5];
//New产生一个对象
数组名可以通过引用 来将数组传入函数中
“引用”:用来存放对象的地址
使用:
- 使用arr.length能够获取数组长度,.这个操作为成员访问操作。
- 使用[ ]按下标取数组元素,下标从0开始。
- 使用[ ]操作能读取数据也能修改数据。
- 下标访问操作不能超出有效范围[0,length-1],如果超出有效范围,会出现下标越界异常
注意:
- 当数组越界之后,报错:java.lang.ArrayIndexOutOfBoundException(数组越界异常)(属于运行异常)
- 数组名.length:数组的长度。length不是方法,是一个的属性
- for循环和foreach之间的区别
for循环:
for(表达式1;表达式2;表达式3){
循环体;
}
for(int x=0;x<array1.length;x++){
;
}
foreach:
for(表达式1:表达式2){
循环体;
}//表达式1为数组类型,表达式2为数组名
for(int x:array1){
循环体;
}
//所以foreach中,不能用下标进行访问数组
- 当定义好数组之后,没有初始化,则数组元素默认为0;若是引用类型则默认为null
- 按值传递:
int x=1;
int y=2;
printf("x="+x+"y="+y);
func1(x,y);
printf("x="+x+"y="+y);
public static void(int x,int y){
int temp;
temp=x;
x=y;
y=temp;
}//按值传递只改变形参的数值,不改变实参
按引用传递:
int[] array1={1,2,3,4,5};
printf(array1[0]);
func2(array1);
print(array1[0]);
public static void func2(int[] array){
array[0]=99;
}//array1中存储的是数组array1首元素1的地址,传引用进函数
/*函数中array为array1开辟一块内存,存储array1中的值,也就是array存储的是array1中首元素的地址,所以可以通过函数修改主函数中数组的值。
按引用传递本质也是按值传递*/
Java当中数组的内存分析:
数组在堆上存储,而不是像C语言一样在栈上存储
JVM上的存储:
java虚拟机栈: 存放局部变量
本地方法栈: native方法,底层由c/c++实现,特点:速度快
Native 方法: JVM 是一个基于 C++ 实现的程序. 在 Java 程序执行过程中, 本质上也需要调用 C++ 提供的一些函数进行和操作 系统底层进行一些交互. 因此在 Java 开发中也会调用到一些 C++ 实现的函数. 这里的native方法
程序计数器: 存放指令
堆: 存放通过new关键字,新建出的对象
方法区: 常量final 静态常量 类的信息
常量池: 存放字符串常量与符号引用。
在jdk1.7之前,常量池在方法区
在jdk1.7开始,常量池被挪到了堆当中
int[] array={}//数组长度为0;
Main(){
int[] array={1,2,3,4,5};
System.out.print(array);
}
//输出结果[I@16d3586 :地址的哈希码
//这个地址是通过真实地址哈希过的;
Main(){
int[] array=null;
System.out.print(array.length);
}
//结果报错:Java.lang.NullPointerException
Java.lang.NullPointerException:空指针异样数组名。