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?
解决方案 »
- 问一个简单的算法问题
- 怎么将java程序变成像qq,word一样的应用程序
- java局域网游戏的实时通信
- java怎么制作一个透明的JFrame
- 如何解压zip文件?请各位高手给出详细的代码!!
- 求救!!URL中如何包含用网站的户名和密码信息
- 怎样用java实现Access数据库到SQL SERVER数据库的移植
- 送分:求Jbuilder中的几个快捷键!
- 想请教一下大家,有关GUI中的各个类的问题
- 大家在用MDI子窗体时是否用JInternalFrame?
- java jdbc连接SQL server2008数据库问题!在线等!!!谢谢!
- 为什么在JCreator可以运行的程序但在控制台下不能运行?
因为堆地址所指的东西不同,所以输出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);
}
}
可以试试这个!