CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

" String ".trim() == "String") !!!!!!!!!!!!!!!!!!!!!

楼主dy18(黎明之目)2002-11-29 16:55:09 在 Java / J2SE / 基础类 提问

if("   String   ".trim()   ==   "String")  
  System.out.println("Equal");  
  else  
  System.out.println("Not   Equal");   //Not   Equal  
   
  if(   "STRING".toUpperCase()   ==   "STRING")    
  System.out.println("Equal");    
  else    
  System.out.println("Not   Equal");   //Equal  
   
  if("String".substring(0)   ==   "String")    
  System.out.println("Equal");    
  else    
  System.out.println("Not   Equal");   //Equal  
   
  后面的注解相应为结果  
  请大家解释一下这是为什么?????  
   
   
   
   
   
  问题点数:50、回复次数:22Top

1 楼peppi(静坐听风)回复于 2002-11-29 17:00:20 得分 2

if("   String   ".trim()   ==   "String")     //trim()去掉空格,字符串判断相等  
                                                                        //用equals("String"),其它类似  
  System.out.println("Equal");  
  else  
  System.out.println("Not   Equal");   //Not   Equal  
  Top

2 楼dy18(黎明之目)回复于 2002-11-29 17:02:23 得分 0

跟据我上面的请大家给我解释一下Top

3 楼hotenM(南京)回复于 2002-11-29 17:07:28 得分 2

邪门外道,比较为什么要这么用,然后去研究?Top

4 楼jokerjava(冷血)回复于 2002-11-29 17:10:11 得分 2

==是判断对象相等的  
  字符串不能改变  
   
  改变字符串可用StringBuffer类  
  第一个不等因为"   String   "和String不是同一个对象   "   String   "前面有空格  
  第二个相等因为"String"是同一个对String象  
  第三个相等因为subString不能改变字符串   所以string这个String对象没有变  
  Top

5 楼knight12(12Knight)回复于 2002-11-29 17:19:54 得分 2

第二、第三个例子中  
  前"STRING"和后"STRING",前"String"和后"String"是同一对象实例,所以它们的引用相等。  
  而第一个例子中"   String   "和"String"不是同一个对象实例,所以不相等  
   
  注意:判断对象是否是同意对象用==,判断对象值是否相等用equal()  
  如下例:  
  if("   String   ".trim().equals("String"))  
  System.out.println("Equal");  
  else  
  System.out.println("Not   Equal");   //Equal  
   
  if(   "string".toUpperCase()   ==   "STRING")    
  System.out.println("Equal");    
  else    
  System.out.println("Not   Equal");   //NOT   Equal  
   
  if(   "string".toUpperCase().equals("STRING"))    
  System.out.println("Equal");    
  else    
  System.out.println("Not   Equal");   //EqualTop

6 楼windofsun(太阳风)回复于 2002-11-29 17:31:46 得分 2

TO:   jokerjava(冷血)  
   
  我觉得你的第一和第三点说的有矛盾。  
  看看jdk的源代码:  
                    public   String   trim()   {  
  int   len   =   count;  
  int   st   =   0;  
  int   off   =   offset;             /*   avoid   getfield   opcode   */  
  char[]   val   =   value;         /*   avoid   getfield   opcode   */  
   
  while   ((st   <   len)   &&   (val[off   +   st]   <=   '   '))   {  
          st++;  
  }  
  while   ((st   <   len)   &&   (val[off   +   len   -   1]   <=   '   '))   {  
          len--;  
  }  
  return   ((st   >   0)   ||   (len   <   count))   ?   substring(st,   len)   :   this;  
          }  
   
   
  可以看到,trim方法也是调用了substring方法的。如果第三点象你说的那样,那么trim也应该是这样Top

7 楼beyond_xiruo(CorruptionException)回复于 2002-11-29 17:39:48 得分 2

字符串比较应该用equalsTop

8 楼redkey(7P狼)回复于 2002-11-30 09:36:24 得分 2

楼上说的对Top

9 楼wjmmml(笑着悲伤)回复于 2002-11-30 09:45:38 得分 2

楼主比较的是内存地址,而不是2个串。Top

10 楼junnef(启天)回复于 2002-11-30 10:53:33 得分 2

你还是去研究一下对象的比较和普通简单类型数据的比较的区别最好。Top

11 楼goldennight(痞子蔡)回复于 2002-11-30 21:31:22 得分 2

我也同意楼上的皮皮,我一开始也有过这样的混淆问题。Top

12 楼fastmask(我心烦)回复于 2002-11-30 21:42:32 得分 2

其实dy18   (黎明之目)   是想考大家的编译原理,反复的进行对象引用的比较。他在后面正偷偷乐呢。Top

13 楼m_catfish(小胖)回复于 2002-11-30 21:55:28 得分 2

对同一常量字符串的引用是同样的。  
  String   a   =   "abc";  
  String   b   =   "abc";     则   a   ==b   是成立的  
  可是如果  
  String   a   =   new   String("abc");  
  String   b   =   new   String("abc");   则   a==b是不成立的  
  Top

14 楼ncube(ncube)回复于 2002-12-01 16:50:20 得分 2

knight12说得很好!用==不能说明两者是否相同,应该是用函数~~~~~~!Top

15 楼prosong(prosong)回复于 2002-12-01 17:32:55 得分 2

字符串内容的比较用   equals  
   
  若是查看两个指针是否指向同一个对象   才是   ==Top

16 楼wang_zheng_wz(我打开任督二脉)回复于 2002-12-01 18:22:45 得分 2

Strings   have   the   special   characteristic   that   if   a   program   has   several   String   objects   that   contain   identical   character   sequences,   then   those   String   objects   all   map   to   the   same   memory.  
   
   
   
  public   class   Test   {  
          public   static   void   main(String[]   args)   {  
                  String   s1   =   "aaa";  
                  String   s2   =   "aaa";  
                  System.out.println(s1   ==   s2);  
          }  
  }Top

17 楼asdmonster(呆鸟四号)回复于 2002-12-01 19:14:52 得分 2

代码就懒得分析了。  
   
  对Object,     ==   比较的是二者是不是对同一Object的Reference;  
                          equales()   比较的是二者的content是否一致。Top

18 楼coolskeeter(文子)回复于 2002-12-02 09:09:07 得分 2

把你所有的==换成  
  equals。  
   
  ==比较的是两个obj   reference。  
  equals是比较两个字符串的内容。Top

19 楼jokerjava(冷血)回复于 2002-12-02 10:19:59 得分 8

String   a   =   "String";  
  String   b   =   "String";     则   a   ==b   是成立的  
  a和b都只向"String"对象  
  所以他们相等  
  String   s   =   "   String   ";  
  String   tmp   =   s.trim();  
  tmp   ==   s;他们都指向"   String   "对象   所以不等于"String"对象  
   
  String   s   =   "String";  
  String   tmp   =   s.trim();    
  tmp   ==   s   ==   "String"  
  所以("String".substring(0)   ==   "String")是成立的Top

20 楼luxizhao(安)回复于 2002-12-02 10:53:55 得分 4

api     中trim、substring和toUpperCase方法中,  
  如果不需要变换的话是不会改变对象的,如  
  果需要变换都是会返回个new   String()的。  
  而如果对象是new   String()生成的,就是个  
  新的对象。和原来的String是不同的。所以:  
  "   String   ".trim()   !=   "String"  
  "STRING".toUpperCase()   ==   "STRING"  
  "String".substring(0)   ==   "String"Top

21 楼macoff(天堂)回复于 2002-12-02 11:03:00 得分 2

‘==’只有是同一个对象时才成立(指向同一内存)  
  ‘.equals()’才能比较对象的值Top

22 楼copyright(笨蛋白痴神经质)回复于 2002-12-06 10:33:51 得分 2

equals()比较内容是深度比较么?Top

相关问题

  • " String ".trim()== "String"为什么是false?
  • string
  • String
  • string
  • string->???
  • string
  • string
  • String
  • 关于String类的trim()方法的问题
  • Trim

关键词

  • equal
  • equalif
  • 相等
  • 字符串
  • elsesystem
  • 对象
  • trim
  • println
  • touppercase
  • 判断

得分解答快速导航

  • 帖主:dy18
  • peppi
  • hotenM
  • jokerjava
  • knight12
  • windofsun
  • beyond_xiruo
  • redkey
  • wjmmml
  • junnef
  • goldennight
  • fastmask
  • m_catfish
  • ncube
  • prosong
  • wang_zheng_wz
  • asdmonster
  • coolskeeter
  • jokerjava
  • luxizhao
  • macoff
  • copyright

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo