java + 提高性能和可扩展性

标签 java performance

下面是一个代码片段,它返回一个类的对象。现在该对象基本上是与循环中的某些参数进行比较。

我担心的是,如果循环中有数千个对象,在这种情况下性能和可扩展性可能会成为问题。请建议如何改进此代码的性能部分

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/

相关文章:

java - 听众应该能够删除听众吗?

Java方法返回空指针?

performance - Azure 云平台上的 T-SQL 过程性能不佳

sql - 只有 2 个不同值的列索引

c++ - 强制 GCC 执行 memcpy 运行时大小检查的循环取消切换?

Java ShutDownHook 在 Windows 上未触发

java - 按所有语言的字母升序对国家/地区进行排序

java - 为什么 Stack 是一个类而 Queue 是一个接口(interface)?

performance - HashMap 和 Vec 之间的内存高效转换

c# - 加速更新 SQL 查询