• 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;
    	}
    }
    



  • 相关阅读:
    【题解】Red-Blue Graph Codeforces 1288F 上下界费用流
    【题解】The Magician HDU 6565 大模拟
    HAOI2018游记
    【题解】【THUSC 2016】成绩单 LOJ 2292 区间dp
    【题解】【雅礼集训 2017 Day5】远行 LOJ 6038 LCT
    【题解】Catering World Finals 2015 上下界费用流
    《无问西东...》
    为了世界的和平~一起上caioj~~~!
    新征程~起航!
    bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469453.html
Copyright © 2020-2023  润新知