JAVA SE回顾及思考(2)——数组的复制与动态扩展
2024-08-31 19:08:55
我们知道在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;
}
}
最新文章
- Django models Form model_form 关系及区别
- PHP 中 define() 和 const 定义常量时的区别
- 软件产品案例分析(K米 APP)
- phpunit测试成功 phpunit测试实践代码
- paper 101:图像融合算法及视觉艺术应用
- ASCII字符集
- 欧拉工程第70题:Totient permutation
- (IOS)关于Xcode的架构(Architectures)设置
- Weka开发[3]-Evaluation类
- INI文件的写入与读取
- 流畅的python学习笔记:第一章
- MyEclipse中好用的快捷键汇总
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.2更新
- Port Channel and VPC
- 表单数据转javabean对象
- flume常见异常汇总以及解决方案
- 删除docker下的镜像
- Mysql优化系列--Innodb引擎下mysql自身配置优化-转
- php下载远程大文件(获取远程文件大小)
- 机器学习算法实现解析——libFM之libFM的模型处理部分