下面是一个代码片段,它返回一个类的对象。现在该对象基本上是与循环中的某些参数进行比较。
我担心的是,如果循环中有数千个对象,在这种情况下性能和可扩展性可能会成为问题。请建议如何改进此代码的性能部分
public Widget get(String name,int major,int minor,boolean exact) {
Widget widgetToReturn = null;
if(exact) {
Widget w = new Widget(name, major, minor);
// for loop using JDK 1.5 version
for(Widget wid : set) {
if((w.getName().equals(wid.getName())) && (wid.getVersion()).equals(w.getVersion())) {
widgetToReturn = w;
break;
}
}
} else {
Widget w = new Widget(name, major, minor);
WidgetVersion widgetVersion = new WidgetVersion(major, minor);
// for loop using JDK 1.5 version
for(Widget wid : set) {
WidgetVersion wv = wid.getVersion();
if((w.getName().equals(wid.getName())) && major == wv.getMajor() && WidgetVersion.isCompatibleAndNewer(wv, widgetVersion)) {
widgetToReturn = wid;
} else if((w.getName().equals(wid.getName())) && wv.equals(widgetVersion.getMajor(), widgetVersion.getMinor())) {
widgetToReturn = w;
}
}
}
return widgetToReturn;
}
最佳答案
我认为 Will 的问题是要问的第一个问题 - 为什么你将 Widget 保存在一个无效的数据结构中?
如果您使用这样的结构:
Map<String, Map<WidgetVersion,Widget>> widgetMap;
您可以编写以下代码:
public Widget get(String name,int major,int minor,boolean exact)
{
Widget widgetToReturn = null;
Map<WidgetVersion,Widget> widgetVersionMap = widgetMap.get(name);
WidgetVersion widgetVersion = new WidgetVersion(major, minor);
widgetToReturn = widgetVersionMap.get(widgetVersion);
if(widgetToReturn==null && exact==false)
{
// for loop using JDK 1.5 version
for(Entry<WidgetVersion,Widget> entry : widgetVersionMap.entrySet())
{
WidgetVersion wv = entry.getKey();
if(major == wv.getMajor() && WidgetVersion.isCompatibleAndNewer(wv, widgetVersion))
{
widgetToReturn = entry.getValue();
}
}
}
return widgetToReturn;
}
这样,对于精确搜索,您的搜索时间为 O(1),对于非精确搜索,您的搜索时间为 O(K),其中 K 是小部件具有的版本数。
关于java + 提高性能和可扩展性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3031117/