`
x10232
  • 浏览: 57344 次
  • 来自: 北京
社区版块
存档分类
最新评论

Java对数组的复制

    博客分类:
  • Java
阅读更多
定义一个数组
int[] a={3,1,4,2,5}; 
int[] b=a; 
 
数组b只是对数组a的又一个引用,即浅拷贝。

  如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopy
int[] a={3,1,4,2,5};
int[] b=a.clone();
b[0]=10;
System.out.println(b[0]+"  "+a[0]);

但是clone和System.arrayCopy都是对一维数组的深度复制。

对于二维数组则不一样:
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);

输出为10  10所以clone并不能直接作用于二维数组。

  因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。

  要证明,只需看下面的输出
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);
System.out.println(a[0]==b[0]);

第5句输出为true.用clone对二维数组进行复制,要在每一维上调用clone函数

int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=new int[a.length][];
for(int i=0;i<a.length;i++)
{ 
b[i]=a[i].clone();
} 
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);
System.out.println(b[0]==a[0]);

输出为10  3 false

  小结:

  数组的复制方法现在至少有四个思路:

  1 使用循环结构 这种方法最灵活。唯一不足的地方可能就是代码较多

  2 使用Object类的clone()方法, 这种方法最简单,得到原数组的一个副本。灵活形也最差。效率最差,尤其是在数组元素很大或者复制对象数组时。
protected Object clone() 

  3 使用Systems的arraycopy这种方法被告之速度最快,并且灵活性也较好,可以指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

  4 Arrarys类的copyOf()方法与copyOfRange()方法可实现对数组的复制
static <T> T[] copyOf(T[] original, int newLength)
static <T> T[] copyOfRange(T[] original, int from, int to) 


参考文献http://jingyan.baidu.com/article/e4d08ffddbb7610fd2f60d90.html
分享到:
评论

相关推荐

    java【第4章:数组与方法】_Java新特性对数组的支持

    6. Stream API:Java 8引入的Stream API允许对数组进行函数式操作,如过滤、映射和收集。例如,`int sum = Arrays.stream(numbers).sum();` 计算数组所有元素的和。 7. var关键字:Java 10引入了var关键字,可以在...

    Java开发之Java对数组的复制

     作为写的第一篇Java文章,展望一下开始下面的学习;  数组:  1.数组浅拷贝:  1 public static void main(String[] args)  2 {  3 int [] a={1,3,5,7,8,9};  4 int[] b=a; //这里赋值的...

    JAVA 对数组进行初始化填充的方法示例

    JAVA 对数组进行初始化填充的方法示例 JAVA 中对数组进行初始化填充是一种常见的操作,主要用于初始化数组元素的值。今天,我们将介绍两种对数组进行初始化填充的方法,并通过实例代码进行详细的解释。 知识点一:...

    java 数组求和计算

    - **数组操作函数**:Java的`Arrays`类提供了许多实用方法,如`sort()`排序数组,`equals()`比较数组内容,`copyOf()`复制数组等。 - **集合框架**:`ArrayList`和`LinkedList`等集合类可以动态增长,提供了更多的...

    在java中如何对数组实现添加、删除和插入操作呢?(csdn)————程序.pdf

    总之,虽然Java数组的大小是固定的,但我们可以通过创建新的数组并复制元素来模拟添加、删除和插入操作。然而,这样的做法在性能上可能不如使用Java集合框架中的动态数据结构。因此,在设计程序时,应根据需求和性能...

    java数组及arrays类对数组的操作实例

    本文展示了 Java 数组及 Arrays 类对数组的操作实例,包括数组的初始化、排序、查找、复制、比较等操作。这些操作是 Java 编程中非常重要的一部分,了解这些操作可以帮助我们更好地使用 Java 编程语言。

    Java 的常用包与数组的复制与排序24

    `Arrays`类提供了多种对数组进行操作的方法,如`clone()`用于创建数组的副本,`copyOf()`用于创建指定长度的新数组并复制原有数组的一部分或全部,`equals()`判断两个数组是否相等,`sort()`则是对数组进行排序的...

    Java第5章 数组 含源代码

    Java集合框架中的`Arrays`类提供了对数组排序的方法,如`Arrays.sort()`,可用于整型、字符型等基本类型的数组,也可通过自定义比较器对对象数组进行排序。 八、数组与集合框架的关系 虽然数组是Java的基础,但集合...

    Java 的常用包与数组的复制与排序27

    Java提供了`Arrays.sort()`方法来对数组进行排序: 1. 对于基本类型数组,如整数数组,可以直接调用`Arrays.sort(int[])`: ```java int[] arr = {5, 2, 8, 1, 9}; Arrays.sort(arr); ``` 2. 对于对象数组,`...

    Java数组练习题(带答案).doc

    8. **数组作为参数**:向方法传递数组时,传递的是数组的引用,这意味着在方法内部对数组的修改会影响到原数组。 9. **数组初始化**:数组初始化包括声明数组类型、指定数组长度以及为每个元素赋值。 10. **数组...

    JAVA-puzzle-game.zip_JAVA 拼图 作业_java 拼图

    这可能涉及到对数组或集合的操作,以及随机数生成器。 4. 状态检查:当用户尝试重新组合拼图时,需要实时检查当前状态是否正确。这可以通过比较当前布局与原始图像进行,可能需要使用位图操作或自定义的比较算法。 ...

    java 集合和数组的详细总结(并随着讲解带9个例子)

    1. **数组排序**:使用Arrays.sort()方法对数组进行排序。 2. **集合遍历**:使用for-each循环遍历集合中的元素。 3. **集合转换为数组**:使用toArray()方法将集合转换为数组。 4. **集合的增删改查**:添加元素、...

    02-Java基础(数组-常见操作-遍历

    例如,我们可以使用Arrays类提供的方法对数组进行排序: ```java Arrays.sort(numbers); ``` 如果需要复制一个数组,可以使用Arrays.copyOf()方法: ```java int[] copy = Arrays.copyOf(numbers, numbers.length);...

    java基础之 接收返回数组失败1

    通过这种方式,即使`someMethod()`内部对数组进行了修改,`jg`数组也不会受到影响,因为它们指向的是两个不同的内存区域。这样,我们就可以避免因直接赋值而导致的数组错误,提高程序的稳定性和健壮性。 在日常开发...

    java数组函数(摘自JAVA编程思想)

    - `sortArray()`:对数组进行排序。 - `binarySearch()`:二分查找方法,用于已排序的数组。 3. **数组遍历** 我们可以使用for循环来遍历数组中的所有元素: ```java for (int i = 0; i ; i++) { System.out....

    JAVA复习题(核心JAVA)

    - **安全性增强**:Java提供了对数组越界的保护,当尝试访问超出数组边界的位置时,会抛出`ArrayIndexOutOfBoundsException`异常。 - **动态数组操作**:Java中虽然不能直接改变数组大小,但可以通过创建新数组并将...

    Java期末复习-常用类库

    Arrays类提供了对数组的各种操作,如排序和复制。Comparable接口用于定义对象的自然排序,而Comparator接口则用于自定义比较逻辑。 正则表达式通过java.util.regex包实现,如Pattern和Matcher类,用于字符串匹配和...

    Java中高级核心知识全面解析.pdf

    * ArrayList 是一个动态数组,提供了对数组的操作方法。 5.2 ArrayList 核心源码 * ArrayList 的核心实现是基于数组的动态扩容。 5.3 ArrayList 源码分析 * System.arraycopy() 和 Arrays.copyOf() 是数组复制的...

    Java常用工具类集合

    1. **数据处理**:Java的`java.util`包中的`Arrays`类提供了对数组的各种操作,如排序、查找、填充等。`Collections`类则针对集合框架提供了类似的功能,如排序列表、反转、复制等。此外,`HashMap`和`TreeMap`等...

    Java常用工具类,多年工作积累整理

    1. **`java.util.Arrays`**:这是一个非常基础且重要的工具类,提供了对数组进行操作的各种静态方法,如排序、复制、填充、比较等。例如,`Arrays.sort()`用于对数组进行升序或降序排序,`Arrays.copyOf()`则用于...

Global site tag (gtag.js) - Google Analytics