数组
索引
int[] arr = {0, 1, 2, 3, 4};
System.out.println(arr);//[I@f6f4d33
地址符:
[ :表示当前是一个数组
I :表示当前数组里边的元素类型为int
@ :表示一个间隔符号
6f4d33 :16进制的数组 ‘地址值’
int len = arr.length; //获取数组长度
int[] arr = new int [3]; //格式:数据类型[] = new 数据类型[数组长度]
数组默认动态初始化值:
整数类型: 0;
浮点数类型: 0.0;
字符类型: ‘/u000’ (空格)
布尔类型: false
引用数据类型: none
Java内存分配
栈:方法运行时使用的内存,比如main方法运行,进入方法栈中运行。
堆:存储对象或数组,new来创建的,都存储在堆内存
方法区:存储可以运行的class文件
本地方法栈: JVM在使用操作系统的时候使用,和开发无关
寄存器:给CPU使用,和开发无关
- 当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生了改变,那么其他数组再次询问的时候都是修改后的结果了。例如:
public static void main(String[] args){
int[] arr1 = {11.22};
int[] arr2 = arr1;//此时arr2与arr1共用一个内存
sout(arr1[0]); //11
sout(arr2[0]); //11
arr2[0] = 33;
sout(arr1[0]); //33
sout(arr2[0]); //33
}
方法
方法是程序运行的最小执行单元(类似于c中的函数)
经典例题:
需求:定义一个方法copyOfRange(int[] arr, int from ,int to)
功能:将数组arr从索引from(包含)开始,到索引to(不包含)的元素复制带一个新的数组中,将新数组返回
package test;
import java.util.Arrays;
import java.util.Scanner;
public class method_test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = {1,2,3,4,5};
int[] num = copyOfRange(arr,0,4);
//打印新数组num的元素
System.out.println(Arrays.toString(num));
}
public static int[] copyOfRange(int[] arr, int from, int to){
//设置数组长度为 from - to
int[] num = new int [to - from];
for (int i = from; i < to; i++){
num[i-from] = arr[i];
}
return num;
}
}
- 传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值
public class method_test {
public static void main(String[] args) {
int num = 100;
System.out.println("调用change方法前" + num); //100
change(num);
System.out.println("调用change方法后" + num); //100
}
public static void change(int num){
num = 200;
}
}
上述代码并未改变number的值,因为方法change()与方法main()存储在栈内存中,两个num并不一样.
- 传递引用数据类型时,传递的是地址,形参的该百年,影响实际参数的值
public class method_test {
public static void main(String[] args) {
int[] arr = {10, 20, 30};
System.out.println("调用change方法前" + arr[0]); //10;
change(arr);
System.out.println("调用change方法后" + arr[0]); //1000;
}
public static void change(int[] arr){
arr[0] = 1000;
}
}
上述代码中 arr 数组的值发生了改变,原因是数组属于引用数据类型,其引用(内存地址)存储在栈内存中,而实际数据存储在堆内存中。main 方法与 change 方法共享同一个数组引用(即指向堆内存中同一个数组对象),因此在 change 方法中对数组内容的修改会影响到 main 方法中访问该数组时的结果