string
的值为12。'string_input'存储输入的数字
string
在代码中声明并初始化
而string_input是在运行时由用户输入的
string_5=string_input.substring(0);
System.out.println(string==string_5);
当我们输入“12”时,它返回true
string_5=string_input.substring(1);
System.out.println(string==string_5);
现在当我们输入“012”时,它会返回false
为什么会这样? :/
答案 0 :(得分:5)
回答标题问题:仅在技术上运行时,因为在编译期间没有String
池来实习。
但是,源程序文件中定义的所有字符串文字和常量值字符串在程序启动时会自动实现,并且可以使用String#intern()
方法实现其他字符串。
此外,对于未来的读者来说:OP的结果似乎是一个IDE的怪癖。 OP最初通过BlueJ的自定义public static void main(String string_input)
主方法签名作为命令行参数输入输入。显然BlueJ在幕后做了一些恶作剧,使这个匹配成为JLS要求的public static void main(String[] args)
签名,显然那些恶作剧涉及在某个时刻实际输入字符串,导致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);
}
注意最后一行:如果beginIndex == 0
,则返回原始String
本身。因此,在案例1中,string
确实指向与string_5
相同的对象,因此会打印true
。
但是,如果beginIndex != 0
,则会创建新的String
,因此string
不再指向与string_5
相同的对象,因此{{1}打印出来。
答案 1 :(得分:2)
什么时候在编译时或运行时完成?
当您调用String.intern()时,Interning在运行时完成。
然而,另一个进程,称为“常量池”,在编译时发生。所有相等的字符串文字都缩减为类的目标代码中的单个条目。