class Compare
{ String s=new String("a");
public void fun()
{ String s=new String("a")
System.out.println(s==this.s);
}
}
像这而==比较对象输出是false,这儿成员变量和方法中的变量一模一样,==比较地址不相等。s对象在堆中开辟内存空间,在栈中存储引用,也就是地址值。这儿成员变量和局部变量中,在栈中的地址没有共享,而是两个不同地址所以输出是false?
{ String s=new String("a");
public void fun()
{ String s=new String("a")
System.out.println(s==this.s);
}
}
像这而==比较对象输出是false,这儿成员变量和方法中的变量一模一样,==比较地址不相等。s对象在堆中开辟内存空间,在栈中存储引用,也就是地址值。这儿成员变量和局部变量中,在栈中的地址没有共享,而是两个不同地址所以输出是false?
因为堆地址所指的东西不同,所以输出false。一般比较两个对象的相等的话,一般用equal()方法比较,这样比较直观。也可以重写 equal()方法得到自己想要的结果
String类下有一个equal()方法,你可以去api文档看看。
String s2=new String("abc");表示在栈区创建一个引用(地址)指向了堆区的new String()对象,而这堆区的对象指向了字符串常量池中中"abc";
String s3=new String("abc");道理也是一样栈区创建一个引用(地址)指向了堆区的new String()对象,这个对象也指向了池中的"abc"
注意:两次new出来的对象地址不可能是一样的,这里s2,s3指向是不同的,java之所以这样设置两层指向,为了提高效率,面试中常考
{ String s="a";
public void fun()
{ String s="a";
System.out.println(s==this.s);
}
}
可以试试这个!