Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 连续采访_Java_String - Fatal编程技术网

Java 连续采访

Java 连续采访,java,string,Java,String,如果我有下面这样的代码,它是可行的吗 String b = "abc"; String c = "def"; for (int i=0;i<100000000;i++){ String a = b + c; // i got a different object , ahhh! } String b=“abc”; 字符串c=“def”; 对于(int i=0;i 它对系统有何影响?我们可以改进它吗?如何改进 字符串是不可变的,即每次连接时它都会创建(或从池中重用)一个新的字符串对

如果我有下面这样的代码,它是可行的吗

String b = "abc";
String c = "def";
for (int i=0;i<100000000;i++){
    String a = b + c; // i got a different object , ahhh!
}
String b=“abc”;
字符串c=“def”;
对于(int i=0;i
它对系统有何影响?我们可以改进它吗?如何改进

字符串是不可变的,即每次连接时它都会创建(或从池中重用)一个新的字符串对象。如果要进行循环连接,请使用对象

String b = "abc";
String c = "def";
StringBuilder sb = new StringBuilder();
for (int i=0;i<100000000;i++){
    sb.append(b);
    sb.append(c);
}
result = sb.toString();
String b=“abc”;
字符串c=“def”;
StringBuilder sb=新的StringBuilder();
对于(int i=0;i“b”和“c”存储在池中。但每次都会创建“a”。请使用StringBuilder来阻止它

只是为了帮助你更好地理解它

Object b = new Object(); //b created only once
Object c = new Object(); //c created only once

for(int i = 0; i < 100500; i++) {
    MyClass a = new MyClass(b, c); //a created each loop
}
Object b=new Object();//b只创建一次
对象c=新对象();//c只创建一次
对于(int i=0;i<100500;i++){
MyClass a=新的MyClass(b,c);//a创建了每个循环
}
字符串也一样


正如Vlad提到的——在字符串“b+c”的情况下如果
b
c
未标记为
final
,编译器可能会假定在代码中的某个点,可能会为这些变量指定不同的字符串。因此,当您编写
a=b+c
时,编译器无法假定任何内容
b
c
的ts(它们甚至可能来自用户),因此它必须将它们连接起来并生成一个全新的字符串


当它们是
final
时,编译器可以确定
b
总是
“abc”
c
总是
“def”
,甚至可以推断
(b+c)==“abcdef”
,这样就把它放在一个池中,或者简单地在循环之前进行连接。

b
c
是最终的
b+c
是a。这意味着+操作是在编译名处完成的。然后该行与

String a = "abcdef";

b
c
是非最终值时,它们的值不再被视为常量表达式,字符串连接在运行时完成,并在每次迭代中创建新字符串。

您试图完成什么?好的一个:这是一个面试问题,所以他检查了这家伙在字符串上得到了什么,我无法得到带有最后一个字符串变量和一个字符串变量的图片。运行时获得的值将保留在字符串池中(第一次),对吗?那么你怎么才能得到10000000个对象呢?你必须只得到一个对象,这个对象被反复引用!!为什么它没有从池中重用???一旦创建了它,如果你通过
javap-c
运行你的类,你就会看到在你编写
final
的情况下,编译器放入
“abcdef”
作为一个常量。我不完全确定什么时候东西被放入字符串池中,但我猜它主要是指编译时常量。我假设如果每个字符串都进入池中,这会造成惩罚,因为在检查字符串是否已经在池中之前,您仍然必须创建字符串(如果有意义的话).
String a = "abcdef";