内存分配给字符串变量

时间:2013-12-27 11:09:27

标签: java

请确认两个代码中的哪一个是有效的a或b。其中string在循环内部或外部循环中定义。 请注意。

a)

for(int i=0;i<configIndexNumber.size();i++){
                     ConfigurationDetailsObject oldIndex =(ConfigurationDetailsObject)configIndexNumber.get(i);
                     String Key = oldIndex.getVehConfigNo()+oldIndex.getBaseEngineKey()+oldIndex.getEngineCode()+oldIndex.getTestGroupId()+oldIndex.getTransConfig()+oldIndex.getInertiaWeightClassNo()+oldIndex.getAxleRatioValue();
                        if(!configIdxNnb.containsKey(Key))
                        {
                                newConfigIndexList.add(oldIndex);
                                configIdxNnb.put(Key,oldIndex);
                        }

                 }

b)中

String Key=null;

 for(int i=0;i<configIndexNumber.size();i++){
                     ConfigurationDetailsObject oldIndex =(ConfigurationDetailsObject)configIndexNumber.get(i);
                     Key = oldIndex.getVehConfigNo()+oldIndex.getBaseEngineKey()+oldIndex.getEngineCode()+oldIndex.getTestGroupId()+oldIndex.getTransConfig()+oldIndex.getInertiaWeightClassNo()+oldIndex.getAxleRatioValue();
                        if(!configIdxNnb.containsKey(Key))
                        {
                                newConfigIndexList.add(oldIndex);
                                configIdxNnb.put(Key,oldIndex);
                        }

                 }

5 个答案:

答案 0 :(得分:1)

这两种情况没有区别。在这两种情况下,您都要为String变量赋值。

我知道你有什么优化。如今,这种优化通常由编译器完成。但同样,它无论如何都不适用于您的情况。

答案 1 :(得分:0)

内存方面会有细微差别。 JVM足以智能管理。

但是你应该在所需的最小范围内声明一个变量。即第一个案例对我来说很好。

我不记得来自efffective java的确切引用,它类似于

  

当我们使用尽可能小的范围时,垃圾收集器会做得最好。

但是如果你想在循环之外访问那个变量,那么第二个就是选项。

答案 2 :(得分:0)

与C ++不同,本地变量不需要在使用它的范围之前在java中单独初始化。所以不需要初始化

String Key = null 

在使用之前。仅在使用局部变量时初始化局部变量是一种更好的编程习惯。从某种意义上说,只有在for循环中使用它时,才能为堆中的变量分配内存。

请参阅oracle文档以更好地理解变量初始化

http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

答案 3 :(得分:0)

在效率方面无关紧要,但(a)在两者中更好 - 代码可读性在最小可能范围内定义变量更好。

答案 4 :(得分:0)

  

执行时间与执行时间差异很小/可忽略不计   2 ...编译器优化你的代码......

public class Test
{
    public static void main(String[] args) {

        long l = System.nanoTime();
        func1("hi");
        System.out.println(System.nanoTime()-l);
        long l1 = System.nanoTime();
        func2("hi");
        System.out.println(System.nanoTime()-l1);
    }

    public static void func1(String str)
    {
        for(int i=0;i<10000;i++)
        {
            String s= str ;
        //  System.out.println(s);
        }
    }

    public static void func2(String str)
    {String s= null;
        for(int i=0;i<10000;i++)
        {
             s= str ;
        //  System.out.println(s);
        }
    }
}

O/p : 
1. 277530
   265557

2. 267694
  243747