我正在尝试重构一个类,我猜该类存在一些内存和运行时效率低下和错误的问题。 你能帮我解决这个问题或者评论一下我的假设吗?
(例如
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/