在运行时在java中创建方法而不使用反射

时间:2017-02-24 18:42:49

标签: java performance

我有一个像下面这样的对象的地图,

<key1, ClassAobj>
<key2, ClassBobj>
<key3, ClassCobj>
<key4, ClassDobj>

地图中的对象数量未知。我正在迭代地调用这些对象的方法。

for key in keyset {
    stringbuilder.append(map.get(key).getData())
} 

但是在大​​规模时,这个迭代和stringbuilder.append会导致性能问题,即需要时间。我在考虑创建一个运行时方法来创建一个像

这样的stribuilder
getdata() {

   return (stringbuilder(map.get(key1).getdata() + map.get(key2).getdata() + map.get(key3).getdata() + ... + till all entries in map ))    

}

这是正确的方法吗?如果可以提供示例,请建议是否有更好的方法。

我已经尝试过java反射,它比当前的迭代器版本慢得多,因而避免了它。

P.S。忽略语法,将其视为伪代码。

1 个答案:

答案 0 :(得分:0)

StringBuilder是迄今为止最有效的字符串连接方式,因为你知道发生了什么。

在内部,构建器有一个固定的char数组,在每个附加处存储附加的值。阵列填满后会发生什么?与ArrayList类似,分配了一个带有arr.length * 2的新数组,并将值复制到新数组。这个过程会在需要时反复重复。

根据JavaDoc,默认长度为16.如果您知道结果字符串的大致长度,则更好的方法是在构造函数中提供该长度。这将减少之后的额外开销。