繁体   English   中英

Java中的性能问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM