zoukankan      html  css  js  c++  java
  • System.arraycopy

    System.arraycopy()方法。该方法被标记了native,调用了系统的C/C++代码,在JDK中是看不到的,但在openJDK中可以看到其源码。该函数实际上最终调用了C语言的memmove()函数,因此它可以保证同一个数组内元素的正确复制和移动,比一般的复制方法的实现效率要高很多,很适合用来批量处理数组。Java强烈推荐在复制大量数组元素时用该方法,以取得更高的效率。

    public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    代码解释:
      Object src : 原数组
    int srcPos : 从元数据的起始位置开始
      Object dest : 目标数组
      int destPos : 目标数组的开始起始位置
      int length : 要copy的数组的长度

    比如 :我们有一个数组数据 byte[]  srcBytes = new byte[]{2,4,0,0,0,0,0,10,15,50};  // 源数组

                                        byte[] destBytes = new byte[5]; // 目标数组

    我们使用System.arraycopy进行转换(copy)

    System.arrayCopy(srcBytes,0,destBytes ,0,5)
    上面这段代码就是 : 创建一个一维空数组,数组的总长度为 12位,然后将srcBytes源数组中 从0位 到 第5位之间的数值 copy 到 destBytes目标数组中,在目标数组的第0位开始放置.
    那么这行代码的运行效果应该是 2,4,0,0,0

    System.arraycopy是浅复制

    利用System.arraycopy实现数组复制的示例:


    [java] view plain copy
     
    package com.shuzu;  
    /*System中提供了一个native方法arraycopy()*/  
    public class SsytemArrayCopy {  
        public static void main(String[] args) {  
           User [] users=new User[]{new User(1,"admin","admin@qq.com"),new User(2,"maco","maco@qq,com"),new User(3,"kitty","kitty@qq,com")};//初始化对象数组  
           User [] target=new User[users.length];//新建一个目标对象数组  
           System.arraycopy(users, 0, target, 0, users.length);//实现复制  
           System.out.println("源对象与目标对象的物理地址是否一样:"+(users[0] == target[0]?"浅复制":"深复制"));  
           target[0].setEmail("admin@sina.com");  
           System.out.println("修改目标对象的属性值后源对象users:");  
           for (User user : users){  
               System.out.println(user);  
           }           
        }  
    }  
    class User{  
        private Integer id;  
        private String username;  
        private String email;  
        //无参构造函数  
        public User() { }  
        //有参的构造函数  
        public User(Integer id, String username, String email) {  
            super();  
            this.id = id;  
            this.username = username;  
            this.email = email;  
        }  
        public Integer getId() {  
            return id;  
        }  
        public void setId(Integer id) {  
            this.id = id;  
        }  
        public String getUsername() {  
            return username;  
        }  
        public void setUsername(String username) {  
            this.username = username;  
        }  
        public String getEmail() {  
            return email;  
        }  
        public void setEmail(String email) {  
            this.email = email;  
        }  
        @Override  
        public String toString() {  
            return "User [id=" + id + ", username=" + username + ", email=" + email  
                    + "]";  
        }  
    }  
    程序运行的结果:

     

    下图是System.arraycopy()复制的过程:

    
    
  • 相关阅读:
    【转载】写一个js库需要怎样的知识储备和技术程度?
    【数据库】【算法】从一串数据中获取符合某个条件的时间区间
    Tomcat中组件的生命周期管理(二)
    [Tomcat源码相关]Digester类的使用
    Tomcat启动过程源码分析五
    Tomcat启动过程源码分析六
    Tomcat启动过程源码分析四
    Tomcat启动过程源码分析三
    Tomcat启动过程源码分析二
    Tomcat启动过程源码分析一
  • 原文地址:https://www.cnblogs.com/luizw/p/12713330.html
Copyright © 2011-2022 走看看