数组
数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。即:数组就是一组数据。
使用方法
使用方式1:动态初始化
使用方式2:动态初始化
使用方式3:静态初始化
注意事项
数组赋值机制
值传递 VS 引用传递
jvm的内存:栈+堆+方法区。
有这样一段代码:
int n1 = 10;
int n2 = n1;
将10赋值给n1,是在栈中赋值(因为是基本数据类型)。
将n1的值赋值给n2,就是把n1中的10复制给n2.
那么,之后对n2的值进行修改,与n1无关,这就是值传递。
又有这样一段代码:
int[] arr1 = {1,2,3};
int[] arr2 = arr1;
arr2[0] = 10;
对arr1赋值,其实是arr1 指向一个地址 ,这个地址在堆里面,这个地址的第1个元素(索引0)是1,第2个是2,第3个是3.
因此arr1[0]就会访问到第1个元素1,arr1[1]就会访问到第2个元素2…
如图:
那么,arr2=arr1的操作其实是把arr1所指向的地址拷贝一份,也就是说arr2和arr1指向同一份地址。
如图:
因此改变arr2[0]的值,其实就是改变arr2所指向的地址的第一个元素的值,那么arr1[0]的值也会变化。
这就是引用传递。
可以运行一下代码试试:
public static void main(String[] args)
{
int[] arr1 = {1,2,3};
int[] arr2 = arr1;
arr2[0] = 10;
System.out.println(arr1[0]);
}
数组拷贝(内容复制)
要求数据空间是独立的。
这样就行了:
public static void main(String[] args)
{
int[] arr1 = {1,2,3};
int[] arr2 = new int[arr1.length];
for(int i = 0;i < arr1.length; i++)
{
arr2[i] = arr1[i];
}
}
数组添加
要求:实现动态的给数组添加元素效果,实现对数组扩容。
步骤:
- 创建更大的数组,赋值
- 让旧数组指向新数组
public static void main(String[] args)
{
int[] arr1 = {1,2,3};
int[] arr2 = new int[arr1.length+1];
for(int i = 0;i < arr1.length; i++)
{
arr2[i] = arr1[i];
}
arr2[arr2.length-1]=4;
arr1 = arr2;
for(int i = 0;i < arr1.length; i++)
{
System.out.println(arr1[i]);
}
}