[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 对象赋值

JAVA List对象如果直接使用“=”进行赋值,比如 如下代码: Listlist1 = new ArrayList(); Listlist2 = new ArrayList(); li...

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

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

java把一个List集合的内容复制到另外一个List集合里

通过addAll();方法即可mListStub.addAll(list);java字符串大小写转换str.toLowerCase转为小写str.toUpperCase转为大写...
  • stimgo
  • stimgo
  • 2016年12月15日 12:06
  • 4426

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

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

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

在Java中,我们经常使用封装好的集合框架(如List),下面看一个例子。import java.util.*; public class Test { public static void...

Java List Map 初始 赋值例子

Map map = new HashMap() {{          put( 1 , "name" );           put( 2 , "sex" );  }};  List list ...
  • subuser
  • subuser
  • 2014年03月12日 18:06
  • 19475

java怎么用一行代码初始化ArrayList

java怎么用一行代码初始化ArrayList
  • xiacsd
  • xiacsd
  • 2014年11月07日 17:40
  • 4536

java强引用,软引用,弱引用,虚引用

用了Java怎么长时间一直不知道原来Java还有四种引用类型,这个引用类型和我们平常说的可不一样。这里的引用类型不是指数据类型的一种,而是指Java中的引用所分的四种类型。强引用: Java中的引用,...

添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?

问题:添加一个对象到集合中时,集合里面存放的是对象的引用还是对象本身?   答:对象的引用。以下代码可以证明: 01.import java.util.ArrayList; 02....

Java语言中ArrayList对象能直接赋值给另一个ArrayList对象

num1=num2是将num1的地址值指向num2,而num1原先的对象会被垃圾回收。但是在这里我想告诉你的是集合之间的复制方法:方法一:ArrayList num2 = new ArrayList(...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[JAVA] List,对象引用,复制list和赋值
举报原因:
原因补充:

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