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"

画图说明:

猜你喜欢

转载自blog.csdn.net/u012005549/article/details/82794840