java - 重构类以提高效率

标签 java performance jvm

我正在尝试重构一个类,我猜该类存在一些内存和运行时效率低下和错误的问题。 你能帮我解决这个问题或者评论一下我的假设吗?

(例如

1. 我知道 tostring 方法可以使用 stringBuilder 而不是字符串连接...

2.此外,我认为最好使用哈希表而不是列表,以便从 o(1) 中的 m_strings 获取结果,而不是 o(n) (在remove_string_method 中)

你能帮我再批准一下吗? 我也不确定那些选角...... 谢谢

public class SomeClass
{
  private Date m_time;
  private String m_name;
  private List<Long> m_numbers;
  private List<String> m_strings;

  public MyClass(Date time, String name, List<Long> numbers, List<String> strings) {
        m_time = time; m_name = name; m_numbers = numbers; m_strings = strings;
  }

  public boolean equals(Object obj) { 
     if (obj instanceof MyClass) {
        return m_name.equals(((MyClass)obj).m_name);
     }
     return false;
  }

public String toString() {
   String out = m_name;
   for (long item : m_numbers) { 
      out += " " + item;
   }
   return out;
}

public void removeString(String str) {
    for (int i = 0; i < m_strings.size(); i++) { 
      if (m_strings.get(i).equals(str)) {
        m_strings.remove(i);
      }
   }
}

public boolean containsNumber(long number) {
    for (long num : m_numbers) {
     if (num == number) {
       return true;
     }
    }
return false;
}

public boolean isHistoric() {
    return m_time.before(new Date());
}
}

最佳答案

我同意GhostCat您不应该在成员变量前添加 m_

但更重要的是,您应该停止重新发明轮子。

考虑

public boolean containsNumber(long number) {
    return numbers.contains(number);
}

然后,与

public void removeString(String str) {
    for(int i = 0; i < strings.size(); i++) { 
      if(strings.get(i).equals(str)) {
        strings.remove(i);
      }
   }
}

存在一个问题,当您删除索引 i 处的元素时,后续索引会移动一位,因此您会错过刚刚删除的元素之后的一个事件。另一方面,如果您正在考虑使用 HashSet,您可能不想支持重复元素,在这种情况下,您可以在第一次出现后停止。当您不自己实现时,您可以免费获得所有内容。

public void removeString(String str) {
    strings.remove(str);
}

将删除第一个元素(如果不支持重复,则仅删除元素)

public void removeString(String str) {
    strings.removeAll(Collections.singleton(str));
}

将正确删除所有出现的str

是否可以用Set(例如HashSet)替换List取决于您打算如何使用数据,因为这些集合类型有不同的语义。由于您在显示的代码中根本没有使用数据,因此我们在这方面无法说任何话。

当你实现一个equals方法时,你还应该有一个一致的hashCode方法

@Override
public int hashCode() {
    return 1+name.hashCode();
}

@Override
public boolean equals(Object obj) { 
    return obj instanceof SomeClass && name.equals(((SomeClass)obj).name);
}

关于java - 重构类以提高效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56311056/

相关文章:

java - Java 中的 parseDouble 结果为 NumberFormatException

c# - 使用嵌套 Where (LINQ) 子句优化数组迭代

Python - 性能问题 - 过滤 Pandas 数据框与过滤列表 dics vs numpy recs

android - 如何使用加速度计了解我的 Android 设备的移动速度?

java - 如何在 CheckboxTreeviewer 中初始检查元素

java - 为什么我在尝试创建新控制台时遇到异常?

java - java中如何处理从 'VM Options"注入(inject)的参数

java - 自 JVM 启动以来的时间

java.sql.SQL语法错误异常 : Table 'mydb.alien' doesn't exist

java - 如何生成与从 JVisualVM 获得的线程转储类似的线程转储?