叫我霍小弟 2020-12-15 22:53 采纳率: 60%
浏览 102
已采纳

判断一个字符串str的内容是否为"abcd",可以用if (str == "abcd") 吗

if (str == "abcd") {
}

判断一个字符串str的内容是否为"abcd",为什么不可以使用上面的这种方法呢,而只能使用equals()方法,求大佬解答 

  • 写回答

7条回答 默认 最新

  • GideonYeung 2020-12-16 09:29
    关注
    我感觉这个人说的就很清楚了 https://www.cnblogs.com/geeksongs/p/13567019.html
    因为在java当中比较字符串String实际上比较的是字符串之间的地址,这一点比较奇怪,而比较数字则是货真价实的比较数字的大小。因此我们为了判断两个字符串是否是一样的可以使用:
    
    str.equals(str2)
    
    来进行判断,str是一个字符串,str2是用来比较的字符串。我们在Python当中直接比较就可以了,希望Java也能做出相应的优化。
    
    但是这是为什么呢?因为在Java当中具有两种大的数据类型,一种是引用类型,一种是基本类型。
    
    
    
    1.对基本类型而言,使用==进行比较,是直接比较两个数据类型之间的数值
    
    2.对于引用类型而言,使用==进行比较,是比较的两个数据类型之间的地址
    
    
    
    一般情况下String字符串和数组都不是基本数据类型,它们被当作类来处理,也就是我们所说的引用数据类型,因此我们比较字符串的时候,需要使用str.equals(str2)而不是直接使用==进行比较。
    
    //字符串的常量池
    String str="gre";
    String str2="gre";
    char[] chars={'g','r','e'};
    
    String arraychar=new String(chars);
    System.out.println(str==str2);//true
    System.out.println(str==arraychar);//false
    System.out.println(str2==arraychar);//false
    
    
    对于前面两个定义str和str2而言,str和str2当中所保存字符由于是相同的,因此jvm为了节约内存,就让这个字母在内存当中的地址是相同的,在java当中字符串是不可修改的缘故,
    因此str和str2指向的是同一个内存空间,在这个内存空间当中我们爆保存的是gre这三个单词的ASCii码,which are 97,98,99。而对于使用char所创建的string而言,
    我们开启了一个新的内存空间,因为在内存当中我们保存的是char型字符,which are 'g','r','e',在内存当中保存的东西不一样了,因此地址也就不一样了。
    我们用于比较的时候字符串又是引用类型,因此最后比较的是地址,地址不一样就会输出false,这也是会最终呈持续的后面两行会输出false的缘故。
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗