一个关于String的问题

laolik 2012-09-13 02:29:00
好吧,我承认我可能是Out了。

String s1="android";
String s2="android";

if(s1==s2)
System.out.println("s1==s2");

if(s1.equals(s2))
System.out.println("s1.equals(s2)");

印象中,无论是书本、视频,还是论坛上讨论起来的时候,都是s1 equals s2;直到今天下午,看一同事写的代码时用了 ==,正想批评他,结果一debug,竟然 if(s1==s2)里边的代码执行了。

这是什么情况?是我记得不对,还是语法改了?
...全文
150 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqulyk 2012-09-13
  • 打赏
  • 举报
回复
"android"是一个常量,而常量的值是不会改变的。
所以当LZ写 String s1 = "android" String s2 = "android"的时候,只生成了一个String实例,s1和s2都是引用的同一个"android",所以s1 == s2的结果应该是true(毕竟同一个实例的地址是一样的)。当然,使用equals肯定是true了,毕竟s1和s2的内容也一样。

如若你使用String s1 = new String("android"); String s2 = new String("android"); 这是就分别为s1和s2生成了一个实例,故此时使用==的结果是false,而使用equals的结果是true。
实际上,这里生成了三个"android",第一个是"android"常量,另外两个s1和s2分别利用之前的常量生成了两个String实例。

我也初学java,能理解LZ的困惑,同事,如果说得不对的地方也忘高人指正。
laolik 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

String str1 = "android";
String str2 = "android";
System.out.println(str1==str2); //true
1、编译器先处理String str1 = "android";它会在栈中创建一个变量为str1的引用,然后查找栈中是否有android这个值,如果没找到,就将android存放进来,然后将str1指向androi……
[/Quote]

了解了,看来真是我学艺不精啊
laolik 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

String s1="android";
String s2="android";
因为android这个字符串是字符串常量池中,所以s1和s2的地址都是指向一个地方的,所以地址也是相等的
[/Quote]

了解了,看来真是我学艺不精啊
抱抱枯叶 2012-09-13
  • 打赏
  • 举报
回复
2楼是对滴 string有个字符串常量池 当你string a=“a” 的时候 就把a放入池中 然后你string b=“a”他会在池中查找有没有这个字符串 有就返回地址 没有就在池中创建一个 然后返回地址 所以用等也是可以的
wu6660563 2012-09-13
  • 打赏
  • 举报
回复
String是默认final,内存中找到有android这个字符串,就会直接引用先前的内存地址,内存地址一致
haorengoodman 2012-09-13
  • 打赏
  • 举报
回复
String s1="android";
栈中如果有,则直接引用已经存在的android,如果不存在,则在栈中生成一份新的android
String s2="android";
明显,android现在已经在栈中存在了,所以s2直接引用栈中的android,所以,无论是==还是equils()都是相等的。
领完楼主还可以试着new 一个android,new出来的对象是在堆中,每次new出来的都是一个新的对象,所以equils()应该是相等的,==就为false了。
laolik 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

String s1= new String("android");
String s2= new String("android");
再试试。
[/Quote]

这个我知道,不同对象内存地址不一样,==肯定是false。

但我纠结的是String s="android";这种写法
雪馨 2012-09-13
  • 打赏
  • 举报
回复
String str1 = "android";
String str2 = "android";
System.out.println(str1==str2); //true
1、编译器先处理String str1 = "android";它会在栈中创建一个变量为str1的引用,然后查找栈中是否有android这个值,如果没找到,就将android存放进来,然后将str1指向android。
2、 接着处理String str2 = "android";在创建完b的引用变量后,因为在栈中已经有android这个值,便将str2直接指向android。这样,就出现了str1与str2同时均指向android的情况
3、使用new String("android")会直接在堆内存中创建新的android值。
安特矮油 2012-09-13
  • 打赏
  • 举报
回复
String s1="android";
String s2="android";
因为android这个字符串是字符串常量池中,所以s1和s2的地址都是指向一个地方的,所以地址也是相等的
_Gx 2012-09-13
  • 打赏
  • 举报
回复
String s1= new String("android");
String s2= new String("android");
再试试。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧