`
JackyCheng2007
  • 浏览: 253300 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java System 类详解 - arraycopy

    博客分类:
  • Java
阅读更多
System类提供了数组copy函数:
    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

从参数列表上看,src和dest都是Object,说明可以copy任意数组。那么我们知道数组既可以是原始类型值的数组,也可以是对象类型的数组。如果是原始类型的数组,copy的就是值,如果是对象类型的数字copy的就是对象的引用而非数据。

Copy Primitive Array
package jdk.lang;
import java.util.Arrays;

public class SystemArrayCopy {
	public static void main(String[] args) throws Exception {
		copyPrimitiveArray();
	}

	public static void copyPrimitiveArray() {
		int[] source = new int[] { 1, 2, 3, 4, 5 };
		int length = source.length;
		int[] dest = new int[length];
		System.arraycopy(source, 0, dest, 0, length);
		System.out.println("source: "+Arrays.toString(source));
		System.out.println("dest: "+Arrays.toString(dest));
		for (int i = 0; i < length; i++) {
			source[i] = i + 10;
		}
		System.out.println("source: "+Arrays.toString(source));
		System.out.println("dest: "+Arrays.toString(dest));
		
	}
}


输出:

source: [1, 2, 3, 4, 5]
dest: [1, 2, 3, 4, 5]
source: [10, 11, 12, 13, 14]
dest: [1, 2, 3, 4, 5]


分析:
元数据source在copy之后修改不会对dest数据产生影响。

package jdk.lang;
import java.util.Arrays;

public class SystemArrayCopy {
	public static void main(String[] args) throws Exception { 
		copyReferenceArray();
	} 
	public static void copyReferenceArray() {
		int size = 2;
		Person[] source = new Person[size];
		for (int i = 0; i < size; i++) {
			source[i] = new Person("Persion" + i, i);
		}

		Person[] dest = new Person[size];
		System.arraycopy(source, 0, dest, 0, size);
		System.out.println("source: "+Arrays.toString(source));
		System.out.println("dest: "+Arrays.toString(dest));

		for (int i = 0; i < size; i++) {
			source[i].setAge(10 + i);
			source[i].setName("Persion" + (i + 10));
		}

		System.out.println("source: "+Arrays.toString(source));
		System.out.println("dest: "+Arrays.toString(dest));
	}

	private static class Person {
		private String name;
		private int age;

		public Person(String name, int age) {
			super();
			this.name = name;
			this.age = age;
		}

		public void setName(String name) {
			this.name = name;
		}

		public void setAge(int age) {
			this.age = age;
		}

		public String toString() {
			return String.format("(name, age):(%s, %d) ", name, age);
		}
	}
}
 


输出:

source: [(name, age):(Persion0, 0) , (name, age):(Persion1, 1) ]
dest: [(name, age):(Persion0, 0) , (name, age):(Persion1, 1) ]
source: [(name, age):(Persion10, 10) , (name, age):(Persion11, 11) ]
dest: [(name, age):(Persion10, 10) , (name, age):(Persion11, 11) ]


分析:
元数据source在copy之后修改会对dest数据产生影响。他们hold的是同一组数据的引用。


分享到:
评论

相关推荐

    Java System类详解_动力节点Java学院整理

    Java的System类是Java开发工具集(JDK)提供的重要工具类,主要用于处理与系统相关的操作。由于它被声明为final,所以无法被其他类继承。System类的主要功能包括: 1. **标准输入输出**: - `System.in`:表示标准...

    Java应用开发详解

    7. **数组复制与排序**:Java提供了`System.arraycopy()`方法方便地复制数组。`Arrays.sort()`函数用于对数组进行排序,可以处理基本类型和对象数组。理解不同的排序算法,如快速排序、归并排序和插入排序,可以帮助...

    详解Java常用排序算法-计数排序

    System.arraycopy(sortedArr, 0, arr, 0, n); } private static int getMax(int[] arr) { int max = arr[0]; for (int i = 1; i ; i++) { if (arr[i] &gt; max) { max = arr[i]; } } return max; } ...

    java API使用-中文word

    ### Java API 使用详解 #### 一、Java 面向对象基本概念 Java是一种完全的面向对象编程语言,除了原始数据类型(如int、double等),几乎所有事物都被视为对象。对象是类的实例,拥有状态(属性)和行为(方法)。...

    详解Java合并数组的两种实现方式

    在Java中有多种方式可以实现数组合并,本文将介绍两种常见的实现方式,即使用System.arraycopy()方法和ArrayUtils.addAll()方法。 1. System.arraycopy()方法 System.arraycopy()方法是Java提供的一种本地方法,...

    day009 java基础进阶-定时器,数据结构.doc

    在`IntArray`类中,可以通过构造函数指定初始容量,当需要添加新元素而数组已满时,创建一个两倍于原数组长度的新数组,并使用`System.arraycopy()`方法将旧数组的元素复制到新数组中。 通过理解和掌握这些知识点,...

    Java数组讲解

    System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); // 复制原有数组内容到新数组 ``` #### 1.3 数组的特点 - **优点**:数组提供了一种快速访问元素的方式,通过索引值可以迅速定位并获取元素。 - ...

    Java中的数组复制(clone与arraycopy)代码详解

    Java中的数组复制(clone与arraycopy)代码详解 Java中的数组复制是通过clone和arraycopy两个方法来实现的。clone方法是Object类的protected方法,用于创建对象的副本,而arraycopy是System类的静态方法,用于将一...

    操作java数组的常用工具类

    ### 操作Java数组的常用工具类详解 在Java编程中,数组是一种常见的数据结构,用于存储固定大小的同类型元素集合。为了简化数组的操作并提高代码的效率与可读性,Java提供了`Arrays`类,这是一个包含了一系列静态...

    java中List的用法和实例详解

    Java提供了一些实现List接口的类,如ArrayList、LinkedList和Vector。 1. ArrayList: 基于动态数组实现,适合随机访问但插入和删除效率较低。由于其内部是数组,因此索引访问速度快。 2. LinkedList: 基于双向链表...

    java学习记录.docx

    - 数组复制可以通过 `java.lang.System` 类的 `arraycopy()` 方法实现。 - 数组排序可以使用 `java.util.Arrays` 类提供的方法实现。 - **示例**: ```java int[] a = new int[10]; System.arraycopy(source, 0,...

    (zz)java集合类总结

    - **System.arraycopy()**:这是一个用于复制数组的方法,效率高于其他方式。 - **Arrays.fill()**:用于填充数组,可以方便地初始化数组。 - **Collections.reverse()**:反转列表中的元素顺序。 - **Collections....

    java数组知识点详解带你快速掌握数组的使用

    在这个知识点详解中,我们将深入探讨Java数组的创建、初始化、访问以及数组相关的操作。 首先,我们来看看如何创建一个Java数组。在Java中,数组是通过指定类型和长度来创建的。例如,如果我们想要创建一个存储10个...

    CoreJava笔记.doc

    - 使用`System.arraycopy()`方法。 - 或者使用`Arrays.copyOf()`方法。 #### 六、对象和类 **6.1 面向对象与面向过程** 面向对象编程(OOP)强调的是对象及其交互,而面向过程编程更关注于如何实现算法。 **6.2 ...

    JAVA面试基础

    ### JAVA面试基础知识点详解 #### 一、Java与JavaScript的类型系统 - **Java**:Java是一种**强类型语言**,这意味着在Java中定义变量时必须指明其数据类型,并且一旦定义之后就不能更改。例如: - 变量必须先...

    高手总结java常用API(免费下载)

    ### Java常用API详解 #### 一、Java面向对象基本概念 Java是一种主要基于面向对象编程(OOP)的语言,除了原始数据类型(如int、double等),几乎所有其他元素都是对象。对象是类的一个实例,拥有其特定的状态和行为...

    java学习笔记,全程

    - 数组操作:学习数组的创建、遍历,以及如何使用System.arraycopy进行数组复制。 - 排序算法:理解并实现冒泡排序、选择排序、插入排序、快速排序等基本排序算法。 7. **多线程** - 线程的概念:解释并发与并行...

    Java Arrays工具类用法详解

    "Java Arrays工具类用法详解" Java Arrays工具类是Java语言中的一种工具类,主要提供了数组元素的修改、复制、排序等操作。该类中的方法均为static修饰的,可以直接通过Arrays.xxx(xxx)的形式调用方法。 1. Arrays...

    我的java笔记

    - **数组拷贝**:通过System.arraycopy()方法或new Array()方法实现数组复制。 #### 六、对象和类 - **面向对象与面向过程**:对比两种编程范式的优缺点。 - **成员变量和局部变量**:了解它们的存储位置、生命...

Global site tag (gtag.js) - Google Analytics