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

Agent 操作系统:未来的 Harness 平台

在大模型技术爆发的当下,自主智能体(Agent)已经成为AI原生应用的核心载体,但当前Agent开发面临着碎片化严重、运维难度高、规模化落地难三大核心痛点,就像1970年代没有通用操作系统的裸机编程时代,开发者需要重复造轮子解决底层基础设施问题。本文将深度解析Agent操作系统(Agent OS)作为AI原生时代的底层基础设施的核心定位,以及下一代Harness平台如何将Agent OS与成熟的DevOps、CI/CD、可观测性、成本管理能力深度融合,成为AI原生应用全生命周期管理的统一平台。

软件工程实践的博客 278

ArrayList源码阅读笔记

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

VIP129370的博客 1102

【AI落地】AI生成测试用例,claude or gpt?(提效至少 50%)

gpt生成测试用例?当然好使啦,用好了提效50%+,用不好就让他变好!

青禾tester 1969

倍加福(P+F)R2000修改雷达IP

在调试车子的时候,用到了倍加福R2000的一款雷达,设备启动建图时发现建不了图,于是查看/scan发现话题无数据,尝试ping雷达接口发现ping不通,应该是IP地址与上位机端口的IP地址不对。首先查看雷达的IP地址,这个在雷达上有两个按键,按下后可以显示IP: 按两下右边的键再按一下左边的键雷达上会显示出IP号,这里拍的不是很清楚。查看到开始时雷达IP地址为192.168.111.10,而上位机ping的IP地址为192.168.188.50.与实际不同,所以需要对雷达进行配置。一台windows笔记本

YiYeZhiNian的博客 5890

深入学习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

Windows 下安装 Hermes Agent 完整教程(含踩坑记录)

不支持原生 Windows,必须通过 WSL2 (Windows Subsystem for Linux 2) 运行。WSL2 是 Windows 内置的 Linux 兼容层,可以在 Windows 上运行完整的 Linux 环境。

weixin_50191542的博客 4278

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

hcaptcha无感验证码逆向实战:从接口分析到环境补全

本文详细解析了hcaptcha无感验证码的逆向实战过程。通过分析核心接口与加密逻辑,重点介绍了采用环境补全策略来模拟真实浏览器环境,从而绕过验证码检测。文章提供了从接口抓包、剖析hsw.js加密核心到使用Node.js搭建模拟环境的完整步骤,为自动化操作提供了一种稳健的解决方案。

weixin_29324401的博客 1152

手把手教你用Verilog实现MDIO控制器(附完整VHDL代码对比)

本文详细介绍了如何使用Verilog实现MDIO控制器,并提供了与VHDL实现的深度对比。通过解析MDIO协议核心要点,展示Verilog状态机架构设计和关键时序控制逻辑,同时对比VHDL在信号声明、状态机实现和双向端口处理上的差异。适用于以太网硬件设计开发者,帮助掌握MDIO控制器自主实现能力。

weixin_30682415的博客 422

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

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

henrly的博客 1万+

STM32(HAL库)驱动OLED

通过STM32F103C8T6单片机采用HAL库方式对0.96寸OLED(IIC通讯)屏幕进行驱动。

weixin_44597885的博客 8801

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

手把手教你学Simulink——高频隔离型双向DC-AC逆变器的建模与仿真

本文系统讲解高频隔离型双向DC-AC逆变器的Simulink建模与仿真,基于DAB+全桥逆变两级拓扑,详述DAB移相控制原理、双闭环控制策略及分步仿真搭建流程。重点涵盖电路建模、控制环设计、参数设置与常见问题调试,强调模块化分步验证与分层控制逻辑,实现安全、高效、灵活的双向能量流动仿真,适用于储能、微电网等场景的系统开发与验证。

MHD0815的博客 107

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Arrays.copyOf() 与 System.arraycopy()

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

spirit_8023的博客 192

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

数组复制的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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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、付费专栏及课程。

余额充值