👀作者简介:大家好,我是大杉。
🚩🚩 个人主页:爱编程的大杉
支持我:点赞+关注~不迷路🧡🧡🧡
✔系列专栏:javase基础⚡⚡⚡
(❁´◡`❁)励志格言:在我有生之日,生命中所有的灿烂,终将用寂寞偿还。(加西亚·马尔克斯 《百年孤独》)
🤞🤞
文章目录
一.🙌💖数组拷贝四大方法
方法一:for循环逐个拷贝
1.代码展示:
public static int [] copy(int [] arr)
{
int [] array=new int [arr.length];
for (int i = 0; i <arr.length ; i++) {
array[i]=arr[i];
//逐一拷贝
}
return array;
}
public static void main12(String[] args) {
int [] arr={1,2,3,4,5,66};
int [] ret=new int[arr.length];//创建一个同样大小的数组接收
ret=copy(arr);
for (int i = 0; i <ret.length ; i++) {
System.out.println(ret[i]);
}
}
原理剖析
改变拷贝数组中的元素,并不会影响原数组。因为他们指向不同的堆内存
方法二:copy0f函数
代码展示
public static void main13(String[] args) {
int [] arr={1,2,3,4,5,66};
int [] ret= Arrays.copyOf(arr,arr.length);
System.out.println(Arrays.toString(ret));
//Arrays.toString是以字符串的形式输出数组
}
copy0f()源码分析
方法三:System下的arraycopy方法
代码展示
public static void main14(String[] args) {
int [] arr={1,2,3,4,5,66};
int [] ret=new int[arr.length];
//想要拷贝到的数组;
System.arraycopy(arr,0,ret,0,arr.length);
//注意书写顺序
}
源码剖析
方法四:clone()方法
代码展示
public static void main15(String[] args) {
int [] arr={1,2,3,4,5,66};
int [] ret=arr.clone();
//目标数组.clone()
System.out.println(Arrays.toString(ret));
}
二.深拷贝浅拷贝
从大的方面来说,不管是深拷贝还是浅拷贝,都可以统称为浅拷贝。如果更加深入的探析,深拷贝与浅拷贝是有一定区别的
深拷贝
浅拷贝
如何将浅拷贝变成深拷贝?
答:将对象也拷贝一份
三.Arrays中常用方法
1.二分查找Arrays.binarySearch方法
1.二分查找的一般方法
public static int binarysearch(int [] arr, int k) {
int left = 0;
int right = arr.length - 1;
while(left<right) {
int mid = (left + right) >>>1;
//>>>无符号右移相当于除法
if (arr[mid] < k) {
left = mid + 1;
} else if (arr[mid] > k) {
right = mid - 1;
} else {
return mid;
}
}
return -1;
//-1表示找不到
}
public static void main8(String[] args) {
Scanner sc=new Scanner(System.in);
int key=sc.nextInt();
int [] arr={1,2,3,4,5,8};
if(binarysearch(arr,key)==-1) {
System.out.println("查无此数");
}
else
{
System.out.println(binarysearch(arr, key));
}
}
2.用Arrays.binarySearch
//快捷版二分查找;(规定查找范围)
public static void main17(String[] args) {
int [] arr={1,2,3,4,5,66};
//规定范围的二分查找
//fromIdex不写的时候默认从“0”开始;
System.out.println(Arrays.binarySearch(arr,0,5 ,5));
//System.out.println(Arrays.binarySearch(arr, 5));
}
//不规定查找范围,默认全查找
public static void main(String[] args) {
int [] arr={1,4,5,6,7,7,8,};
System.out.println(Arrays.binarySearch(arr, 6));
}
2.Arrays.equals()方法判断数组或字符串是否相等
1.比较数组:
public static void main(String[] args) {
int [] arr={1,4,5,6,7,7,8,};
int [] arr1={1,343,4667,7,8,9};
System.out.println(Arrays.equals(arr, arr1));
//返回值为布尔类型
}
2.比较字符串
public static void main(String[] args) {
String key="faff";
String d="jackdaw";
System.out.println(key.equals(d));
}
3.逆天排序方法Arrays.sort()
1.实例
public static void main(String[] args) {
int [] arr={1,5,4,3,2,6,89,100};
Arrays.sort(arr);
int [] ret=arr;
System.out.println(Arrays.toString(ret));
}
2.错误用法
sort()的方法的类型为void却用int []来接收,就会造成错误
4.数组填充方法Arrays.fill()
1.全部填充/部分填充
四.避坑小tip
1.实例(java与对比)
c语言:int *p=NULL;(表示p指向“0”地址)
java:int [] arr=NULL;(表示p不指向任何堆内存地址)
2.java中打印出来的地址
🔥此处打印出来的地址,是堆上的地址通过哈希表转化而来。并不是真正的堆的地址。但可以认为是堆的地址,因为它也具有唯一性