2015-06-22 60 views
0

我有这个循环运行大约1000000次。动态创建对象并将它们存储为字段

    while ((line = br.readLine()) != null) { 
         if(!(line.isEmpty())){ 

         data = new JSONObject(line); 
         name = (String)data.get("name"); 
         surname = (String)data.get("surname"); 
         ar.put(name, surname); //an array 

        } 
       } 

什么是有它这样的效率方面的优势(如果有的话)的数据,姓名的领域相比,在运行时创建一个新的动态对象

    while ((line = br.readLine()) != null) { 
         if(!(line.isEmpty())){ 

         JSONObject data = new JSONObject(line); 
         String name = (String)data.get("name"); 
         String surname = (String)data.get("surname"); 
         ar.put(name, surname); //an array 

        } 
       } 

回答

4

有赢没什么区别,因为你只是改变了变量的范围。由于你没有使用范围之外的变量,因此生成的字节码也将相同(可以用javap进行试用)。

所以使用第二种方式来清晰。

编辑:事实上,如果你有作为类的字段的变量,字节码可能会不同。性能将取决于JIT如何最终结束,但不太可能存在显着差异(即使如此,第二种方法将更容易优化 - >可能更快)。

+0

甚至没有在GC过程? – user5035902

+0

您正在创建相同数量的对象,因此GC不太可能受到影响。 – Kayaman

+1

什么是GC在这里打扫?你将它们存储在一个数组中,所以仍然引用它们。但是,如果你没有存储它们,GC在两个例子中都会以同样的方式进行清理。 – vlatkozelka

0

第一种方法应该执行得更快,因为它使用的每个变量(数据,名字,姓氏)的每一个循环的单一参考
虽然秒方法创建新的参考每个循环中的每一个。所以你最终创造了每个参考!

然而,创建一个参考是一个恒定的时间操作,不应该打扰你。你应该专注于让你的代码易读和清洁。因此,由于最佳做法表明变量的范围尽可能小,所以如果我知道这种方法会运行多次,我只会选择第一种方法。 (我的意思是,你可以等待一些毫秒更长,如果它只是要运行一次)

性能提示:既然你是关心性能,并给予你大致知道迭代的次数,我建议你初始化容量Map

+0

引用不会在运行时创建。除了关于初始容量的部分,你的回答是完全错误的。 – Kayaman