我们知道在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. WCF REST (二)

    今天主要写下  POST等其他方式 发送请求 以及 流方式 文件的上传与下载 一.Post 提交数据 先来想下 POST和Get 的不同   Get 方式 我们直接通过 url  来传递参数   先来 ...

  2. 目标识别(object detection)中的 IoU(Intersection over Union)

    首先直观上来看 IoU 的计算公式: 由上述图示可知,IoU 的计算综合考虑了交集和并集,如何使得 IoU 最大,需要满足,更大的重叠区域,更小的不重叠的区域. 两个矩形窗格分别表示: 左上点.右下点 ...

  3. 15.SpringBoot简介-SpringBoot是什么可以做什么

    转自:https://blog.csdn.net/kingboyworld/article/details/77713743 在过去的两年时间里,最让人兴奋.回头率最高.最能改变游戏规则的东西,大概就 ...

  4. WPF学习笔记——概述

    如果你选择WPF,多半原因是因为折服于它那震撼性的用户体验.纵观WPF整个知识体系,其内容并不复杂,但却比较细碎,不易理清.以下内容是对WPF部分内容的简单概括,希望读者能够对WPF框架有个大体认识. ...

  5. [RxJS] ReplaySubject with buffer

    A BehaviorSubject can remember the latest value emitted, but what if we wanted Observer B to see all ...

  6. 一文看懂AI芯片竞争五大维度

    下一波大趋势和大红利从互联网+让位于人工智能+,已成业界共识.在AI的数据.算法和芯片之三剑客中,考虑到AI算法开源的发展趋势,数据与芯片将占据越来越重要的地位,而作为AI发展支柱的芯片更是AI业的竞 ...

  7. css3-12 transition+css或transform实现过渡动画

    css3-12 transition+css或transform实现过渡动画 一.总结 一句话总结:首先要设置hover后的效果,然后在transition里面指定执行哪些样式和执行时间为多长. 1. ...

  8. POJ 1065 Wooden Sticks(zoj 1025) 最长单调子序列

    POJ :http://poj.org/problem?id=1065 ZOJ: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId= ...

  9. 翻译《虚幻引擎4艺术大师 - 蓝图 II 》 中文版

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接: http://blog.csdn.net/cartzhang/article/details/46504583 作者:ca ...

  10. 编译pano13的一些注意事项

    作者:朱金灿 来源:error C2037: "jmpbuf"的左侧部分指定未定义的结构/联合"png_struct_def"e:\src\Test\libpa ...