JAVA SE回顾及思考(2)——数组的复制与动态扩展

我们知道在Java中数组是非基本类型既数组是对象(Object)的子类,所以用下面的这种方式是不能复制该对象的

	public static void main(String[] args) {
		int[] arry1 = new int[]{1, 2, 3, 4};
		//数组赋值
		int[] arry2 = arry1; //一个数组对象,两个引用同时引用该对象
		System.out.println(arry1[1]);
		System.out.println(arry2[1]);
		arry1[1] = 8;
		System.out.println(arry2[1]);
	}


这样并不能复制数组只是一个简单的赋值操作,下面我们采取另一种方式试一下。

	public static void main(String[] args) {
		int[] arry1 = new int[]{1, 2, 3, 4};
	
		int[] arry3 =new int[arry1.length];
		for(int i=0; i<arry1.length; i++){
			arry3[i] = arry1[i];
		}
		arry3[1] = 9999;
		System.out.println(arry1[1]);
	}


其实这个Java API中已经提供了一个非常简便并且效率比较高的方法System.arraycopy(src, srcPos, dest, destPos, length),这个方法的底层是用C++写的,比上面的那种for循环实现拷贝效率要高的多。 JDK 1.6以上提供了Arrays.copyOf(src, length)方法,其实这个方法的底层也是arraycopy方法实现的。

	public static void main(String[] args) {
		int[] src = {1, 2, 3, 4};
		int[] dest = new int[4];
		
		System.arraycopy(src, 0, dest, 0, src.length);
		System.out.println(Arrays.toString(dest));
	}

	public static void main(String[] args) {
		int[] src = {1, 2, 3, 4};
		int[] dest = Arrays.copyOf(src, src.length);
		
		System.out.println(Arrays.toString(dest));
	}

学过Java和C语言的知道Java的数组对象的大小是固定的,数组对象是不能扩展的,不过我们可以用上面复制数组的方法来实现数组的动态长度。

System.arraycopy()可以复制数组

Arrays.copyOf()可以简便的创建数组副本

	public static void main(String[] args) {
		char[] cArr = {'大', '碗'};
		char[] temp = Arrays.copyOf(cArr, 4);
		temp[2] = '干';
		temp[3] = '拌';
		System.out.println(Arrays.toString(temp));
	}

下面我们通过上面的方法完成一个练习“从一段文字中统计某个字符所有的位置”

package com.dawanganban.test;

import java.util.Arrays;

public class ArrayCopyTest {
	public static void main(String[] args) {
		String str = "统计一个字符在字符串中的所有位置";
		int[] ary = countAll(str, '字');
		System.out.println(Arrays.toString(ary));
	}	
	
	/**
	 * 统计一个字符在字符串中的所有位置的方法
	 * @param str 被统计的字符串
	 * @param ch 统计的字符
	 * @return  位置数组
	 */
	private static int[] countAll(String str, char ch){
		int[] ary = {};
		for(int i=0; i<str.length(); i++){
			char c = str.charAt(i);
			if(c == ch){
				ary = Arrays.copyOf(ary, ary.length + 1);
				ary[ary.length - 1] = i;
			}
		}
		return ary;
	}
}



原文地址:https://www.cnblogs.com/lanzhi/p/6469453.html