我们知道在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;
}
}

JAVA SE回顾及思考(2)——数组的复制与动态扩展的更多相关文章

  1. JAVA SE回顾及思考(3)——排序算法

    排序的算法是很多公司的笔试和面试题,个人感觉Java中其实无需使用这些排序方法,因为Java中已经为我们提供了很方便效率很高的sort()方法.但是不使用不能代表不需要学习这些算法,也不是仅仅为了面试 ...

  2. JAVA SE回顾及思考(1)——面向对象的特点

    学习Java已经三年了,现在开始做Android开发,虽说还在用Java语言但本人现在才真真的意识到无论学什么基础才是最重要的,可能一些刚接触Java或者Android的朋友现在还体会不到基础的重要性 ...

  3. Java知识回顾 (5)数组、日期与时间, StringBuffer和StringBuilder

    一.数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. dataType[] arrayRefVar; // 首选的方法 或 dataType arra ...

  4. Java SE 第二篇

    二.  Java SE 第二篇 1.  Arrays 数组 // 声明一维数组,[]内不允许有值 int[] arr; int arr[]; // 创建一维数组对象,[]内必须有值 arr = new ...

  5. java se系列(四) 函数、数组、排序算法、二分法、二维数组

    1 函数 1.1  数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...

  6. Java SE教程

    第0讲 开山篇 读前介绍:本文中如下文本格式是超链接,可以点击跳转 >>超链接<< 我的学习目标:基础要坚如磐石   代码要十份规范   笔记要认真详实 一.java内容介绍 ...

  7. Java基础回顾

    学习基础背景:Acmer.有C/C++基础 以[Java语言程序设计(基础篇)]第10版为参考(感谢YJJ的推荐),列出部分知识点,注意思考背后的原因和好处坏处. [14-16章——关于可视化编程的章 ...

  8. 黑马程序员 ——Java SE(1)

    ----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训 ...

  9. 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结

    虽然看过一些Java 8新特性的资料,但是平时很少用到,时间长了就忘了,正好借着Java 9的发布,来总结下一些Java 8中的新特性. 接口中的默认方法和静态方法 先考虑一个问题,如何向Java中的 ...

随机推荐

  1. uva 1463 - Largest Empty Circle on a Segment(二分+三分+几何)

    题目链接:uva 1463 - Largest Empty Circle on a Segment 二分半径,对于每一个半径,用三分求出线段到线段的最短距离,依据最短距离能够确定当前R下每条线段在[0 ...

  2. Codeforces #28 C.Bath Queue (概率dp)

    Codeforces Beta Round #28 (Codeforces format) 题目链接: http://codeforces.com/contest/28/problem/C 题意: 有 ...

  3. javascript中的this指向问题总结

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 1.函数执行的时候,首先看函数名前边是否有点 ‘·’,有的话点’ ...

  4. Android Studio查看android源码

    Android Studio的默认版本在/Applications/Android Studio.app/Contents/info.plist中设置,默认没有1.8.如下: <key>J ...

  5. log4j 2.x 版本的 properties 配置

    #用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出status = debugdest = errname = PropertiesConf ...

  6. [AngularFire 2] Object Observables - How to Read Objects from a Firebase Database?

    In this lesson we are going to learn how to use AngularFire 2 to query objects, and read them from t ...

  7. Java性能优化技巧集锦

    一.通用篇 "通用篇"讨论的问题适合于大多数Java应用. 1.1 不用new关键词创建类的实例 用new关键词创建类的实例时,构造函数链中的全部构造函数都会被自己主动调用.但假设 ...

  8. 博客已迁移至http://blog.csdn.net/lujinhong2/

    http://blog.csdn.net/lujinhong2/ 请继续关注

  9. 21、根据(应用程序)虚拟驱动vivi的使用过程彻底分析摄像头驱动(有ioctrl分析)

    videobuf2-core.h中的vb2_buffer,记录了v4l2_buffer ,驱动可以对vb2_buffer的v4l2_buffer进行操控, vb2_buffer是v4l2框架层的代码, ...

  10. 5DXTPlayer串口调试小结

    小结 过程总是艰难. 首先是没有准备好. 没有安装vs2012,安装的时候,出现各种状况,因为先安装的2013高版本,造成12安装不正确,程序编译出问题.没有办法,只好卸载vs2012,2013及其各 ...