Arrays.copyOf() 方法理解

66 篇文章 0 订阅
订阅专栏

最近看线性表、栈、队列数据结构实现源码时,经常看到 Arrays.copy()、System.arraycopy() 方法。

在JDK 6中,Arrays 类别 新增了copyOf()方法. Array.copyOf() 用于复制指定的数组内容以达到扩容的目的,该方法对不同的基本数据类型都有对应的重载方法,详见 java api:

 public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
 }


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;
}

从代码可知,数组拷贝时调用的是本地方法 System.arraycopy() ;
Arrays.copyOf()方法返回的数组是新的数组对象,原数组对象仍是原数组对象,不变,该拷贝不会影响原来的数组。copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值.

import java.util.Arrays;

public class ArrayDemo {
	public static void main(String[] args) {
        int[] arr1=new int[]{2,5,6,0,0,0};
        int[] arr2=new int[]{1,3,4};
//        Object src,  int  srcPos,
//        Object dest, int destPos,
//        int length
        System.arraycopy(arr2,0,arr1,arr2.length,arr2.length);
        Arrays.sort(arr1);
        System.out.println(Arrays.toString(arr1));
	}
} 

输出:   [1, 2, 3, 4, 5, 6]

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

参数说明:
src:源对象
srcPos:源数组中的起始位置
dest:目标数组对象
destPos:目标数据中的起始位置
length:要拷贝的数组元素的数量

 

System.arraycopy() 源码如下:

public class ArraycopyTest{

    public static void main(String[] args){
        char[] c1 = new String("123456").toCharArray();
        char[] c2 = new String("abcdef").toCharArray();
        System.arraycopy(c1, 2, c2, 1, 2);
        System.err.println(Arrays.toString(c1));
        System.err.println(Arrays.toString(c2));
    }

}

输出:     [1, 2, 3, 4, 5, 6]
             [a, 3, 4, d, e, f]

 

1> 普通增加

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

2> 指定位置添加

public void add(int index, E element) {
        rangeCheckForAdd(index);

        ensureCapacityInternal(size + 1);  // Increments modCount!!
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);
        elementData[index] = element;
        size++;
}

 

                    在index=2的位置添加新元素

3> 删除指定位置元素

   public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

4> 删除指定元素 (和上面删除指定索引的实现是一样的)

  注意: 如果要删除的元素在集合中有多个 那么不能全删除掉,此时应该使用倒序遍历删除

public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

    /*
     * Private remove method that skips bounds checking and does not
     * return the value removed.
     */
    private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // clear to let GC do its work
    }

 

 

 

 

 

 

Java中Arrays类中copyOf函数的用法
weixin_43842753的博客
04-25 2588
copyOf函数:把原数组中的数据复制到新数组中,属于深层拷贝。 在复制时会自动创建一个新数组,再调用arraycopy函数复制原数组 中的数据到新数组中。 src:原数组 srcpro:复制的起始索引 dest:目标数组 destPos:复制到目标数组的起始位置 length:复制的长度 public static native void arraycopy(Object src, int ...
Arrays.copyOf用法
zrf7436的博客
11-16 2734
Arrays.Of使用方法: 欢迎阅读Arrays.Of使用方法 各位初学者,大家好,本文将用简单明了的代码方式帮助你理解Arrays.Of的使用方法,后续会保证持续更新,话不多说,先上代码!!! 链接: link. 两个参数情况下的应用 Arrays.copyOf(original, newLength) original 最初的 (原数组) newLength 新长度(需要复制的数组长度...
Java拷贝数组方法Arrays.copyOf()是地址传递的证明实例
08-26
今天小编就为大家分享一篇关于Java拷贝数组方法Arrays.copyOf()是地址传递的证明实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Arrays工具类的常见方法总结
最新发布
2301_79500020的博客
08-19 852
JAVA开发工具包—JDK 中为我们提供了一个专门用于操作数组的工具类,即Arrays类,位于java.until包中。该类中的方法均为static修饰的静态方法,可以直接通过Arrays.xxx(xxx)的形式调用方法。主要提供了数组元素的复制、填充、比较、排序、查询等..本文主要详细介绍Arrays工具类的常见使用方法
Arrays.copyOf方法
liulang68的博客
12-20 6082
Arrays.copyOf(array, to_index); Arrays.fill(array, from_index, to_index); 第一个方法其实就是返回一个数组,而这个数组就等于数组array的前to_index个数,也就是array[0] ~ array[to_index - 1]。 而第二种方法也只是加了一个初始的位置,即返回一个数组等于array[from_index] ~ array[to_index - 1]。 这里要注意一下,不管是上面哪种使用方法,都务必记住时不包含array
Arrays.copyOf() 用法:
Ruixin1993的博客
02-27 2万+
Arrays.copyOf() 用法:ArrayscopyOf()方法传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值,例如:代码块:import java.util.Arrays;public class ArrayDemo { public static void ma
Arrays.copyOf() 用法
热门推荐
qq_25131363的博客
12-14 8万+
ArrayscopyOf()方法传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。 copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值,例如: import java.util.Arrays; public class ArrayDemo { public static void main(String[] args)...
Arrays.copyof()
diu_brother的博客
03-02 670
在 进阶的数组观念 中,我们谈到了数组复制,您可以使用System.arraycopy()方法来进行数组复制:int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = new int[5];System.arraycopy(arr1, 0, arr2, 0, arr1.length);这个方式必须明确自行新建立一个数组对象。在JDK 6中,Arrays 类别 新增了c
Arrays.copyOf()
07-28
- *1* *2* [Arrays.copyOf() 方法理解](https://blog.csdn.net/qq_31459039/article/details/90744483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_...
ArrayscopyOf()方法1
08-08
在Java编程语言中,`Arrays`类是Java.util包下的一个非常重要的工具类,它提供了许多用于操作数组的静态方法,其中包括`copyOf()`方法。`copyOf()`方法主要用于复制数组,可以创建一个新的数组,其内容是原始数组的...
JVM体验之内存溢出问题的定位方法
weixin_53953440的博客
06-06 372
测试代码如下:1234567891011121314151617 运行过程如下所示我们在这里可以看到内存在不断地上涨,而Java在到一定时候会爆出OOM异常。如下:Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat java.util.Arrays.copyOf(Arrays.java:3210)at java.util.Arrays.copyOf(Arrays.java:3181)at java.ut
java arrays类.docx
09-27
在深入讲解Arrays类的方法之前,我们先理解一下Java数组的基本概念。数组是一种数据结构,它可以存储固定数量的相同类型的数据。 1. **数组的输出**: - `toString()` 方法:将数组转换为字符串形式,以逗号分隔...
ArrayscopyOf()
Away_D的博客
08-03 374
在 进阶的数组观念 中,我们谈到了数组复制,您可以使用System.arraycopy()方法来进行数组复制:int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = new int[5]; System.arraycopy(arr1, 0, arr2, 0, arr1.length);这个方式必须明确自行新建立一个数组对象。在JDK 6中,Arrays 类别 新增
Arrays.copyOf()方法用法
weixin_42802224的博客
02-25 5960
Arrays.copyOf(参数1,参数2) 参数1:int数组,例如数组a 参数2:整数,比如4 返回值:一个新的int型数组,元素个数是4个,数组a个数大于4时,取前4个,小于4时,不足4个的补0 int[] demoArray = new int[] { 1, 3, 5, 7, 9 }; int[] demoArray1 = Arrays.copyOf(demoArray, 3); demoArray1 是{1,3,5} int[] demoArray2 = Arrays.copy...
【详解】Arrays.copyOf() 的使用
CodingLJ
03-26 3570
数组的复制:返回的是一个新的数组对象 Arrays.copyOf(int[] array, int length): 第一个变量表示原来的数组对象 第二个变量表示新的数组的长度,如果新数组的长度超过原数组的长度,保留数组元素的默认基本类型的值。 int[] arr1 = {1, 2, 3, 4, 5}; int[] arr2 = Arrays.copyOf(arr1, 5); int[] arr3 = Arrays.copyOf(arr1, 10); for(i.
深浅克隆之Arrays.copyOf()
can_chen的博客
04-17 1818
Arrays.copyOf()是数组的复制,那么Arrays.copyOf()实现的是深克隆还是浅克隆呢? 我们先来看看什么是深克隆,什么是浅克隆? 首先我们要明确的是,不管是深克隆还是浅克隆,克隆后都会在堆内存空间中开辟一块新地址来存储克隆后的对象,有区别的只是对于原型对象中成员变量是基本数据类型、String类型和引用类型的不同处理 浅克隆 浅克隆(Shadow Clone)是把原型对象中成员...
详解Java中的Arrays类的copyOf()方法
henrly的博客
07-26 1万+
java.util.Arrays 此类包含用来操作数组的各种方法,比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单。 Arrays.copyOf(T[] original,int newLength ):拷贝数组,其内部调用了System.arrayCopy()方法,从下标0开始,如果超过原数组长度,会用null进行填充。 如下图可见:源码分析,内部调用了System.arraycop...
写文章

热门文章

  • mysql查询字段是否包含某个值或某些值的方法(find_in_set函数) 42300
  • 解决方案:No space left on device 39059
  • IntellIJ IDEA导入项目后右键无法运行main方法问题 32047
  • Arrays.copyOf() 方法理解 28886
  • js中replace的用法(有转义字符) 27766

分类专栏

  • 面试 6篇
  • jdk1.8新特性
  • SpringCloud 2篇
  • 多线程 1篇
  • navicat 1篇
  • netty
  • Zookeeper 1篇
  • 树结构 1篇
  • es
  • elasticsearch
  • jenkins
  • github
  • chrome 1篇
  • mybatisplus 1篇
  • docker 1篇
  • io
  • quartz 1篇
  • mysql有关 15篇
  • JAVA编程相关 66篇
  • jqueryeasyui 8篇
  • spring 14篇
  • 前端 18篇
  • redis 11篇
  • springmvc 4篇
  • eclipse配置 4篇
  • maven 9篇
  • rpc 1篇
  • mybatis 6篇
  • springboot 2篇
  • idea相关 8篇
  • 代码规范总结 1篇
  • linux 5篇
  • flume 1篇
  • freemaker 2篇
  • mq 2篇
  • 支付宝 1篇
  • tomcat 3篇
  • jvm 2篇

最新评论

  • MySQL详解--锁(脏读 不可重复读 幻读)

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性。

  • mysql独立数据作为一张表

    CSDN-Ada助手: 不知道 MySQL入门 技能树是否可以帮到你:https://edu.csdn.net/skill/mysql?utm_source=AI_act_mysql

  • Windows下,MySql使用binlog恢复表和数据初级教程

    任凭风�且听雨�: 没看明白你的start-position=1895 --stop-position=2228的参数是哪来的,图片上根本没看到!

  • java中方法的参数传递机制

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)使用标准目录;(2)增加条理清晰的目录。

  • MySQL 用 limit 分页为什么会影响性能?

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)增加条理清晰的目录;(2)增加内容的多样性(例如使用标准目录、标题、图片、链接、表格等元素);(3)使用标准目录。

大家在看

  • 基于黑猩猩算法优化的最小交叉熵图像多阈值分割
  • 基于社会群体算法优化的最小交叉熵图像多阈值分割
  • MySQL中substr函数使用方法实例详解例子解析
  • 静态绑定和动态绑定 555
  • 算法学习之416周赛 790

最新文章

  • 软考- 数据库系统工程师
  • mysql独立数据作为一张表
  • Spring 核心特性之表达式(SpEL)
2024年2篇
2023年5篇
2021年4篇
2020年32篇
2019年104篇
2018年79篇
2017年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家盐城玻璃钢马雕塑设计kaws公仔玻璃钢雕塑岑溪玻璃钢胸像雕塑海南玻璃钢仿真水果雕塑价格衢州特色玻璃钢雕塑销售厂家潍坊园林玻璃钢雕塑玻璃钢花钵花盆云南玻璃钢卡通雕塑如何制作北京走廊商场美陈销售厂家许昌动物玻璃钢雕塑定制宜春景观玻璃钢雕塑制作上海常见商场美陈怎么样福建特色商场美陈批发市政工程绿化玻璃钢花盆价格玻璃钢雕塑鞋带玻璃钢公园雕塑单价辽宁玻璃钢仿真水果雕塑厂家上海弧形玻璃钢花盆张掖玻璃钢卡通雕塑订做重庆玻璃钢雕塑在哪里买河南节庆商场美陈供货商滁州个性化玻璃钢雕塑市场商场美陈展厅制作樱花园商场美陈陕西玻璃钢雕塑哪家便宜三门峡不锈钢校园玻璃钢雕塑贵州城市标志玻璃钢雕塑厦门玻璃钢抽象雕塑深圳厂家玻璃钢雕塑资讯深圳常见商场美陈厂家直销香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化