[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。
那麼,操作的時候就會想回影響。