【问题标题】:What's the difference in performance when using instance variables v/s anonymous classes?使用实例变量与匿名类时性能有何不同?
【发布时间】:2017-05-17 09:25:43
【问题描述】:

我的程序有以下代码:

List<HashMap<String,SampleClass>> listVariable=new Gson().fromJson(data.getStringData(),new TypeToken<List<HashMap<String,SampleClass>>>(){}.getType());

我可以使用

Gson gson=new Gson();
String jsonData=data.getStringData();
Type tt=new TypeToken<List<HashMap<String,SampleClass>>>(){}.getType();
List<HashMap<String,SampleClass>> listVariable=gson.fromJson(jsonData,tt);

两个问题:

  1. 它们的性能比较如何?
  2. 有什么方法可以将冗长的类型(List&lt;HashMap&lt;String,SampleClass&gt;&gt;)保存到一个变量中,并在我需要它作为类型的任何地方使用它?

【问题讨论】:

  • 你的标题毫无意义。一个是field,另一个是class。要求比较苹果和汽车是没有意义的。
  • 1.不太可能你会看到任何不同。 2. 当然,将TypeReference 保存在您喜欢的任何地方。
  • @shmosel 我相信 OP 要求与 C typedef 等效的 Java,因此您可以为长类型声明分配一个短类型名,例如typedef MyList List&lt;HashMap&lt;String,SampleClass&gt;&gt; 这样您就可以使用MyList listVariable=gson.fromJson(jsonData,tt);。答案是 Java 没有。
  • 由于 JVM 仍然需要创建相同的实例并将引用保存在某处(只是不提供给您),因此差异将很小。两者仍在使用实例。只有一个是内联的,没有声明。
  • 长度本身并不是一件坏事。您期望通过键入更少的击键获得什么工程优势?请记住,在声明中包含类型信息会增加可读性,因为维护者无需四处寻找“typedef”的含义。马上就知道泛型断言是什么。你真的不应该把类型断言扫到地毯下,因为它们记录了有价值的类型关系并强制执行它们。

标签: java json collections gson


【解决方案1】:

第二个版本的唯一区别是您创建了一些“中间”变量。所以理论上,当你将这些语句放入一个方法中时,在堆栈上“拥有”局部变量的最小开销就会发挥作用。

但请放心,在这些可能已经进行繁重的字符串解析和对象创建的调用的上下文中,它们无关紧要。

所以答案是:没有区别;您只需选择在可读性和维护工作方面更适合您(和您的团队)的版本。

除此之外:Java 性能通常取决于这些微妙的细节。

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 2017-09-26
    • 2016-10-27
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2014-09-21
    相关资源
    最近更新 更多