Java——陣列的拷貝
阿新 • • 發佈:2018-11-03
1.for迴圈拷貝:
int[] array={1,2,3,4,5};
int[] brray=new int[array.length];
for(int i=0;i<array.length;i++) {
brray[i]=array[i];
}
這是基本資料型別,如果修改b[i]的值,則a[i]的值不會發生變化,所以稱之為深拷貝;
class TestArray{ private int val=10; public void setVal(int val){ this.val=val; } public int getVal(){ return this.val; } } 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]; for(int i=0;i<t1.length;i++) { t2[i]=t1[i]; }
而引用資料型別時,改變t2[i]的值,則t1[i]的值也會發生改變,即為淺拷貝;
總的來說,for迴圈的拷貝是 淺拷貝
2. Object.clone()拷貝:
int[] array={1,2,3,4,5};
int[] brray=array.clone();
class TestArray{ private int val=10; public void setVal(int val){ this.val=val; } public int getVal(){ return this.val; } } public static void main4(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(); }
array.clone(),會產生一個新的陣列,然後將array陣列的值複製到新陣列中去;
簡單資料型別是深拷貝;
引用資料型別是淺拷貝,
總的來說是淺拷貝;
3. Arrays.copyOf()拷貝:
int[] array={1,2,3,4,5};
int[] brray=Arrays.copyOf(array,array.length);
class TestArray{ 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); }
同樣的,Arrays.copyOf()會產生一個新陣列,然後將Array陣列的值複製到新陣列中去,與array.clone不同的是,Arrays.copyOf()第二個引數,是定義要拷貝的長度;
簡單資料型別是深拷貝;
引用資料型別是淺拷貝,
總的來說是淺拷貝;
### 4. System.arraycopy()拷貝:
int[] array={1,2,3,4,5};
int[] brray=new int[array.length];
System.arraycopy(array,0,brray,0,array.length);
class TestArray{
private int val=10;
public void setVal(int val){
this.val=val;
}
public int getVal(){
return this.val;
}
}
public static void main6(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];
System.arraycopy(t1,0,t2,0,t1.length);
}
System.arraycopy() 裡面有四個引數:
src - 源陣列。
srcPos - 源陣列中的起始位置。
dest - 目標陣列。
destPos - 目標資料中的起始位置。
length - 要複製的陣列元素的數量
System.arrayCopy 只複製已有的陣列,
簡單資料型別是深拷貝;
引用資料型別是淺拷貝,
總的來說是淺拷貝。
練習題
2.2 如何排序陣列並插入某個元素?
public static void insert(int[] array,int key) {
Arrays.sort(array);
int index=0;
for(int i=0;i<array.length;i++){
if(key<array[i]){
index=i;
break;
}
}
int[] brray=Arrays.copyOf(array,array.length+1);
for(int j=brray.length-1;j>=index;j--){
brray[j]=brray[j-1];
}
brray[index]=key;
System.out.println(Arrays.toString(brray));
}
2.5如何搜尋陣列中的最小值和最大元素?
public static int[] maxMin(int[] array) {
int min = array[0];
int max = array[0];
int[] brray = {0,0};
for(int i = 0;i < array.length;i++) {
if(array[i] > max) {
max = array[i];
} else if(array[i] < min) {
min = array[i];
}
}
brray[0] = min;
brray[1] = max;
return brray;
}
2.6如何合併兩個陣列(合併到一個新的陣列)?
public static void merge(int[] array,int[] brray) {
int[] crray=new int[array.length+brray.length];
System.arraycopy(array,0,crray,0,array.length);
System.arraycopy(brray,0,crray,array.length,brray.length);
System.out.println(Arrays.toString(crray));
}
2.10:如何刪除陣列指定元素?
public static void delect(int[] array,int key) {
Arrays.sort(array);
int x= Arrays.binarySearch(array,key);
int[] brray=Arrays.copyOf(array,array.length-1);
for(int i=x;i<array.length-1;i++){
brray[i]=array[i+1];
}
System.out.println(Arrays.toString(array));
}
2.11: 如何從陣列中查詢常見的元素?
int[] array={3,4,2,8,7,5};
Arrays.sort(array);
int x= Arrays.binarySearch(array,8);
System.out.println(x);
1.將奇數放在偶數前面 大小順序不要求
public static void paixu(int[] array){
int i=0;
int j=array.length-1;
while(i<j){
while(i<j&&array[i]%2!=0){
i++;
}
while(i<j&&array[j]%2==0) {
j--;
}
int tmp=array[i];
array[i]=array[j];
array[j]=tmp;
continue;
}
System.out.println(Arrays.toString(array));
2.一個數組是有序的,給定一個key:數字 有兩個數字的和加起來等於key找到這兩個數字的下標。
public static void add(int[] array,int key){
for(int i=0;i<array.length;i++){
for(int j=i;j<array.length;j++){
if(key==array[i]+array[j]) {
System.out.println(i);
System.out.println(j);
break;
}
}
break;
}
}
3. 一個整形陣列,除了兩個數字只出現一次外,其他數字都是兩次。
public static int[] findNumberApperOnce(int[] array) {
int a=0;
for(int i=0;i<array.length;i++) {
a=a^array[i];
}
int index=weishu(a);
int n1=0;
int n2=0;
for(int i=0;i<array.length;i++) {
if (isOne(array[i], index)) {
n1=n1^array[i];
}else{
n2=n2^array[i];
}
}
int[] brray={0,0};
brray[0]=n1;
brray[1]=n2;
return brray;
}
public static int weishu(int number) {
int count=0;
while((number&1)==0&&count<32){
number=number>>>1;
count++;
}
return count;
}
public static boolean isOne(int number,int index) {
number=number>>index;
if((number&1)==0){
return false;
}
return true;
}