Java基础拾遗——数组与对象的拷贝

一、数组的拷贝主要有以下几种方式。

1、Object.clone()

  该方法继承自Object类,数组元素为基础数据类型(boolean、char、byte、short、int、float、double、long)或String类型,均可使用。

    int[]  arr1 = {1,2,3};    int[]  arr2 = arr1.clone();  //arr2={1,2,3}

    String[] arr1 = {"a", "b"};   String[] arr2 = arr1.clone();  //arr2= {"a", "b"}

  

2、System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

  传参说明:arraycopy(源数组, 源数组起始位置, 目标数组, 目标数组其实位置, 拷贝长度)

  该方法是本地方法,效率较高。但是使用该方法时,必须传入一个已分配内存的数组作为目标数组。

    int[]  arr1 = {1,2,3};    int[]  arr2 = new i;nt[5];    System.arraycopy(arr1,0,arr2,0,3);  // arra2={1,2,3,0,0}

3、Arrays.copyOf(Object src, int length) 和 Arrays.copyOfRange(Object src, int srcPos, int length)

  传参说明copyOf(源数组, 拷贝长度),copyOfRange(源数组,  源数组起始位置, 拷贝长度)

  这两个方法底层实质上也是使用的System.arraycopy方法,只是经过了一层封装。

    int[]  arr1 = {1,2,3};    int[] arr2 = Arrays.copyOf(arr1,3);  // arra2={1,2,3}

    int[]  arr1 = {1,2,3};    int[] arr2 = Arrays.copyOfRange(arr1,1,2);  // arra2={2,3}

二、对象的拷贝

  基本数据类型的拷贝是值的复制,新旧数组各自独立,因此拷贝后的数组再进行更新,相互不会影响。但是引用类型却不可如此使用(String类型可以使用,是因为其值为final的不可变)。因为对象创建是在堆中分配空间,而数组的拷贝只是拷贝栈中对象的引用,对象改变后,所有指向该对象的引用都会发生变化。因此对象的拷贝要实现“深度拷贝”。

  对象的拷贝,一般采用的方式是让需要拷贝的对象实现 Cloneable 接口,并重写起 clone() 方法。

  若是对象的成员包含其他对象,则必须所有对象均实现Cloneable接口,或者让组合对象实现 Serializable 序列化接口,通过对象流的序列化和反序列化来实现。

  

参考文献:(文章仅做交流学习,侵权即删!!)

1、https://blog.csdn.net/u011669700/article/details/79323251

原文地址:https://www.cnblogs.com/vikezhu/p/12333823.html

时间: 2024-11-02 09:42:22

Java基础拾遗——数组与对象的拷贝的相关文章

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];    

java 基础笔记 基本数据类型对象包装类

基本数据类型对象包装类: 为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作. 用于描述该对象的类就称为基本数据类型对象包装类. 基本数据类型 包装类 byte Byte short Short int Integer long Long float Float double Double char   Character boolean Boolean 该包装对象主要用于基本类型和字符串之间的转换. 基本类型-->字符串 1.基本类型数据+"&quo

java基础面向对象之类与对象

java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 ?封装性:保护内部结构的安全性 ?继承性:在已有的程序结构上扩充新的功能 ?多态性:在某一个该娘范围内满足 2)面向对象开发分为以下几个步骤: OOA(面向对象分析) OOD(面向对象设计) OOP(面向对象编程) 2.类与对象 1)了解类与对象的关系 ?认识类与对象 类与对象是整个面向对象之中最基础的组成单元,类是共性的一个集合,而对象是某一

【C++基础 09】避免对象的拷贝

如果我们要使某个类不具备拷贝的功能,可写一个基类(base classes),然后将copy构造函数声明为private且不去实现它. 具体实现如下: class A { public: A(){} private: A(const A&);//copy构造函数为private且不实现它 A& operator=(const A&); }; class B : public A{ public: B(){} ~B(){} }; void main() { A a ; A a1(a)

Java基础:数组

转载请注明出处:jiq?钦's technical Blog 一.数组初始化 无论如何,当你要实例化一个数组对象的时候,必须要指定其大小. 不能在提供了initializer的情况下再去指定数组的维度!!! 正确的初始化方式有: 方式1:Int[][] array =new int[][]{{1,2},{3,4},{5},{2,4,2,1}}; 方式2:Int[][] array ={{1,2},{3,4},{5},{2,4,2,1}}; 方式3: Int[][] array =new int[

黑马程序员-Java基础之数组

数组 数组是具有相同数据类型的一组数据的集合.例如,球类的集合——足球.篮球.羽毛球等:电器集合——电视机.洗衣机.电风扇等.在程序设计中,可以将这些集合称为数组.数组中的每个元素具有相同的数据类型.在Java中同样将数组看作是一个对象,虽然基本数据类型不是对象,但是由基本数据类型组成的数组则是对象.在程序设计中引入数组可以更有效地管理和处理数据.可根据数组的维数将数组分为一维数组.二维数组…… 一维数组: 1.数组的建立: 数组作为对象允许使用new关键字进行内存分配.在使用数组之前,必须首先

java 基础概念 -- 数组与内存控制

问题1: Java在声明数组的过程中,是怎样分配内存的? 在栈内存中 建一个数组变量,再在堆内存中 建一个 数组对象.至于详细的内存分配细节,还得看 该初始化是 数组动态初始化 还是 数组静态初始化. 问题2: Java数组的初始化方式 有哪几种? 两种:动态初始化 和 静态初始化.动态初始化 指的是 仅仅指定数组的长度,不指明每个数组的元素.  静态初始化 指的是 详细指定数组的每个元素. 问题3: Java 的基本类型数组 和 应用类型数组 之间,在初始化时的内存分配机制有什么差别? Jav

黑马程序员——Java基础语法---数组

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 一.概念         同一种类型数据的集合.简单的来说就是一容器,用来装东西的. 使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素. 二.一维数组的格式 格式1:元素类型 [ ]数组名 = new 元素类型 [元素

JAVA中的数组是对象吗?

1 public class Main{ 2 public static void main(String[] args) 3 { 4 int a[]={1,9}; 5 //Object obj=new int[10]; 6 System.out.println(a.toString()); 7 } 8 } 数组是对象,但是这个数组对象并不是从某个类实例化来的,而是由JVM直接创建的,因此查看类名的时候会发现是很奇怪的类似于"[I"这样的样子,这个直接创建的对象的父类就是Object,