重构类以提高效率

时间:2019-05-26 06:01:07

标签: java performance jvm

我正在尝试重构一个我认为具有多个内存和运行时效率低下和错误的类。 您能帮我解决这个问题或评论一下我的假设吗?

(例如

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

2。我也认为最好使用哈希表而不是列表,以便从o(1)中的m_strings而不是o(n)中获取m_strings的结果(在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());
}
}

2 个答案:

答案 0 :(得分:0)

从命名开始:避免使用匈牙利表示法,因此请丢弃所有m_前缀!

是的,当查找包含的元素是一项常见的任务时,您显然会使用Set实现,例如HashSet。这对两个数据集(名称​​和数字)都有帮助!

答案 1 :(得分:0)

我同意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

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

实现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);
}