V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Frankhong
V2EX  ›  Java

字符串长度为 0 但又不等于""是怎么回事呢?

  •  
  •   Frankhong · 2020-12-26 23:52:14 +08:00 · 3893 次点击
    这是一个创建于 1460 天前的主题,其中的信息可能已经有所发展或是发生改变。

    String s="hello";

    String substr=s.substring(5);

    System.out.println(substr=="");//打印 false

    System.out.println(substr.length()==0);//打印 true

    Tubering
        1
    Tubering  
       2020-12-26 23:59:35 +08:00
    substr.equals("");
    gainsurier
        2
    gainsurier  
       2020-12-27 00:02:20 +08:00
    undefined hhhh
    jmc891205
        3
    jmc891205  
       2020-12-27 00:03:23 +08:00 via iPhone
    substr 和””是不同的 object
    binbinyouliiii
        4
    binbinyouliiii  
       2020-12-27 00:06:33 +08:00   ❤️ 7
    重修 Java
    momocraft
        5
    momocraft  
       2020-12-27 00:08:27 +08:00
    jawa 里面对象==是引用相等, equals (一般) 是值相等
    tudouxiong
        6
    tudouxiong  
       2020-12-27 00:13:37 +08:00 via Android
    Java 字符串不应该用==比较
    Frankhong
        7
    Frankhong  
    OP
       2020-12-27 00:25:09 +08:00
    Java 里面两个字符串变量需要用 equals 来比较,但是变量和带引号的字符串是可以用==来比较的。并且直接定义一个空字符串,==""是返回 true 的:
    String s="";

    System.out.println(s=="");//返回 true
    Frankhong
        8
    Frankhong  
    OP
       2020-12-27 00:26:20 +08:00
    为什么在这里==""却返回了 false 呢?
    AllenHua
        9
    AllenHua  
       2020-12-27 00:27:23 +08:00 via iPhone
    @Frankhong #7 字符串常量池
    AllenHua
        10
    AllenHua  
       2020-12-27 00:29:00 +08:00 via iPhone
    @AllenHua #9 这条回复 7 楼 ; substr 是 new 出来的 String 对象 reference 不一致 == 比较 肯定是 false
    micean
        11
    micean  
       2020-12-27 00:31:18 +08:00   ❤️ 1
    System.out.println(substr=="");//打印 false
    System.out.println(substr.intern()=="");//打印 true
    Jooooooooo
        12
    Jooooooooo  
       2020-12-27 00:33:32 +08:00
    人和人都是人

    但是是不同的个体
    nmlgb
        13
    nmlgb  
       2020-12-27 00:35:15 +08:00
    你把 c++和 java 搞混了。c++是可以这样的,java 不行。
    chrisia
        14
    chrisia  
       2020-12-27 00:35:18 +08:00
    自己看源码,substring 截取的字符串会以 new String 的方式返回,所以为 false 。另外,比较字符串总是用 equals 就不会有问题。
    nmlgb
        15
    nmlgb  
       2020-12-27 00:35:59 +08:00
    @binbinyouliiii 虽然这是一道很基础的题但我觉得阴阳怪气没有必要。谁没有年轻的时候
    binbinyouliiii
        16
    binbinyouliiii  
       2020-12-27 00:39:23 +08:00
    @nmlgb #15 阴阳怪气?这词现在这么滥用的吗?
    Frankhong
        17
    Frankhong  
    OP
       2020-12-27 00:43:11 +08:00
    @AllenHua 懂了,String 直接赋字符串和 new String 有区别,谢谢兄弟。
    Frankhong
        18
    Frankhong  
    OP
       2020-12-27 00:44:09 +08:00
    @micean 多谢了。
    SingeeKing
        19
    SingeeKing  
       2020-12-27 02:23:52 +08:00
    Java 不支持运算符重载是真的难受
    crayygy
        20
    crayygy  
       2020-12-27 10:45:40 +08:00 via Android
    String 有缓存池的,所以直接 == 有时候也是返回 true,但不代表这是正确做法。
    Ptu2sha
        21
    Ptu2sha  
       2020-12-27 10:49:28 +08:00
    。。。java 学习第一天就是知道字符串比较不是=
    agagega
        22
    agagega  
       2020-12-27 20:46:36 +08:00 via iPhone
    哈哈哈,Java 一大坑
    lewis89
        23
    lewis89  
       2020-12-27 20:58:26 +08:00
    @SingeeKing #19 有运算符重载才难受,你都不知道你的表达式被人重载成什么样了,我基本上看不到 重载不被滥用的情况,好好的用函数不好吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2669 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:30 · PVG 23:30 · LAX 07:30 · JFK 10:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.