IT Share you

프리미티브와 비교-> 정수 / 정수

shareyou 2020. 11. 25. 21:37
반응형

프리미티브와 비교-> 정수 / 정수


쓰는 것이 더 낫습니까?

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

또는

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

두 번째가 더 좋고 더 빠르고 더 많은 메모리를 최적화해야한다고 생각합니다. 그러나 그들은 동등하지 않습니까?


성능을 위해 일반적으로 코드를 가능한 한 간단하고 명확하게 만드는 것이 가장 좋으며 이는 종종 잘 수행됩니다 (JIT가이 코드를 가장 잘 최적화하므로). 귀하의 경우 가장 간단한 예가 가장 빠를 수도 있습니다.


나도 할 것이다

int cmp = a > b ? +1 : a < b ? -1 : 0;

또는 더 긴 버전

int cmp;
if (a > b)
   cmp = +1;
else if (a < b)
   cmp = -1;
else
   cmp = 0;

또는

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

필요하지 않은 경우 개체를 만들지 않는 것이 가장 좋습니다.

성능면에서 첫 번째가 가장 좋습니다.

오버플로가 발생하지 않는다는 것을 확실히 알고 있다면 사용할 수 있습니다.

int cmp = a - b; // if you know there wont be an overflow.

당신은 이것보다 빠르지 않을 것입니다.


사용 Integer.compare(int, int). 성능 문제가 있음을 증명할 수 없다면 코드를 마이크로 최적화하려고하지 마십시오.


1/3을 제안해도 될까요

((Integer) a).compareTo(b)  

int 프리미티브를 Integer 객체로 래핑하면 약간의 메모리 비용이 들지만 매우 드문 경우 (메모리 요구 사항) (1000 개 이상의 요소가있는 배열)에서만 차이가 큽니다. 이런 식으로 new Integer (int a) 생성자를 사용하지 않는 것이 좋습니다. 이것으로 충분합니다.

Integer a = 3; 

비교에 대해서는 Math.signum (double d)이 있습니다.

compare= (int) Math.signum(a-b); 

그들은 이미 정수입니다. 왜 빼기를 사용하지 않습니까?

compare = a - b;

Integer.compareTo ()가 반드시 -1, 0 또는 1 만 반환하는 것은 아닙니다.


1.7 이전의 경우 Integer.compare (x, y)에 해당하는 것은 다음과 같습니다.

Integer.valueOf(x).compareTo(y);

Java 8을 사용하는 경우 다음 방법으로 Comparator를 만들 수 있습니다.

Comparator.comparingInt(i -> i);

역순으로 비교하려면 :

Comparator.comparingInt(i -> -i);

다음과 같이 비트 조작을 통해이를 수행 할 수 있습니다.

(~a - ~b) >>> 31 | -((a - b) >>> 31)
public static void main(String[] args)
{
    int a = 107;
    int b = 106;
    check(a, b);

    a = 106;
    b = 106;
    check(a, b);

    a = 106;
    b = 107;
    check(a, b);
}

public static void check(int a, int b)
{
    System.out.println((~a - ~b) >>> 31 | -((a - b) >>> 31));
}

산출:

1
0
-1

논리적 인 값만 필요하다면 (거의 항상 그렇듯이) 다음 한 줄이 도움이 될 것입니다.

boolean ifIntsEqual = !((Math.max(a,b) - Math.min(a, b)) > 0);

And it works even in Java 1.5+, maybe even in 1.1 (i don't have one). Please tell us, if you can test it in 1.5-.

This one will do too:

boolean ifIntsEqual = !((Math.abs(a-b)) > 0);

참고URL : https://stackoverflow.com/questions/9150446/compareto-with-primitives-integer-int

반응형