String類的內存解析

判斷下面的代碼

class Person{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
}
public class TestString {
	public static void main(String[] args) {
		Person p1 = new Person("AA", 12);
		Person p2 = new Person("AA", 12);
		
		System.out.println(p1 == p2);//1
		System.out.println(p1.equals(p2));//2
		
		//關於String
		String str1 = "AA";
		String str2 = "AA";
		String str3 = new String("AA");
		
		System.out.println(str1 == str2);//3
		System.out.println(str1.equals(str2));//4
		System.out.println(str1 == str3);//5
		System.out.println(str1.equals(str3));//6
		System.out.println(p1.getName() == p2.getName());//7
	}
}

 運行結果與分析:

false:通過new創建的對象都是放在堆中,二者的引用地址不同
true:自定義類型的equals()方法,要重寫以後纔是比較的內容
true:str1和str2共同指向字符串常量池中的一塊內存
true:str1和str2內容一樣,指向地址也一樣,這個true是必然的
false:str3是一個引用對象,其實內部實現還是指向的同一個字符串,但這裏是那引用地址來比,故爲false
true:str3的內容確實是和Str1相同,且最終是同一個"AA"常量
true:再次說明了P1和P2的name屬性指向的地址其實還是字符串常量池中的"AA"

畫圖說明:

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