[英]Performance Issue in Java
我在Java代码中遇到性能问题。 我必须计算一个进程创建的每个对象的频率。 对象的类型是下面给出的“节点”。 目前,我已经使用下面在test1中给出的HashMap类型技术解决了这个问题。 但是,此过程非常缓慢,因为我的模拟生成了数亿个对象。 此外,我必须在每次迭代期间拆分String,然后重新连接等等。 所以我在想像下面在test2中给出的那样应用技术。 但是HashMap会将每个新对象视为一个新条目,无论对象中的内容如何。 我想知道是否有人知道如何有效地解决这个问题。
public class NewMain {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
String[] a={"c","d"};
int[] b={1,2};
Map<String, Integer> test1=new HashMap<>();
test1.put(new Node(a, b).toString(), 1);
test1.put(new Node(a, b).toString(), 3);
System.out.println(test1.size()); // size is 1
//////////////////////////
Map<Node, Integer> test2=new HashMap<>();
test2.put(new Node(a, b), 1);
test2.put(new Node(a, b), 3);
System.out.println(test2.size()); // size is 2
}
}
class Node{
String[] a;
int[] b;
public Node(String[] a, int[] b) {
this.a = a;
this.b = b;
}
public String toString(){
String result=null;
for(String e:a)
result+=e+"|";
for(int e:b)
result+=e+"|";
return result;
}
}
在您的Node
类中尝试以下操作:
@Override
public int hashCode() {
int result = 1;
for(String e:a)
result = result * 31 + e.hashCode();
for(int e:b)
result = result * 31 + e;
return result;
}
@Override
public boolean equals(Object obj) {
return this.hashCode() == obj.hashCode();
}
这告诉Java,应该通过比较对象的哈希码来比较对象-默认值是比较指针,并确保基于类的内容计算哈希码。 这将为您的test2.size()
调用提供1的结果。
或者,根据上面@ bjlee72的建议,Eclipse给了我:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(a);
result = prime * result + Arrays.hashCode(b);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Node other = (Node) obj;
if (!Arrays.equals(a, other.a))
return false;
if (!Arrays.equals(b, other.b))
return false;
return true;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.