> Java中String相同字符串的地址是否相同??
在Java执行时会维护一个String池(pool),对于一些可以共享的字符串对象,会先在String池中查找是否存在相同的String内容(字符相同),如果有就直接返回,不创建新对象。 s2中的值是引用的s1的值,自己并没有创建对象,所以比较后的结果是true。
String s1="jj";
String s2="jj";
System.out.println(s1==s2); //true
String类型中equal比较 两个字符串值是否相等 是因为String底层重写了equal()
System.out.println(s1.equal(s2)); //true
equal:
Student stu1=new Student(22,"jay");//创建两个成员属性值相同的对象
Student stu2=new Student(22,"jay");
System.out.println(stu1.equals(stu2)); // false
//Object父类中equal 比较的是两个对象的内存地址是否相同
//如果要使用equal 比较两个对象的成员属性值 需要重写equal
//java底层Object中的equal()方法
public boolean equals(Object obj) {
return (this == obj); //this是stu1
}
重写equal:
public boolean equal(Object obj){
//比较内存地址是否相同 相同返回true
if(this==obj){
return true;
}
//判断obj的值是否为空以及两个比较两个类型是否相同
if(obj==null||this.getClass()!=obj.getClass()){
return false;
}
//这个地方需要强转 因为传过来的是Object对象 不然获取不了stu2的成员属性值
//如果将传过来的Object改为Student 则无需强转
Student stu2=(Student) obj;
return this.age==stu2.age&&this.name.equal(stu2.name);//比较成员属性值
}
System.out.println(stu1.equals(stu2)); //重写equal之后 true