gopain

成功的定义不同,但是不可复制。

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

首先,在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
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭