A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 铿锵科技 中级黑马   /  2013-2-4 20:57  /  1956 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-2-6 11:53 编辑

有2个字符串比较,以下都返回true?请问有什么不同之处?
                String s1="abcdefg";
                String s2="abcdefg";//String s2=new String("abcdefg");为什么换成这样(s1==s2)返回false,其他的没变
                System.out.println(s1.matches(s2));
                System.out.println(s1.contains(s2));
                System.out.println(s1.equals(s2));
                System.out.println(s1==s2);

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

11 个回复

倒序浏览
matches  :该字符串用来匹配给定的正则表达式,   简单的说拿一个字符串去与一个模型匹配,完全相等则返回true。
contains: 相当于拿a小串去与一个给定的b大串比较, 如果b里面包含有与a小串相同的就返回true。
equals  :如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。此外,如果两个数组引用都为 null,则认为它们是相等的。
==: 如果两个元素的值相等,则认为他们是相等的。

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李挺 于 2013-2-4 22:01 编辑

s1创建了一个字符串 ”abcdefg“,存放在常量池里面,当s2创建的时候会自动检索发现有这么一个字符串,他就不再建立新的对象,把s2指向它。
所以只有一个对象 ”abcdefg“,然后用s1,s2指向它,当然都一样啦
回复 使用道具 举报
matches 我也不知道,但是另外两个都返回true. contains 表示s1 中是否包含有s2 这个字符序列,返回true. equals 比较s1.s2是否是相同字符序列的对象,因为常量池只有一个abcdef ,故s1s2 指向同一个abcdef. 所以也返回true
回复 使用道具 举报
本帖最后由 王国伟. 于 2013-2-5 22:10 编辑

  String s0=”abcdefg”;

  String s1=”abcdefg”;

  System.out.println( s0==s1 );


  结果为:

  true


因为例子中的s0和s1中的”abcdefg”都是字符串常量,它们在编译时就被确定了,所以s0==s1为true,所以s0==s1。

用new String() 创建的字符串不是常量,不能在编译时就确定,new String() 创建的字符串有自己的地址空间,是运行是创建新对象“abcdefg”的引用。明白这些也就知道为什么是这个结果了。

  
  String s0=”abcdefg ”;

  String s1=new String(”abcdefg ”);

  System.out.println( s0==s1 );



  结果为:

  false






评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报

未命名.JPG (25.23 KB, 下载次数: 45)

未命名.JPG
回复 使用道具 举报
受教了 , 刚刚也在为这个问题纠结
回复 使用道具 举报
杨芳 来自手机 中级黑马 2013-2-6 01:46:56
8#
s1与S2头两个相等,是因为孑符串一但生成将不会改变值,两个类变量指向同一个字符串,所以相等,s2=new string(“abcdef”)对象时,这个语句生成了两个对象,s1,s2指向不同对象所以s1==s2为false。来自: Android客户端
回复 使用道具 举报
王国伟. 发表于 2013-2-5 22:01
String s0=”abcdefg”;

  String s1=”abcdefg”;

是不是这样的格式是常量String s="abc";
这样的格式是变量String s=new String("abc");
回复 使用道具 举报
铿锵科技 发表于 2013-2-6 06:43
是不是这样的格式是常量String s="abc";
这样的格式是变量String s=new String("abc"); ...

String s="abc";这个是在常量池创建一个对象
String s=new String("abc");这个是在堆内存创建两个对象。
回复 使用道具 举报
s1,s2都是对象,两个对象相等的判断条件,是他们指向相同的地址。
回复 使用道具 举报
李培根 发表于 2013-2-6 10:57
String s="abc";这个是在常量池创建一个对象
String s=new String("abc");这个是在堆内存创建两个对象。 ...

明白了,String s="xxx",是常量池,受教了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马