叫我霍小弟 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 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀