Java 之浅复制和深复制

1 浅复制和深复制区别
浅复制:浅复制只是复制本对象的原始数据类型,如int、float、String,对于数组和对象引用等是不会复制的。因此浅复制是有风险的。
深复制:不但对原始数据类型进行复制,对于对象中的数组和对象引用也做复制的行为,从而达到对对象的完全复制。

2 代码示例

package com;

import java.util.ArrayList;

public class Test implements Cloneable {

	// 私有属性
	private ArrayList<String> nameList = new ArrayList<String>();

	// 添加内容
	public void add(String s) {
		this.nameList.add(s);
	}

	// 获得ArrayList对象
	public ArrayList<String> get() {
		return this.nameList;
	}

	// clone方法
	@Override
	public Test clone() {
		try {
			Test test = (Test) super.clone();
			test.nameList = (ArrayList<String>) this.nameList.clone();    //A
			return test;
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建test对象
		Test test = new Test();
		// 设置test对象内容
		test.add("aa");
		test.add("bb");

		// 打印显示test中的nameList内容
		System.out.println("test:" + test.get());

		// 克隆test对象生成test2对象
		Test test2 = test.clone();
		// 添加"cc"内容到test2对象中
		test2.add("cc");
		// 打印显示test2中的nameList内容
		System.out.println("test2:" + test2.get());

		// 打印显示test中的nameList内容
		System.out.println("test:" + test.get());

	}
}

 

3 浅复制运行结果

test:[aa, bb]
test2:[aa, bb, cc]
test:[aa, bb, cc]

 

4 深复制运行结果

test:[aa, bb]
test2:[aa, bb, cc]
test:[aa, bb]

 

5 结果分析
从结果分析和代码来看,深复制对浅复制只是多了A处的代码。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法。 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识。 java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。 java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得
在eclipse的preferences里,Java-Code style-Code templates,Comments-Type编辑成如下     @author ${name:git_config(user.name)} (${mail:git_config(user.email)})
一 8种基本数据类型和8种包装类的对应关系 基本数据类型 包装类 byte Byte short Short int Interger long Long char Character float Float double Double boolean Boolean   二 自动装箱和自动拆箱 1 概念介绍  自动装箱:把一个基本数据变量直接赋给对应的包装类变量或者赋值给Object变量。  自动拆箱:允许直接把包装类对象直接赋给对应的基本类型变量。 2 代码示例 public class AutoBo

通用查询,保存方法 - 2016-09-24 14:09:04

基于jqgrid页面通用查询、保存方法

mysql的事务处理与锁表 - 2016-09-24 14:09:04

数据库的事务处理可以保证一组处理结果的正确性。mysql中只有INNODB和BDB引擎的数据表才支持事务处理,对于不支持事务的MyISAM引擎数据库可以使用表锁定的方法来实现相同的功能。 mysql的事务处理主要有两种方法来实现。 1、用begin,rollback,commit来实现。 begin 开始一个事务 rollback 事务回滚 commit 事务确认 Php代码 $conn = mysql_connect('localhost','root','root') or die ("数据连接错误!

Rsa签名算法详解 - 2016-09-23 22:09:05

Rsa签名算法详解 签名生成规则与验证签名规则如下: ① 每次生成签名时该算法都会生成一对对应的公钥和私钥对, ② 所以在应用中一般都会采取使用同一对密钥对进行签名与验签(建议使用静态变量)保证对方验证签名时用的公钥是与你生成签名用的是同一对,否则就不能通过验证 ③ 将自己生成的秘钥对中的公钥交给对方用来验证你的签名,私钥用来生成签名 ④ 同样的对方也会选定一组密钥对将公钥给你用来验证签名,用他的私钥来生成签名 ⑤ 备注:一般对安全性要求比较高的企业,不仅仅限与用rsa签名来保证安全,还会对rsa签名再次

随机产生和为S的N个正整数 - 2016-09-23 14:09:17

如果给你一个问题:“ 随机产生和为S的N个正整数 ”, 你会如何做呢?   针对该问题,解决的方法有很多种。在这篇文章中,我将为大家给出两种比较好理解的解决方法:一个是 “尺子法” ;另外一个是 “锯木头法” 。 ( 名字随便取的,主要是方便理解用 )。   方法一:尺子法   思想: 将给定值S看成一个尺子的长度,那么,生成N个和为S的正整数的问题就变成在尺子中 寻找出N-1个不同的刻度 , 加上最小刻度0和最大刻度S , 一共有N+1个刻度 。 然后,从小到大,计算出相邻刻度的长度,这些长度就可以认为
JVMjava 一、常见配置 1、堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值。如:为5,表示年轻代与年老代比值为1:5,年轻代占整个年轻代年老代和的1/6 -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:8,表示Eden:Survivor=8:2,一个Survivor区占整个年轻代的1/10 -XX:MaxPermSize=n

Java为什么能够跨平台? - 2016-09-23 14:09:05

  这也许是个萌新的问题,但我也想把它记录下来,作为Java学习的开始。   在这个大型企业软件横行的时代,Java的使用率越来越高,当然依旧不少的人不喜欢Java,因为它的设计过于笨重,但其开发效率高也是不可否认的一个优点。   言归正传,今天我们讨论下为什么Java是跨平台的语言,我们知道汇编语言的优点及其显著,就是运行速度极快,因为其就是机器指令的助记符。但缺点也是很突出的,除了读不懂以外(本人弱渣),就是汇编是体系结构依赖的语言。如有8086指令集,也有MIPS指令集等等,而像C,C++就会先翻译成
方法一:     import  java.awt.*;   import  java.awt.image.*;   import  java.io.*;   import  javax.swing.*;   import  com.sun.image.codec.jpeg.*;   public   class  WaterSet {       /** */ /**        * 给图片添加水印        *         * @param filePath        *