目录
要求:n2 的变化,不会影响到n1的值(这个练习的下一条练习题,刚与此相反)
要求:下面通过代码输出 ,arr 2 的变化会影响到 arr1
要求:将int[] arr1={10,20,30};拷贝到arr2数组
数组赋值机制1
基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
练习1:
基本数据类型赋值,赋值方式为值拷贝
要求:n2 的变化,不会影响到n1的值(这个练习的下一条练习题,刚与此相反)
int n1=10;
int n2=n1;
n2=80;
System.out.println("n1="+n1);
System.out.println("n2="+n2);
结果:
数组赋值机制2
数组在默认情况下是引用传递,赋的值是地址,赋值方式为引用赋值,是一个地址,arr2变化会影响到arr1
练习1 :
先看看没有被影响之前的代码:
代码实现:
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;//把arr1赋给arr2
//arr2[0] = 10;
//看看arr1的值
System.out.println("====arr1的元素======");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
结果:
练习2:
要求:下面通过代码输出 ,arr 2 的变化会影响到 arr1
代码实现:
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;//把arr1赋给arr2
arr2[0] = 10;
//看看arr1的值
System.out.println("====arr1的元素======");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("======arr2的元素======");
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
结果:
数组拷贝:编写代码,实现数组拷贝(内容复制)
练习1:
要求:将int[] arr1={10,20,30};拷贝到arr2数组
编程思想:
创建一个新的数组arr2 ,开辟新的数据空间
大小 arr1.length;遍历arr1 ,把每个元素拷贝到arr2对应的元素位置
代码实现:
int[] arr1={10,20,30};
//创建一个新的数组arr2 ,开辟新的数据空间
//大小 arr1.length;
int[] arr2=new int[arr1.length];
//遍历arr1 ,把每个元素拷贝到arr2对应的元素位置
for (int i=0;i<arr1.length;i++){
arr2[i]=arr1[i];
}
//修改arr2
arr2[0]=100;
//输出arr1
System.out.println("====arr1的元素======");
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println("======arr2的元素======");
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
结果:
数组反转
练习1:通过找规律进行反转
要求:把数组的元素内容反转
编程思想: 1. 把arr[0]和arr[5] 进行交换{66,22,33,44,55,11} 2. 把arr[1]和arr[4] 进行交换{66,55,33,44,22,11} 3. 把arr[2]和arr[3] 进行交换{66,22,44,33,55,11} 4. 一共要交换3次=arr.length/2 5、 每次交换时,对应的下标是arr[i]和arr[arr.length - 1 - i];
代码实现:
int[] arr = {11, 22, 33, 44, 55, 66};
int temp=0;
int len=arr.length;//计算数组的长度
for (int i = 0; i < len / 2; i++) {
temp = arr[len - 1 - i];//保存
arr[len - 1 - i] = arr[i];
arr[i] = temp;
}
System.out.println("====反转后数组=====");
for (int i=0;i< arr.length;i++){
System.out.println(arr[i]+"\t");
}
结果:
使用逆序赋值方式
练习1:
要求:使用逆序给一个元素赋值
编程思想:
1. 创建一个新的数组 arr2 ,大小 arr.length
2. 逆序遍历arr,将每个元素拷贝到arr2的元素中(顺序拷贝)3.当for 循环结束后,arr2就是一个逆序的数组{66,55 44, 33,22, 11};
4. 让arr指向arr2数据空间,此时arr原来的数据空间就没有变量引用,就会被当作垃圾,销毁5. 输出arr
代码实现:
//定义数组
int[] arr = {11, 22, 33, 44, 55, 66};
//使用逆序赋值方式
//思路
//1. 创先建一个新的数组 arr2 ,大小 arr.length
//2. 逆序遍历arr,将每个元素拷贝到arr2的元素中(顺序拷贝)
int[] arr2=new int[arr.length];
for (int i=arr.length-1,j=0;i>=0;i--,j++){
arr2[j]=arr[i];
}
//3.当for 循环结束后,arr2就是一个逆序的数组{66,55 44, 33,22, 11};
//4. 让arr指向arr2数据空间,此时arr原来的数据空间就没有变量引用,就会被当作垃圾,销毁
arr=arr2;
System.out.println("====arr的元素情况======");
//5. 输出arr看看
for (int i=0;i< arr.length;i++){
System.out.println(arr[i]+"\t");
}
结果:
练习2:
要求: 实现动态的给数组添加元素效果,实现对数组扩容。
1. 原始数组使用静态分配int[] arr ={1,2,3}
2.增加的元素4,直接放在数组的最后arr={1,2,3,4}
3. 用户可以通过如下的方法来决定是否继续添加,添加成功,是否继续?y/n
编程思想:
1. 定义初始数组int[] arr={1,2,3} arr[3]=4 //NO,这样会导致报错,数组越界异常 2, 定义一个新的数组 int[] arrNew=new int[arr.length+1]; 3, 遍历arr数组,依次将arr的元素拷贝到arrNew数组 4. 将4赋给 arrNew[arrNew.length-1]=4; 把4赋给arrNew最后一个元素 5. 让arr指向arrNew;arr=arrNew;那么原来arr数组就被销毁 6. 创建一个Scanner 可以接受用户输入 7. 因为用户什么时候退出,不确定,老师使用do……while ——break来控制
代码实现:
Scanner myScanner = new Scanner(System.in);
//1、初始化数组
int[] arr={1,2,3};
//2、定义一个数组
do {
int[] arrNew=new int[arr.length+1];
//3、遍历arr数组,依次将arr 的元素拷贝到arrNew数组
for (int i=0;i<arr.length;i++){
arrNew[i]=arr[i];
}
System.out.println("请输入你要添加的元素");
int addNum=myScanner.nextInt();
//4、
arrNew[arrNew.length-1]=addNum;
//5.
arr=arrNew;
//输出arr 看看效果
System.out.println("=======arr 扩容后元素情况=======");
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]+"\t");
}
//问用户是否继续
System.out.println("是否继续添加y/n");
char key=myScanner.next().charAt(0);
if (key=='n'){
break;
}
}while (true);
System.out.println("你退出了添加……");
结果: