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开发工具集(JDK)提供的重要工具类,主要用于处理与系统相关的操作。由于它被声明为final,所以无法被其他类继承。System类的主要功能包括: 1. **标准输入输出**: - `System.in`:表示标准...
7. **数组复制与排序**:Java提供了`System.arraycopy()`方法方便地复制数组。`Arrays.sort()`函数用于对数组进行排序,可以处理基本类型和对象数组。理解不同的排序算法,如快速排序、归并排序和插入排序,可以帮助...
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] > max) { max = arr[i]; } } return max; } ...
### Java API 使用详解 #### 一、Java 面向对象基本概念 Java是一种完全的面向对象编程语言,除了原始数据类型(如int、double等),几乎所有事物都被视为对象。对象是类的实例,拥有状态(属性)和行为(方法)。...
在Java中有多种方式可以实现数组合并,本文将介绍两种常见的实现方式,即使用System.arraycopy()方法和ArrayUtils.addAll()方法。 1. System.arraycopy()方法 System.arraycopy()方法是Java提供的一种本地方法,...
### Java常用API详解 #### 一、Java面向对象基本概念 Java是一种主要基于面向对象编程(OOP)的语言,除了原始数据类型(如int、double等),几乎所有其他元素都是对象。对象是类的一个实例,拥有其特定的状态和行为...
在`IntArray`类中,可以通过构造函数指定初始容量,当需要添加新元素而数组已满时,创建一个两倍于原数组长度的新数组,并使用`System.arraycopy()`方法将旧数组的元素复制到新数组中。 通过理解和掌握这些知识点,...
System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); // 复制原有数组内容到新数组 ``` #### 1.3 数组的特点 - **优点**:数组提供了一种快速访问元素的方式,通过索引值可以迅速定位并获取元素。 - ...
Java中的数组复制(clone与arraycopy)代码详解 Java中的数组复制是通过clone和arraycopy两个方法来实现的。clone方法是Object类的protected方法,用于创建对象的副本,而arraycopy是System类的静态方法,用于将一...
### 操作Java数组的常用工具类详解 在Java编程中,数组是一种常见的数据结构,用于存储固定大小的同类型元素集合。为了简化数组的操作并提高代码的效率与可读性,Java提供了`Arrays`类,这是一个包含了一系列静态...
Java提供了一些实现List接口的类,如ArrayList、LinkedList和Vector。 1. ArrayList: 基于动态数组实现,适合随机访问但插入和删除效率较低。由于其内部是数组,因此索引访问速度快。 2. LinkedList: 基于双向链表...
- 数组复制可以通过 `java.lang.System` 类的 `arraycopy()` 方法实现。 - 数组排序可以使用 `java.util.Arrays` 类提供的方法实现。 - **示例**: ```java int[] a = new int[10]; System.arraycopy(source, 0,...
- **System.arraycopy()**:这是一个用于复制数组的方法,效率高于其他方式。 - **Arrays.fill()**:用于填充数组,可以方便地初始化数组。 - **Collections.reverse()**:反转列表中的元素顺序。 - **Collections....
- 使用`System.arraycopy()`方法。 - 或者使用`Arrays.copyOf()`方法。 #### 六、对象和类 **6.1 面向对象与面向过程** 面向对象编程(OOP)强调的是对象及其交互,而面向过程编程更关注于如何实现算法。 **6.2 ...
### JAVA面试基础知识点详解 #### 一、Java与JavaScript的类型系统 - **Java**:Java是一种**强类型语言**,这意味着在Java中定义变量时必须指明其数据类型,并且一旦定义之后就不能更改。例如: - 变量必须先...
### Java常用API详解 #### 一、Java面向对象基本概念 Java是一种主要基于面向对象编程(OOP)的语言,除了原始数据类型(如int、double等),几乎所有其他元素都是对象。对象是类的一个实例,拥有其特定的状态和行为...
- 数组操作:学习数组的创建、遍历,以及如何使用System.arraycopy进行数组复制。 - 排序算法:理解并实现冒泡排序、选择排序、插入排序、快速排序等基本排序算法。 7. **多线程** - 线程的概念:解释并发与并行...
"Java Arrays工具类用法详解" Java Arrays工具类是Java语言中的一种工具类,主要提供了数组元素的修改、复制、排序等操作。该类中的方法均为static修饰的,可以直接通过Arrays.xxx(xxx)的形式调用方法。 1. Arrays...
- **数组拷贝**:通过System.arraycopy()方法或new Array()方法实现数组复制。 #### 六、对象和类 - **面向对象与面向过程**:对比两种编程范式的优缺点。 - **成员变量和局部变量**:了解它们的存储位置、生命...
#### 四、`Object`类详解 `Object`类是所有Java类的直接或间接父类,它提供了一些常用的方法: - **`clone()`**: 创建对象的浅复制,需要注意的是新生成的对象与原对象不是同一个对象。 - **`equals(Object obj)`**...