Arrays.copyOf()与System.arraycopy()的源码分析

首先观察先System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)的实现方式:

public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);


src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。

该方法是用了native关键字,调用的为C++编写的底层函数,可见其为JDK中的底层函数。

再来看看Arrays.copyOf();该方法对于不同的数据类型都有相应的方法重载。

//非基本类型
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
//基本数据类型
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}


original - 要复制的数组
newLength - 要返回的副本的长度
newType - 要返回的副本的类

观察其源代码发现copyOf(),在其内部创建了一个新的数组,然后调用arrayCopy()产生新的数组对象,返回出去。

总结:
1.copyOf()的实现是用的是arrayCopy();
2.arrayCopy()需要目标数组,对两个数组的内容进行可能不完全的合并操作。
3.copyOf()在内部新建一个数组,是用arrayCopy()将oldArray内容复制到newArray中去,并且长度为newLength。返回newArray;
95-30-050-java.util.ArrayList:Vector 1.世界 1. ArrayList简介 ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 ​ 它继承于 AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable 这些接口。 ​ 在我们学数据结构的时候就知道了线性表的顺序存储,插入删除元素的时 阅读详情

相关推荐

System.arraycopy和Arrays.copyOf

个人研究所得,包含对其内部jdk源码的分析。 同时会结合ArrayList中对该两个方法的调用做进一步说明。 总结一句话:在允许的情况下,尽量调用System.arraycopy方法,实在不行再调用Arrays.copyOf方法。

Java.util下Arrays.copyOf方法源码详解

Java.util下Arrays.copyOf方法源码详解 1. 测试最常用的两个参数的copeOf方法 @Test public void TestArraysCopyOf(){ String[] s1 = {"damon1","damon2","damon3"}; String[] s2 = Arrays.copyOf(s1, 3); System.out.println(Arrays.toString(s2)); Stri

qq_34506038的博客 1737

第三方系统(异构系统)基于token身份认证方式访问Ecology9的Restful接口Ecology9服务器配置部分

通过Token的认证方式调用Ecology9系统Restful业务接口服务器配置部分

svsou的专栏 2175

ArrayList源码阅读笔记

在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)

VIP129370的博客 1102

【技术实践指南】Python解析FactSet Revere供应链数据:构建企业级断裂与重构监测指标

本文提供了一份企业级Python实践指南,详细解析如何利用FactSet Revere供应链数据库,构建供应链断裂与重构监测指标。内容涵盖数据清洗、关系对筛选、时间序列处理及核心指标(断裂、恢复、转移)的工程化实现,旨在帮助数据工程师与分析师搭建自动化、可解释的供应链风险监控系统。

weixin_29051811的博客 932

量化策略分享之ST股弱转强,回测年化123%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强,弱转强的认定标准是前日涨停但昨日不涨停,昨日收盘价大于前一日最低价,昨日收盘价大于10日线,昨日成交量大于前一日的成交量但小于前一日成交量的10倍,股价大于1;这类股票强势,有资金介入,能获得超额收益。

qq_29301281的博客 1268

深入学习java源码之Arrays.binarySearch()与Arrays.copyOf()

深入学习java源码之Arrays.binarySearch()与Arrays.copyOf() java中有三种移位运算符 &lt;&lt;      :     左移运算符,num &lt;&lt; 1,相当于num乘以2 &gt;&gt;      :     右移运算符,num &gt;&gt; 1,相当于num除以2 &gt;&gt;&gt;    :     无符号右移,忽略符...

悦分享 565

基于matlab的车牌识别(含子程序)

基于matlab的车牌识别系统一、对车辆图像进行预处理1.载入车牌图像:function [d]=main(jpg) [filename, pathname] = uigetfile({'*.jpg', 'JPEG 文件(*.jpg)'}); if(filename == 0), return, end global FILENAME %定义全局变量 FILENAME = [pathname f...

TuTu998的博客 4万+

java源码分析~一文看懂java数组复制(原始方法,Arrays.copyOf(),System.arraycopy(),Object.clone(),遍历)

Arrays.copyOf()、System.arraycopy() 本文是基于jdk1.8 源码分析 Arrays.copyOf() /*此方法是一个静态方法,所以可以通过Arrays类名直接调用 *数组拷贝时先创建一个的数组,再调用System.arraycopy()方法。 *参数解析:original:要复制的数组;newLength:返回副本的长度若该值比要复制的数组original的长度更大,则将多余的结果设置为0或false */ public static in

qq_38939215的博客 365

Verilog仿真时读取bin文件模拟输入数据流,将输出数据流写入bin文件

需要关注的是,一般会省略文件起始地址和读取长度,那么mem为多大,就会从文件中读取多大的数据出来填充mem。如果只需要读取一次文件,那么代码到此就结束了,但是如果还需要每一帧都读取该文件转换为数据流,则在循环里判断新的一帧信号是否到来,在新的一帧再次打开一次文件,从头开始读取数据。

qq_41137205的博客 2772

主题035:计算流体力学(CFD)

计算流体力学(Computational Fluid Dynamics, CFD)是利用数值方法求解流体流动、传热传质等问题的学科。CFD已成为化学反应工程中反应器设计和优化的重要工具。∂ρ∂t+∇⋅(ρu)=0 \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{u}) = 0 ∂t∂ρ​+∇⋅(ρu)=0对于不可压缩流动:∇⋅u=0 \nabla \cdot \mathbf{u} = 0 ∇⋅u=0动量方程:∂(ρu)∂t+∇⋅(ρ

kkchenjj的博客 267

详解Java中的Arrays类的copyOf()方法

java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单。 Arrays.copyOf(T[] original,int newLength ):拷贝数组,其内部调用了System.arrayCopy()方法,从下标0开始,如果超过原数组长度,会用null进行填充。 如下图可见:源码分析,内部调用了System.arraycop...

henrly的博客 1万+

YOLOv8/YOLOv11目标检测系统与多目标跟踪检测系统,使用PySide6搭建目标检测系统,支持目标检测、分割、姿势估计、旋转框,用户端系统+后台管理系统可用于大论文凑工作量或毕设必备

YOLOv8/YOLOv11目标检测系统与多目标跟踪检测系统,目标检测、分割、姿势估计、obb(旋转框),用户端系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程,系统支持 目标检测、分割、姿势估计、obb(旋转框)等模型进来检测,是一个通用的目标跟踪与目标检测系统,适配多种场景如:鱼苗检测与跟踪、行人多目标跟踪、车辆多目标跟踪、牛只行为识别与跟踪、口罩佩戴检测、安全帽佩戴检测、火灾检测等。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1万+

java arrays.copyof_Java中 System.arraycopy() 和 Arrays.copyOf()方法

System.arraycopy() 和 Arrays.copyOf()方法阅读源码的话,我们就会发现 ArrayList 中大量调用了这两个方法。比如:我们上面讲的扩容操作以及add(int index, E element)、toArray() 等方法中都用到了该方法!System.arraycopy() 方法/*** 在此列表中的指定位置插入指定的元素。*先调用 rangeCheckForA...

weixin_39524882的博客 233

竞赛经验——挑战杯、互联网加、北斗杯、微软创新杯、计算机设计等比赛教训与经验

最近参加一些比赛,北斗杯、挑战者杯、微软创新杯等比赛,每次比赛都有不少需要总结的地方,特别是项目展示上技巧很多,总结一下。 首先最重要的是作品自身硬!自身的作品完成度不高,或者是没有创新点,就没必要参加了。 比如是出去比赛的话,我反正每次碰到最多的是智慧农场、智慧家居之类,不知道为啥这种的太多了。如果是创业型比赛,评委基本会问小米已经做得很好了很便宜了,你的优势在哪里?这些都是常见的问题提前要...

沉迷单车的追风少年 7328

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Arrays.copyOf() 与 System.arraycopy()

Arrays.copyOf() 与 System.arraycopy() 的区别 Arrays.copyOf() 源码 /** @Description 复制指定的数组, 如有必要用 null 截取或填充,以使副本具有指定的长度 * 对于所有在原数组和副本中都有效的索引,这两个数组相同索引处将包含相同的值 * 对于在副本中有效而在原数组无效的所有索引,副本将填充 null,当且仅当指...

spirit_8023的博客 192

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数组复制源码分析效率对比

数组复制的5种方法源码分析 文章目录数组复制的5种方法源码分析1.For循环方法2.System.arraycopy()方法参数说明3.Arrays.copyOf()方法参数说明返回值4.Arrays.CopyOfRange()参数说明5.Object.clone()方法返回值6.总结效率对比排名 1.For循环方法 一个一个复制,代码效率低。 2.System.arraycopy()方法 方法使...

qq_37908402的博客 483

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ArrayList

- [ArrayList简介]- [ArrayList核心源码]- [ArrayList源码分析] - [System.arraycopy()和Arrays.copyOf()方法] - [两者联系与区别] - [ArrayList核心扩容技术] - [内部类]- [ArrayList经典Demo] ### ArrayList简介  ArrayList ...

weixin_33935505的博客 137

聊聊ArrayList的扩容机制

一、构造函数

逍遥大俠 359

ArrayList(JDK1.8)源码解析

目录简介继承关系图源码分析成员变量构造方法内部类ArrayList有四个内部类核心方法add()方法(有四个)对数组的容量进行调整remove()get()方法常用方法System.arraycopy()和 Arrays.copyOf()方法Arrays.copyOf()方法 简介 ArrayList 是 Java 集合框架中 List 接口的一个实现类。底层是数组,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。 ArrayList 可以说是我们使用最多的 List 集合,它有以下特点:

jinian2016的博客 127

ArrayList源码学习

文章目录ArrayList简介ArrayList核心源码源码重点方法分析System.arraycopy()和Arrays.copyOf()方法ArrayList核心扩容技术ArrayList经典Demo ArrayList简介 ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来...

qq_24095055的博客 1115

怎么把arraylist转化为数组_ArrayList之源码剖析

关注“IT魔幻屋”近距离接触编程之美!ArrayList简介ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并...

weixin_39831242的博客 616

List集合toArray方法和toArray(T[] a)方法

作用:将列表List中的元素导出为数组 toArray() toArray()方法导出的是Object[] 返回的数组是一个新数组,多次运行toArray方法会生成多个数组对象(存储的引用地址是不同的),但是这些数组中的内容是一样的。 toArray返回的数组是安全的,可以对生成的数组做任意的修改。 public static void main(String[] args) { List<String> list = new ArrayList<>();

sxm666666的博客 808

ArrayList 源码分析

">>"(移位运算符):>>1 右移一位相当于除 2,右移 n 位相当于除以 2 的 n 次方。对于大数据的 2 进制运算,位移运算符比那些普通运算符的运算要快很多,因为程序仅仅移动一下而已,不去计算,这样提高了效率,节省了资源。的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。需要目标数组,将原数组拷贝到你自己定义的数组里或者原数组,而且可以选择拷贝的起点和长度以及放入新数组中的位置。内部没有被调用过,所以很显然是提供给用户调用的,那么这个方法有什么作用呢?

qq_45195447的博客 798

【Java基础知识总结 | 第三篇】深入理解分析ArrayList源码

ArrayList的特点有:①存储的对象:存储不唯一、有序的对象,对象只能为引用类型,不能为基本数据类型;②底层数据结构:动态数组,可自动扩容;③null值问题:可以存储null值,但没意义;④线程安全问题:不安全;⑤快速访问问题:由于实现了RandomAccess接口,所以支持通过下标实现快速访问;⑥补充:支持深浅拷贝、支持序列化;ArrayList的源码总结:①ArrayList的默认初始化容量为10,初始化ArrayList对象赋值的是一个空数组,当添加第一个元素时,才将数组扩容为10

踢桃的成长之路 1749
上一篇: Java集合类及内部部分实现浅析
下一篇: DHTML帮助文档 共享下载
水滴石穿
博客等级 码龄16年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值