[JAVA] List,对象引用,复制list和赋值

原创 2014年11月16日 13:37:06

首先,在java中没有C语言的指针概念,但是对象传递默认就是引用。

如:

Person person = new Person(1,"name",23);//初始化一个person
Person me = person;//新建一个Person对象me,并以person初始化
me.setAge(18);//修改me的年龄为18
//结果:person的年龄‘也’修改为18


此处,修改me的成员属性其实就是修改person,因为me=person之后,me就是一个person的引用,和C、C++的引用一样。


这个性质可以很方便的继承C、C++的编程习惯,参数传递不用返回,因为调用某方法的时候的返回参数是有限的,而且返回对象实在是不科学。

那么就可以放心的把返回参数用来标记方法的执行结果[如,成功或者失败],参数就让传入的对象来默认接收方法的执行效果。

举例:

/**
	 * @param file
	 * @return 初始化文件信息,获取KEY,创建文件缓存区域
	 */
	public String initFile(KAOSHI_FILE file, String name, String ext) {
		String path = BASE_PATH + "KAOSHI_ZIP";
//				+ name.substring(0, name.indexOf('_'));
		exsit = false;
		File dir = new File(path);
		if (!dir.exists()) {
			dir.mkdirs();// 创建目录
		}
		File f = new File(path+"/" + name + ext);
		if(f.exists())
			exsit = true;
		try {// FINAL.DIR+PictureFile
			file.setFile(new FileOutputStream(new File(path+"/" + name + ext)));
			file.setKey(Encrypt.GetNewKey(new byte[256]));
		} catch (FileNotFoundException g) {
			g.printStackTrace();
			return null;
		}
		file.setPath(path + name + ext);
		return path+"/" + name + ext;
	}


这里是我的一片段代码,KAOSHI_FILE 对象中有一个成员是OutputStream,此处是用于初始化其输出文件。此方法的返回值就可以用于标示方法的执行情况,比如返回是否成功创建文件,此处就简单的返回文件路径,因为KAOSHI_FILE中没有存储文件路径的成员。此处仅仅是举例,代码质量请忽略。

方法成功执行后,调用方法时传入的file对象此时就已经初始化了其OutputStream成员。


在java中,对象的传递都是引用,基础类型的复制、复制和传参就不是了。基础数据类型:int,float,double,long,byte,short,boolean.

比如:

int old = 123;
int new_ = old;
new_ ++;

new_的修改与old无关,int是基础类型数据。



List,是对象,所以其传递也和基础对象一样,引用。

但是,此处还有一个注意点,因为List个容器,而且是个对象容器,那么此处就会有值得注意了。

通过以上的描述,那么以下代码片段很显然:

List<Person> persons = PersonService.getPersonsByAgeIn(18,23);//初始化一个Person的List。
List<Person> backPersons = persons;
显然,对backPersons的操作会直接改变persons的数据。

backPersons只是定义了一个数据引用,并没有初始化申请空间。现在的backPersons就是persons。

那么,换以下方式呢?

List<Person> persons = PersonService.getPersonsByAgeIn(18,23);//初始化一个Person的List。
List<Person> backPersons = new ArrayList<Person>();
backPersons.addAll(persons);
这样给backPerson赋值之后再操作内部数据,此处分两种情况,如果对backPersons的操作是在List层的操作,对persons没有影响。也就是说,如果backPersons只是对内部数据做了简单的删除、排序或者添加等操作。但是,如果操作深入到List内部数据层,那么backPersons数据修改就会影响到persons的数据。

原因很简单,

backPersons已经new了空间,然后在addAll的时候,为每一个persons的数据都new了一个空间,然后给backPersons插入数据。

所以,对backPersons只是对内部数据做了简单的删除、排序或者添加等操作是不会影响persons的数据。

但是,在给backPersons插入数据的时候,并没有重新为其内部数据对象new新的数据空间,也就是说,backPersons中的每一个Person都是persons一样的Person。

那么,操作的时候就会想回影响。


java将一个List赋值给另一个List相关问题

#声明和实例化 声明:ArrayList a, 仅仅只是声明了一个list变量,其未来作用相当于C++中的引用变量,亦或者相当于一个对象块的索引,但并未为其分配具体的完整的对象所需要的内存空间,其所...
  • w305172521
  • w305172521
  • 2016年09月11日 11:58
  • 27265

JAVA List 对象赋值

JAVA List对象如果直接使用“=”进行赋值,比如 如下代码: Listlist1 = new ArrayList(); Listlist2 = new ArrayList(); li...
  • greyfreedom
  • greyfreedom
  • 2015年04月24日 13:56
  • 8783

java List<String>的初始化

java List的初始化
  • u013956878
  • u013956878
  • 2017年02月23日 14:25
  • 29220

java 细节 有关list的赋值

import java.util.ArrayList; class Test{ public static void main(String[] args) { int t...
  • jianguo_liao19840726
  • jianguo_liao19840726
  • 2013年06月21日 18:19
  • 712

java对象赋值操作

对基本数据类型的赋值时很简单的。但是为对象赋值时,却有一点不一样;对一个对象进行操作的时候,我们真正操作的是对对象的引用。所以当将一个对象赋值给另一个对象,实际上是将对象的引用从一个地方赋值到另一个地...
  • haiyoung
  • haiyoung
  • 2015年08月16日 15:14
  • 1655

Java中将对象加入集合,实质是加入对象的引用的复制

在Java中,我们经常使用封装好的集合框架(如List),下面看一个例子。import java.util.*; public class Test { public static void...
  • L_BestCoder
  • L_BestCoder
  • 2017年03月10日 18:30
  • 1382

java List类型传递是值还是引用?如何传递值?

直接传递,毋庸置疑,引用。 如何传递值呢,这里有三段代码作为例子来描述: 1. List list=new List(); ModifyList(list); Console.WriteLine(l...
  • svenlives
  • svenlives
  • 2016年11月11日 17:19
  • 2724

java 属性拷贝工具类

import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; import java.u...
  • tengdazhang770960436
  • tengdazhang770960436
  • 2015年06月10日 11:08
  • 1722

java之克隆一个对象(此对象包含list引用)-clone()

在java克隆的时候,所要克隆的对象包含比较复杂的数据结构如:list集合等一些复杂的引用的时候,该怎么克隆。 深克隆,浅克隆的实现和理解。...
  • qq_27093465
  • qq_27093465
  • 2015年11月09日 16:09
  • 5817

java List复制:浅拷贝与深拷贝

List浅拷贝众所周知,list本质上是数组,而数组的是以地址的形式进行存储。 如上图将list A浅拷贝给list B,由于进行的是浅拷贝,所以直接将A的内容复制给了B,java中相同内容的数组指向...
  • DeMonliuhui
  • DeMonliuhui
  • 2017年01月16日 12:16
  • 15469
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[JAVA] List,对象引用,复制list和赋值
举报原因:
原因补充:

(最多只允许输入30个字)