java数组对象的复制

  一、首先,区分数组间的赋值  

 1 import java.util.Arrays;
 2 public class Array {
 3     public static void main(String[] args)
 4     {
 5         int[] array = new int[]{0, 1, 2, 3};
 6         int[] arr = array;  //书组赋值
 7         System.out.println(Arrays.toString(array)); //输出array
 8         System.out.println(Arrays.toString(arr)); //输出arr
 9         arr[0] = 4;
10         System.out.println(Arrays.toString(array));
11         System.out.println(Arrays.toString(arr));
12     }
13 }

  输出结果如下:

  

  这叫数组赋值,数组之间没有隔离性

  二、数组对象的复制,实现数组的隔离性

  首先介绍数组赋值的2中方法:

  1.System.arraycopy(Object src, int srcPos, Object dest,int destPos, int len)

    src - 源数组。 
        srcPos - 源数组中的起始位置。 
        dest - 目标数组。 
        destPos - 目标数据中的起始位置。 
        length - 要复制的数组元素的数量。

    该方法是Java API提供的,底层是c++写的,所以效率很高。   

 1 import java.util.Arrays;
 2 public class Array {
 3     public static void main(String[] args)
 4     {
 5         int[] array = new int[]{0, 1, 2, 3};
 6         int[] arr = new int[4]; //{0, 0, 0, 0}
 7         System.arraycopy(array, 0, arr, 0, array.length);
 8         System.out.println(Arrays.toString(array)); //输出array
 9         System.out.println(Arrays.toString(arr)); //输出arr
10         arr[0] = 4;
11         System.out.println(Arrays.toString(array));
12         System.out.println(Arrays.toString(arr));
13     }
14 }

  

  可以看到数组之间有隔离性,这就是数组的复制

  2.Arrays.copyOf(JDK1.6版本提供的方法,所以你的开发环境JDk必须是1.6及以上)

  该方法对于不同的的数据类型有不同的重载方法 

 1 //复杂数据类型
 2 public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
 3         T[] copy = ((Object)newType == (Object)Object[].class)
 4             ? (T[]) new Object[newLength]
 5             : (T[]) Array.newInstance(newType.getComponentType(), newLength);
 6         System.arraycopy(original, 0, copy, 0,
 7                          Math.min(original.length, newLength));
 8         return copy;
 9     }
10 public static <T> T[] copyOf(T[] original, int newLength) {
11 &nbsp;&nbsp;&nbsp;&nbsp;return (T[]) copyOf(original, newLength, original.getClass());
12 }

  由U类型复制为T类型?
  original - 要复制的数组 
  newLength - 要返回的副本的长度 
  newType - 要返回的副本的类型

  

1 //基本数据类型(其他类似byte,short···)
2 public static int[] copyOf(int[] original, int newLength) {
3         int[] copy = new int[newLength];
4         System.arraycopy(original, 0, copy, 0,
5                          Math.min(original.length, newLength));
6         return copy;
7     }
时间: 2024-10-06 12:37:53

java数组对象的复制的相关文章

java数组对象的浅层复制与深层复制

实际上,java中数组对象的浅层复制只是复制了对象的引用(参考),而深层复制的才是对象所代表的值.

Java中对象的复制

假如说你想复制一个简单变量.很简单: 1 int n = 5; 2 int m = n; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况.但是如果你复制的是一个对象,情况就有些复杂了. 假设说我是一个beginner,我会这样写: 1 class Student { 2 private int number; 3 4 public int getNumber() { 5 return number;

JAVA 数组算法(复制、查找、插入)

一.复制数组算法 //数组复制算法 public class Test{ public static void main(String[] args){ int[] arrA = {100,800,500,600,700}; int[] arrB = new int[arrA.length]; //用for循环把A的对应下标值复制给B for(int i=0;i<arrA.length;i++){ arrB[i] = arrA[i]; } //输出arrB for(int i=0;i<arrB

java bean 对象属性复制框架BeanMapping-01-入门案例

项目简介 Bean-Mapping 用于 java 对象属性赋值. 项目中经常需要将一个对象的属性,赋值到另一个对象中. 常见的工具有很多,但都多少不够简洁,要么不够强大. 特性 支持对象属性的浅拷贝 变更日志 变更日志 快速开始 准备 JDK1.8 及其以上版本 Maven 3.X 及其以上版本 maven 项目依赖 <dependency> <groupId>com.github.houbb</groupId> <artifactId>bean-mapp

Java数组操作利器:Arrays工具类

java.util.Arrays提供大量的工具方法来操作数组,这些方法全是静态方法. 1 便捷创建List public static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表. public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } 典型用法:List<String> stooges = Arr

[转载]Java数组扩容算法及Java对它的应用

原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组对象是不可扩容的. 2)利用数组复制方法可以变通的实现数组扩容. 3)System.arraycopy()可以复制数组. 4)Arrays.copyOf()可以简便的创建数组副本. 5)创建数组副本的同时将数组长度增加就变通的实现了数组的扩容.  源码展示: 1 public class Array

Java对象的复制

Java中对象的赋值分为浅拷贝和深拷贝. 1.对象浅拷贝 1 public class CloneTest{ 2 static class Emp{ 3 String name; 4 int age; 5 Date hireDate; 6 } 7 public static void main(String[] args){ 8 Emp emp1=new Emp(); 9 Emp emp2=emp1; 10 } 11 } 这种用“=”赋值的情况下就是对象的浅拷贝.在内存中emp1和emp2都指向

Java 数组复制之clone方法

一.源码 public class Test1 { public static void main(String[] args) { // Student[] arrs = new Student[] { new Student() { id = "22" } }; C# 可以简写法,Java不支持 Student[] arrs = new Student[1]; Student st = new Student(); st.id = 12; st.name = "qwe&q

转载---Java集合对象的深度复制与普通复制

原博文:http://blog.csdn.net/qq_29329775/article/details/49516247 最近在做算法作业时出现了错误,原因是没有弄清楚java集合的深度复制和浅度复制的区别. 1.首先是对Java集合对象得浅复制与深度复制的理解 普通的集合复制只是将内存中栈的地址快拷贝一份,使得一个新的集合对象指向这个地址块,但是集合中的对象变量却是指向堆中的同一块区域.所以当拷贝的集合修改了集合对象内的数据,那么源集合对象也就随之改变了,这样的效果我们称之为Java集合对象