在编译时或运行时完成的时间内实习?代码中出现这种行为的原因是什么?BlueJ的问题?

iam*_*dav 0 java behavior substring string-interning

输入为当你输入当您在此代码中输入的值string是12.而"string_input"存储输入数 string被声明并在代码初始化而string_input由用户在运行时间期间inputed

情况1

string_5=string_input.substring(0);
System.out.println(string==string_5);
Run Code Online (Sandbox Code Playgroud)

当我们输入"12"时,它返回true

案例2

string_5=string_input.substring(1);
System.out.println(string==string_5);
Run Code Online (Sandbox Code Playgroud)

现在当我们输入"012"时,它返回false

为什么会这样?:/

awk*_*ksp 5

回答标题问题:仅在技术上运行时,因为在编译期间没有String池到实习生.

但是,源程序文件中定义的所有字符串文字和常量值字符串在程序启动时会自动实现,并且可以使用该String#intern()方法实现其他字符串.

此外,对于未来的读者:OP的结果似乎是一个IDE的怪癖,不是所有的东西.OP最初通过BlueJ的自定义public static void main(String string_input)主方法签名作为命令行参数输入输入.显然BlueJ的做幕后的一些有心计,使这场比赛public static void main(String[] args)由JLS所需的签名,显然那些有心计涉及实习在某一点上输入字符串,从而导致OP的结果.

编辑以下答案:看起来我犯了一个小错误.虽然这种答案在某种程度上(某种程度上)起作用,但它依赖于这样一个事实string == string_input,即在OP更新问题之前我无法确认(由于源代码已被删除,显然无法完成).

答案可以在源代码中找到String:

public String substring(int beginIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    int subLen = value.length - beginIndex;
    if (subLen < 0) {
        throw new StringIndexOutOfBoundsException(subLen);
    }
    return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}
Run Code Online (Sandbox Code Playgroud)

注意最后一行:if beginIndex == 0,String返回原始本身.因此,在案例1中,string确实指向同一个对象string_5,因此true被打印.

但是,如果创建beginIndex != 0了一个new String,因此string不再指向同一个对象string_5,因此false打印出来.