1. 程式人生 > >[JAVA] List,物件引用,複製list和賦值

[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。

那麼,操作的時候就會想回影響。