鏈表對象內存常見問題

定義了一個Student類,裏面有name,age兩個屬性。將三個不同Student對象存入ArrayList中,出現最後輸出結果一樣的問題。

package blog;

import java.awt.List;
import java.util.ArrayList;
import java.util.Scanner;

public class Test02 {

public static void main(String[] args) {
		//定義Student類型的集合
		ArrayList<Student> array = new ArrayList<Student>();
		//定義Student對象
		Student s = new Student();
		//定義鍵盤錄入對象
		Scanner sc = new Scanner(System.in);
		
//往集合裏填入個學生數據
                for(int i=0;i<3;i++){
			String name;
			int age;
			System.out.println("請輸入姓名:");
			name = sc.nextLine();
			System.out.println("請輸入年齡:");
			age = Integer.parseInt(sc.nextLine());
			s.setName(name);
			s.setAge(age);
			array.add(s);
		}
	        //集合遍歷
	  


      for(int x=0;x<array.size();i++){
          System.out.println("姓名"+array.get(i).getName()                          + "----年齡" + array.get(i).getAge());
		  }  
	}	  

運行結果
這裏寫圖片描述

這裏從結果可以看出來,都是我最後輸入那個學生信息的結果,這是爲什麼呢。原因是,我們將Student 對象定義在循環外面,每次循環重新對同一個Student對象賦值,在內存中ArrayList三個位置都指向同一個Student對象,在Student對象內容的改變時,那麼ArrayLIst裏面裝的值也發生改變,爲了便於理解我畫一張圖。
這裏寫圖片描述

圖片中可以說明前兩次存儲的數據都被第三次替代,但是ArrayList中指向的都是一塊內存,而不是三個所以會出現最後出現的都是第三個數據也就是name:cnj age:23。

所以我們需要將創建學生對象的語句放到循環中去,這樣就會創建三個學生對象,並且集合中不同的索引會指向不同的內存。這時候內存是
這裏寫圖片描述

這樣的結果就是正確的
這裏寫圖片描述

第一次圖示內存模型,說的有問題歡迎指出!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章