数组的四种拷贝方式
一丶for循环拷贝
public class Demo1 {
private int val = 10;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return this.val;
}
public static void main3(String[] args) {
TestArray[] t1 = new TestArray[4];
t1[0] = new TestArray();
t1[1] = new TestArray();
t1[2] = new TestArray();
t1[3] = new TestArray();
TestArray[] t2 = new TestArray[4];//t2[0]
for(int i = 0;i < t1.length;i++) {
t2[i] = t1[i];
}
for(int i = 0;i < t1.length;i++) {
System.out.print(t1[i].getVal()+" ");
}
System.out.println();
for(int i = 0;i < t2.length;i++) {
System.out.print(t2[i].getVal()+" ");
}
System.out.println();
t2[0].setVal(100000);
System.out.println("===============");
for(int i = 0;i < t1.length;i++) {
System.out.print(t1[i].getVal()+" ");
}
System.out.println();
for(int i = 0;i < t2.length;i++) {
System.out.print(t2[i].getVal()+" ");
}
}
输出结果:
for循环对于引用数据类型来说是浅拷贝,当改变t2数组的第一个值时,t1数组的值也会跟着改变
二丶clone拷贝数组
public class Demo2 {
private int val = 10;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return this.val;
}
public static void main(String[] args) {
TestArray[] t1 = new TestArray[4];
t1[0] = new TestArray();
t1[1] = new TestArray();
t1[2] = new TestArray();
t1[3] = new TestArray();
TestArray[] t2 = t1.clone();//t2[0]
for (int i = 0; i < t1.length; i++) {
System.out.print(t1[i].getVal() + " ");
}
System.out.println();
for (int i = 0; i < t2.length; i++) {
System.out.print(t2[i].getVal() + " ");
}
System.out.println();
t2[0].setVal(100000);
System.out.println("===============");
for (int i = 0; i < t1.length; i++) {
System.out.print(t1[i].getVal() + " ");
}
System.out.println();
for (int i = 0; i < t2.length; i++) {
System.out.print(t2[i].getVal() + " ");
}
}
}
输出结果:
clone拷贝也属于浅拷贝,当改变t2的第一个值时,t1的第一个值也会改变
三丶System.arraycopy()拷贝
public class Demo3 {
private int val = 10;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return this.val;
}
public static void main7(String[] args) {
TestArray[] t1 = new TestArray[4];
t1[0] = new TestArray();
t1[1] = new TestArray();
t1[2] = new TestArray();
t1[3] = new TestArray();
TestArray[] t2 = new TestArray[4];//t2[0]
System.arraycopy(t1,0,t2,0,t1.length);
for(int i = 0;i < t1.length;i++) {
System.out.print(t1[i].getVal()+" ");
}
System.out.println();
for(int i = 0;i < t2.length;i++) {
System.out.print(t2[i].getVal()+" ");
}
System.out.println();
t2[0].setVal(100000);
System.out.println("===============");
for(int i = 0;i < t1.length;i++) {
System.out.print(t1[i].getVal()+" ");
}
System.out.println();
for(int i = 0;i < t2.length;i++) {
System.out.print(t2[i].getVal()+" ");
}
}
输出结果:
System.arraycopy()属于native方法,运算速度快,且属于浅拷贝,t1和t2中的元素在堆上指向同一个地址,当改变t2中第一个元素的值时,t1中第一个元素的值也会改变。
四丶Arrays.copyOf()拷贝
public class Demo4 {
private int val = 10;
public void setVal(int val) {
this.val = val;
}
public int getVal() {
return this.val;
}
public static void main(String[] args) {
TestArray[] t1 = new TestArray[4];
t1[0] = new TestArray();
t1[1] = new TestArray();
t1[2] = new TestArray();
t1[3] = new TestArray();
TestArray[] t2 = Arrays.copyOf(t1,t1.length);
for(int i = 0;i < t1.length;i++) {
System.out.print(t1[i].getVal()+" ");
}
System.out.println();
for(int i = 0;i < t2.length;i++) {
System.out.print(t2[i].getVal()+" ");
}
System.out.println();
t2[0].setVal(100000);
System.out.println("===============");
for(int i = 0;i < t1.length;i++) {
System.out.print(t1[i].getVal()+" ");
}
System.out.println();
for(int i = 0;i < t2.length;i++) {
System.out.print(t2[i].getVal()+" ");
}
}
输出结果:
Arrays.copyOf()方法的底层代码调用了System.arraycopy()方法,故而原理相同,当改变t2中第一个元素的值时,t1中第一个元素的值也会改变。
将基数放在偶数前面,大小顺序不要求
public static void jOArray(int[] array) {
int temp = array[array.length - 1]; //定义一个temp,值为数组最后一个元素
int left = 0;
int right = array.length - 1;
while (left < right && array[left] % 2 == 1) {//array[left]为基数时
left++;
array[right] = array[left];//将array[left]赋值给arra[right]
}
while (left < right && array[right] % 2 == 0) {//arra[right]为偶数时
right--;
array[left] = array[right];//将array[right]赋值给array[left]
}
array[left] = temp;
}
输出结果:
一个数组是有序的,给定一个数字key,有两个数字加起来等于key,找到这两个数字的下标
public static void search(int[] array1, int key) {
int i = 0;
int j = array1.length-1;
while (i<j) {//当i小于j时
if(array1[i] + array1[j] == key){//如果array1[i] + array1[j] == key
System.out.println("所求数字下标为 "+i+" "+j);//输出满足条件的数字下标
i++;
}else if (array1[i] + array1[j] < key){当array1[i] + array1[j] 小于key时
i++;
}else {//当array1[i] + array1[j]大于key时
j--;
}
}
}
一个整型数组,除了两个数字只出现一次外,其它数字都是两次,找到这两个数字
在这里插入代码片
熟悉Arrrays这个类里面的方法
1丶如何排序数组并插入某个元素?
public static void Insert(int [] array,int x) {
Arrays.sort(array);//对原数组进行排序
int[] array1 = new int[array.length+1];//定义一个比原数组长度多1的数组
System.arraycopy(array,0,array1,0,array.length);//将原数组拷贝到新数组中
int insetIndex = 0;
for (int i = 0; i < array1.length; i++) {
if(x < array1[i]){ //当x<array1[i]时进入
insetIndex = i;//将找到的第一个比x大的值得下标赋给insetIndex
break;//终止这个循环
}
}
for (int i = array1.length-1; i > insetIndex ; i--) {
array1[i] = array1[i-1];//将insetIndex后的值后移一位
}
array1[insetIndex] = x;
System.out.println(Arrays.toString(array1));
}
2丶如何搜索数组中的最小值和最大值?
public static void minMax(int[] a) {
int min = Arrays.stream(a).min().getAsInt();
int max = Arrays.stream(a).max().getAsInt();
System.out.println(min);
System.out.println(max);
3丶如何合并两个数组?
public static void merge(int[] b,int[] c,int[] result){
System.arraycopy(b,0,result,0,b.length);
System.arraycopy(c,0,result,b.length,c.length);
System.out.println(Arrays.toString(result));
4丶如何填充数组(一次填充,部分填充)?
public class TestDemo {
public static void main(String[] args) {
int[] a = new int[15];
Arrays.fill(a, 20);
System.out.println(Arrays.toString(a));
int[] b = new int[10];
Arrays.fill(b, 0, 5, 15);
System.out.println(Arrays.toString(b));
}
}
5丶如何删除数组中的指定元素?
public static void deletNumber(int[]a,int n){
Arrays.sort(a);//对原数组排序
System.out.println(Arrays.toString(a));
int[] arr = new int[a.length-1];
for (int i = 0 ;i<a.length-1;i++){
if (i<n){
arr[i] = a[i];//当i<n时,将a[i]赋值给arr[i]
}
else{
arr[i] = a[i+1];//将a[i+1]赋值给arr[i]
}
}
System.out.println(Arrays.toString(arr));//打印arr数组
}
6丶如何从数组中查找常见元素?
public static void search(int[] array1,int key){
int temp = Arrays.binarySearch(array1,key);
System.out.println(temp);