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;
}
}
JAVA SE回顾及思考(2)——数组的复制与动态扩展的更多相关文章
- JAVA SE回顾及思考(3)——排序算法
排序的算法是很多公司的笔试和面试题,个人感觉Java中其实无需使用这些排序方法,因为Java中已经为我们提供了很方便效率很高的sort()方法.但是不使用不能代表不需要学习这些算法,也不是仅仅为了面试 ...
- JAVA SE回顾及思考(1)——面向对象的特点
学习Java已经三年了,现在开始做Android开发,虽说还在用Java语言但本人现在才真真的意识到无论学什么基础才是最重要的,可能一些刚接触Java或者Android的朋友现在还体会不到基础的重要性 ...
- Java知识回顾 (5)数组、日期与时间, StringBuffer和StringBuilder
一.数组 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. dataType[] arrayRefVar; // 首选的方法 或 dataType arra ...
- Java SE 第二篇
二. Java SE 第二篇 1. Arrays 数组 // 声明一维数组,[]内不允许有值 int[] arr; int arr[]; // 创建一维数组对象,[]内必须有值 arr = new ...
- java se系列(四) 函数、数组、排序算法、二分法、二维数组
1 函数 1.1 数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表 ...
- Java SE教程
第0讲 开山篇 读前介绍:本文中如下文本格式是超链接,可以点击跳转 >>超链接<< 我的学习目标:基础要坚如磐石 代码要十份规范 笔记要认真详实 一.java内容介绍 ...
- Java基础回顾
学习基础背景:Acmer.有C/C++基础 以[Java语言程序设计(基础篇)]第10版为参考(感谢YJJ的推荐),列出部分知识点,注意思考背后的原因和好处坏处. [14-16章——关于可视化编程的章 ...
- 黑马程序员 ——Java SE(1)
----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训 ...
- 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结
虽然看过一些Java 8新特性的资料,但是平时很少用到,时间长了就忘了,正好借着Java 9的发布,来总结下一些Java 8中的新特性. 接口中的默认方法和静态方法 先考虑一个问题,如何向Java中的 ...
随机推荐
- Android通过startService播放背景音乐简单演示样例
关于startService的基本使用概述及其生命周期可參见博客<Android中startService的使用及Service生命周期>. 本文通过播放背景音乐的简单演示样例,演示sta ...
- 深入并发AQS二
AQS须要解决下面几个问题: 1.锁状态,怎样保证并发情况下可以安全的更新? 2.当前线程不能获取锁时,放在哪里? AQS是放在一个队列其中 3.怎样提高效率? AQS的主要职责是当获取不到锁时.将线 ...
- WCF REST (二)
今天主要写下 POST等其他方式 发送请求 以及 流方式 文件的上传与下载 一.Post 提交数据 先来想下 POST和Get 的不同 Get 方式 我们直接通过 url 来传递参数 先来 ...
- C#DateTime与Unix时间戳的转换
/// <summary> /// Unix时间戳转为C#格式时间 /// </summary> /// <param name="timeStamp" ...
- 关于C语言的书
我想横着走,,哈哈哈哈
- windows版 nginx配置反向代理实例教程 跳转tomcat和php网站
抄自 https://www.cnblogs.com/j-star/p/8785334.html 个人理解 nginx端口设置为80,简称n tomcat端口设置为其他,例如8080,简称t php网 ...
- 8.6 Android灯光系统_源码分析_背光灯
Change system screen brightness, using android.provider.Settings.System.SCREEN_BRIGHTNESSandroid-er. ...
- SpringBoot学习:获取yml和properties配置文件的内容(转)
项目下载地址:http://download.csdn.net/detail/aqsunkai/9805821 (一)yml配置文件: pom.xml加入依赖: <!-- 支持 @Configu ...
- Dll的链接使用细节
关于Dll Dll.Exe 都是PE格式的二进制文件. Dll相当于Linux操作系统下的so文件 1 基地址(Base Address)和相对地址(RelativeVirtual Address) ...
- js模仿块级作用域(js没有块级作用域私有作用域)
js模仿块级作用域(js没有块级作用域私有作用域) 一.总结 1.js没有块级作用域:在for循环中定义的i,出了for循环还是有这个i变量 2.js可以模拟块级作用域:用立即执行的匿名函数:(匿名函 ...