porównajTo z prymitywami -> Integer/int


Czy lepiej pisać
int primitive1 = 3, primitive2 = 4;
Integer a = new Integer(primitive1);
Integer b = new Integer(primitive2);
int compare = a.compareTo(b);

lub
int primitive1 = 3, primitive2 = 4;
int compare = (primitive1 > primitive2) ? 1 : 0;
if(compare == 0){
compare = (primitive1 == primitive2) ? 0 : -1;
}

Myślę, że druga opcja jest lepsza, powinna być szybsza i lepiej zoptymalizowana pod kątem pamięci. Ale czy nie są równi?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby poprawić wydajność, zwykle najlepiej jest utrzymywać kod tak prosty i bezpośredni, jak to tylko możliwe, a to często działa dobrze (ponieważ JIT najlepiej optymalizuje ten kod). W Twoim przypadku najprawdopodobniej najszybsze będą również najprostsze przykłady.
Zrobiłbym też
int cmp = a > b ? +1 : a < b ? -1 : 0;

lub dłuższa wersja
int cmp;
if (a > b)
cmp = +1;
else if (a < b)
cmp = -1;
else
cmp = 0;

lub
int cmp = Integer.compare(a, b);// in Java 7
int cmp = Double.compare(a, b);// before Java 7

Najlepiej nie tworzyć obiektu, jeśli nie musisz.
Z punktu widzenia wydajności ten pierwszy jest najlepszy.
Jeśli wiesz na pewno, że nie przepełnisz, możesz użyć
int cmp = a - b;// if you know there wont be an overflow.

nie będziesz szybszy niż teraz.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Posługiwać się
Integer.compare(int, int)
http://docs.oracle.com/javase/ ... 28int,%20int%29... I nie próbuj mikro-optymalizacji kodu, jeśli nie możesz udowodnić, że masz problemy z wydajnością.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Czy mogę zasugerować trzecią opcję
((Integer) a).compareTo(b)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zawijanie prymitywu int w obiekt typu integer będzie kosztować trochę pamięci, ale różnica będzie znacząca tylko w bardzo rzadkich przypadkach (zapotrzebowanie na pamięć) (tablica z ponad 1000 elementów). Nie polecam używania nowego konstruktora Integer (int a) w ten sposób. Wystarczy:
Integer a = 3;

Dla porównania jest Math.signum (podwójne d).
compare= (int) Math.signum(a-b);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dla wersji przed 1.7, powiedziałbym, że odpowiednikiem Integer.compare (x, y) jest:
Integer.valueOf(x).compareTo(y);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Są już w więzieniu. Dlaczego po prostu nie użyć odejmowania?
compare = a - b;

Zauważ, że Integer.compareTo () niekoniecznie zwraca tylko -1, 0 lub 1.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli używasz java 8, możesz utworzyć komparator za pomocą tej metody:
Comparator.comparingInt(i -> i);

jeśli chcesz porównać z odwrotną kolejnością:
Comparator.comparingInt(i -> -i);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli potrzebujesz tylko wartości logicznej (jak to prawie zawsze się dzieje), pomoże Ci następujący wiersz:
boolean ifIntsEqual = !((Math.max(a,b) - Math.min(a, b)) > 0);

A to działa nawet w Javie 1.5+, może nawet w 1.1 (nie mam). Powiedz nam, czy możesz to przetestować w wersji 1.5-.
To też:
boolean ifIntsEqual = !((Math.abs(a-b)) > 0);

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się