字符串问题 谢谢

ComeTrue1987 2012-08-25 06:54:35
String s1 = "ja";
String s2 = s1+ "va";
String s3= "java";

System.out.println(s2==s3);
输出为什么为true
...全文
234 25 打赏 收藏 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
java_freshman01 2012-08-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

靠。。。楼主。。。误我。。。我还以为你结果是正确的呢。。。。
[/Quote]
NB
火光闪耀 2012-08-26
  • 打赏
  • 举报
回复
只知道创建一个String对象,会把对象放入String常量池中,然后==比较的是地址,那么"ja"+s1这个的值是java,没错啊,不清楚为什么不等于s3.
  • 打赏
  • 举报
回复
这是字符串中的“==”和equal()的问题,==比较的是字符串的地址,equal比较的是内容。
meacial 2012-08-26
  • 打赏
  • 举报
回复
我的理解是这样的:

关于字符串的创建有两种方式:
1.String s1 = new String("java");
2.String s2 = "java";

两种创建方式在内存中是有区别的:
1.对于String s1 = new String("java");用new创建一个String对象,是在内存的堆中,开辟空间,创建一个String类型的对象,而s1是这个对象的一个引用,s1指向该String对象的地址。
用new创建对象,new多少次,就产生多少个对象。
2.对于String s2 = "java";在创建对象时,先查看堆中,有没有与将要创建对象“java”相同的对象存在,如果有,不会真正的创建一个对象,而是这个引用s2直接指向已存在的那个对象;如果没有,就才创建一个对象。

上面所说的,对象的引用(s1,s2),是存放在栈中的
引用指向该对象(“java”)的地址,就是将对象的地址,赋值给引用。
a790851624 2012-08-26
  • 打赏
  • 举报
回复
这个问题在论坛上是解释不清的,我建议你问一下老师,找一下相关资料,或者是到百度上搜一下“字符串 静态缓冲池”,实在不行,可以加我的Q,我的用户名去掉"a"就是了。
肾虚码农 2012-08-26
  • 打赏
  • 举报
回复
和字符串的不变性有关,
String s2 = s1+ "va";并不是从字符串对象池中找了,s1+"va" 由于字符串s1改变了,所以创建了个新对象。
小傅哥 2012-08-26
  • 打赏
  • 举报
回复
楼主是来坑爹的
shuanghanyandan 2012-08-26
  • 打赏
  • 举报
回复

String s1 = "ja";
String s2 = s1+ "va";
String s3= "java";

System.out.println(s2==s3);
==比较的是内存地址,s2是通过s1+“va”然后放在s2这个变量里面的,很明显和s3指的内存地址是不一样的,所以结果是false啊。要比较两个字符串的值是否相等应该用equal。
qq563292236 2012-08-26
  • 打赏
  • 举报
回复
String s1 = "ja";//堆内存中创建一个对象里面的内容为"ja",栈内存的s1指向该对象

String s2 = s1+ "va";//堆内存创建另外一个对象里面的内容为"java",栈内存的s2指向该对象

String s3= "java";/*由于是String str="";格式,故堆内存不会创建一个新对象,开始会从堆里的一个池里去找是否存在字符串为java的对象,这时s2刚好满足,故找到s2并赋给s3,这样就形成了s2,s3同时指向同一个对象,故他们相等为true.*/
qq563292236 2012-08-26
  • 打赏
  • 举报
回复
String s1 = "ja";//堆内存中创建一个对象里面的内容为"ja",栈内存的s1指向该对象

String s2 = s1+ "va";//堆内存创建另外一个对象里面的内容为"java",栈内存的s2指向该对象

String s3= "java";/*由于是String str="";格式,故堆内存不会创建一个新对象,开始会从堆里的一个池里去找是否存在字符串为java的对象,这时s2刚好满足,故找到s2并赋给s3,这样就形成了s2,s3同时指向同一个对象,故他们相等为true.*/
2399 2012-08-25
  • 打赏
  • 举报
回复

String s1="java";
String s4="java";
System.out.println(s1==s4);


这样才是true的
zhaoming262350 2012-08-25
  • 打赏
  • 举报
回复
如果是equals()方法,两者是相等的,因为equals()在这儿比较的是字符串的字面值,而“==”对于原生数据类型,比较两边的值是否相等,对于引用类型比较的是是否指向同一个对象,也就是两边的地址是否相等
书断华 2012-08-25
  • 打赏
  • 举报
回复
汗、、、写错单词了、、
String s2="ja"+s1;
这个代码的执行过程是这样的
StringBuffer value = new StringBuffer();
value.append("ja");
value.append(s1);
s2 = value.toString();
书断华 2012-08-25
  • 打赏
  • 举报
回复
String s2="ja"+s1;
这个代码的执行过程是这样的
StringBuffer value = new StringBuffer();
value.append("ja");
value.append(si);
s2 = value.tonString();

所以S2和S3是不同的对象,那就不同了 就出现false。

我的理解不对请大家改正
mybook1122 2012-08-25
  • 打赏
  • 举报
回复
字符串引用的是个地址,地址指向“ja”、“va”、“java”。地址肯定不相等。没见过用string==string这种比较方法的。所以提供了equal方法。
riyunzhu 2012-08-25
  • 打赏
  • 举报
回复

package com.riyun.test;

public class Demo {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

String s1="va";
String s2="ja"+s1;
String s3="java";
System.out.println(s2==s3);//false
System.out.println(s2.equals(s3));//true

StringBuffer sb1=new StringBuffer("va");
StringBuffer sb2=new StringBuffer("ja");
StringBuffer sb3=new StringBuffer("java");
System.out.println(sb3==sb2.append(sb1));//false
System.out.println(sb3.equals(sb2.append(sb1)));//false

}

}



我也不知道为什么,求大神!
结贴是美德 2012-08-25
  • 打赏
  • 举报
回复
乐死我了。。。。。。。。。。。。。。。。
riyunzhu 2012-08-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
靠。。。楼主。。。误我。。。我还以为你结果是正确的呢。。。。
[/Quote]看到这里我就一直在笑啊亲,不是笑你,而是笑你的笔记做的太好了啊!但是却是个false!
金墨痴 2012-08-25
  • 打赏
  • 举报
回复
靠。。。楼主。。。误我。。。我还以为你结果是正确的呢。。。。
  • 打赏
  • 举报
回复
关于这个字符串比较的问题你可以去我空间里看看,里面有篇关于这个的文档,你让我在这给你解释,我也有点迷,怕解释不对!!!!
加载更多回复(3)

62,620

社区成员

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

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