两个代码段之间是否存在任何重大性能问题?
User user
for(int i =0 ; i < 100 ; i++) {
user = new User() ;
}
和
for(int i =0 ; i < 100 ; i++) {
User user = new User() ;
}
这只是宣言。
答案 0 :(得分:5)
答案 1 :(得分:4)
没有。如果仅在循环中使用user
,则优先选择第二个,但没有性能差异。
答案 2 :(得分:3)
答案:完全一样。
我创建了两个C1和C2类:
class C1 {
public void test() {
String user;
for(int i =0 ; i < 100 ; i++) {
user = new String("s" + i);
System.out.println(user);
}
}
}
并且
class C2 {
public void test() {
for(int i =0 ; i < 100 ; i++) {
String user = new String("s" + i);
System.out.println(user);
}
}
}
使用“javac -source 1.4 -target 1.4”(或1.3)编译它们并对类进行反编译后,我得到了相同的代码:
import java.io.PrintStream;
class C1
{
C1()
{
}
public void test()
{
for(int i = 0; i < 100; i++)
{
String s = new String("s" + i);
System.out.println(s);
}
}
}
和
import java.io.PrintStream;
class C2
{
C2()
{
}
public void test()
{
for(int i = 0; i < 100; i++)
{
String s = new String("s" + i);
System.out.println(s);
}
}
}
使用“javac -source 1.5 -target 1.5”(或1.6)编译它们并对类进行反编译,我也得到了相同的代码:
import java.io.PrintStream;
class C1
{
C1()
{
}
public void test()
{
for(int i = 0; i < 100; i++)
{
String s = new String((new StringBuilder()).append("s").append(i).toString());
System.out.println(s);
}
}
}
和
import java.io.PrintStream;
class C2
{
C2()
{
}
public void test()
{
for(int i = 0; i < 100; i++)
{
String s = new String((new StringBuilder()).append("s").append(i).toString());
System.out.println(s);
}
}
}
答案 3 :(得分:1)
创建新对象将占用此处99%的时间。你在循环中做什么或放置局部变量的位置并不重要。
答案 4 :(得分:0)
应该没有显着差异。在两个循环体中,您为新的User
分配内存。
答案 5 :(得分:0)
同样的问题经常发布。是什么让你认为以任何方式声明变量都很重要。在两个版本中都创建了100个用户对象。完全相同的代码生成。
唯一的区别是这个变量的范围,在版本1中你可以从循环外部访问变量User,在版本2中你不能。取决于是否需要它更喜欢第一个或第二个版本。