Selon le contrat général de hashCode, deux objets égaux doivent renvoyer des valeurs de hashCode égales. Par conséquent, si égal à est remplacé et qu'ils sont logiquement égaux mais pas la même référence, ils renverront des valeurs différentes que si hashCode n'était pas remplacé.
Si vous vous souciez des performances, mettez en cache la valeur calculée par hashCode.
public String toString() {
ThreadGroup group = getThreadGroup();
if (group != null) {
return "Thread[" + getName() + "," + getPriority() + "," +
group.getName() + "]";
} else {
return "Thread[" + getName() + "," + getPriority() + "," +
"" + "]";
}
}
Appelez super.clone pour lancer. S'il existe une variable mutable, copiez-la en profondeur.
Dans la plupart des cas, il est plus facile de faire une copie d'un objet avec un constructeur ou une méthode de fabrique qu'avec une méthode de clonage. Seul le clone peut faire une meilleure copie des séquences.
package tryAny.effectiveJava;
import static java.util.Comparator.*;
import java.util.Comparator;
import java.util.stream.Stream;
public class CompareTest {
public static void main(String[] args) {
Stream<PhoneNum> s = Stream.of(new PhoneNum(111, 222, 333), new PhoneNum(111, 222, 222),
new PhoneNum(111, 333, 111), new PhoneNum(000, 999, 1));
s.sorted().forEach(System.out::println);
}
}
class PhoneNum implements Comparable<PhoneNum> {
int areaCode;
int prefix;
int lineNum;
public PhoneNum(int areaCode, int prefix, int lineNum) {
this.areaCode = areaCode;
this.prefix = prefix;
this.lineNum = lineNum;
}
private static final Comparator<PhoneNum> COMPARATOR = comparingInt((PhoneNum pn) -> pn.areaCode)
.thenComparingInt(pn -> pn.prefix).thenComparingInt(pn -> pn.lineNum);
@Override
public int compareTo(PhoneNum pn) {
return COMPARATOR.compare(this, pn);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("areaCode:").append(areaCode).append(",prefix:").append(prefix).append(",lineNum:").append(lineNum);
return sb.toString();
}
}
Recommended Posts