문제

데이터베이스에서 검색된 레코드를 저장하는 데 사용할 데이터 전송 객체를 생성해야 합니다.이 데이터 전송 객체에서는 숫자 필드를 선언해야 합니다.어느 것이 더 나은지- 정수 또는 정수

필드를 정수로 정의하는 경우 DB에서 2000개 이상의 레코드를 검색하려는 경우 '정수' 유형으로 인해 성능에 영향이 있습니까?

미리 감사드립니다.

도움이 되었습니까?

해결책

Integer 처리 할 수있는 더 나은 옵션입니다 null; ~을 위한 int, null 될 것입니다 0, 조용히 resultSet.getInt(..) 사용. 그렇지 않으면 "설정할 수 없습니다. null 원시적 특성으로 ".

여기서는 성능이 거의 없습니다.

  • 선택한 경우 int, 추가 처리 코드를 추가합니다. 그리고 그것은 당신에게 많은 도움이되지 않을 것입니다. 코드는 깨끗하고 간단하지 않으며 보일러 플레이트 코드가 많지 않으며 성능조차 얻지 못할 것입니다.
  • 데이터베이스의 경우 NULL은 0과 동일하지 않습니다. 때때로 당신은 끝납니다 0, 어디 null 의도되었습니다. 사용자가 양식을 제출했으며 어떤 가치도 공급하지 않는 경우를 상상해보십시오. int. 당신은 결국 얻을 것입니다 0 기본적으로. 그 필드가 될 때는 의미가 있거나 실제로 그렇게합니다. not null 데이터베이스에서.

다른 팁

성능 비용보다는 객체가 필요한 일을 기준으로 결정을 내려야합니다. 속도 문제가 프로파일 러, 즉 모든 악의 근원으로 식별되면 성능에 따라 결정해야합니다.

둘 다의 기능 중 일부를보고 결정에 사용하십시오.

  • Integer 할 수 있습니다 null, int 할 수 없습니다. 그렇습니다 int 에서 DBNullable 필드?
  • 에 액세스해야합니까? Integer 수업 방법?
  • 산술을하고 있습니까?

개인적으로, 나는 항상 래퍼 위의 원시를 선택합니다. 그러나 그것은 기술적 인 장점에 근거한 것이 아니라 선호하는 것입니다.

내 마음에, int 또는 정수로 무언가를 선언하는 것 사이의 선택은 단순히 Null이 유효한 값인지 아닌지에 달려 있습니다. Autoboxing (및 Autounboxing)은 숫자가 단순히 한 유형이어야하는 전환 문제를 처리합니다. 성능 (지적 된 바와 같이)은 거의 모든 경우에 눈에 띄지 않을 것입니다.

게다가, INT는 자연스러운 선택이어야하며 어쨌든 문제가 되려면 가장 성능이 뛰어날 것입니다. 널을 저장할 수 있어야한다면 가지다 정수를 사용하려면 (또한 단순히 INT를 취하는 메소드에 대해 NULL 참조가 자동 전달되지 않도록하십시오.

Integer 이론적으로보다 느립니다 int, 그러나 숫자가 크 랜치가 아닌 한 성능 영향은 최소화되어야합니다. 또한 JIT 최적화는 성능 손실을 줄입니다.

원시 또는 기준 유형 측면에서 상황에 더 잘 맞는 것을 사용하십시오.

int는 정수보다 10 배 빠릅니다

JETM Performance Library 로이 코드를 테스트합니다

int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
    Integer t = 0;
    t = 10;
    t = 11;
}

point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
    int t = 0;
    t = 10;
    t = 11;
}
point.collect();

etmMonitor.render(new SimpleTextRenderer());

그리고 결과 :
테스트 : 객체 10.184
테스트 : 프리미티브 1.151

아이디어를 제공하기 위해 2000 정수는 쿼리에 약 0.5ms를 추가합니다. 이 데이터를 직렬화 해야하는 경우 상당히 더 추가 할 수 있습니다.

그러나 정확성이 먼저 나와야합니다. 매우 빠르지 만 잘못된 점은 없습니다. 널 값과 처리 방법을 고려해야합니다. (열이 null이 아닌 경우) integer.min ___ 값을 사용할 수 있거나 사용할 수 있습니다. int 대신 필드를 사용하고 long.min_value null을 사용하십시오. IT보다 크지 만 여전히 정수보다 더 작고 효율적일 것입니다.

나는 그것이 데이터베이스에 액세스하기 위해 무엇을 사용하고 있는지에 따라 다르다고 생각합니다.평범한 오래된 JDBC를 사용하면 다음과 같이 할 수 있습니다. ints, ORM은 자동으로 이를 다음으로 변환할 수 있습니다. Integers 그래도.그리고 Integer를 사용하면 다음을 처리할 수 있습니다. .

int 대부분의 모든 계산을 위해 Java에서 사용합니다. Integer 원시 배열을 제외한 모든 형태의 컬렉션에서 사용됩니다.

쓰레기 수집기 스래쉬와 함께 많은 임시 정수를 사용하여 배경에 미공개 CPU를 사용하여 모든 것이 일반적인 둔화를 유발할 수 있습니다. 초당 쓰레기가 너무 많은 임시가 CG가 비상 사태에 들어가게됩니다. 대기 시간 중요한 응용 프로그램 (예 : 실시간 대화식 그래픽, 물리 장치 컨트롤러 또는 통신)에서 마구간을 유발할 수있는 "메모리가 필요합니다"모드.

따라서 수학이없는 중첩 된 통화가 많지만 맵에 키를 사용하는 것과 같은 많은 컬렉션에 액세스하는 경우 인수가 통과 될 때 수많은 자동 권투를 피하기 위해 정수를 사용합니다.

작업이 수학 집약적이거나 루프 카운터 또는 기타 수학 지향 작업으로 사용되고 컬렉션 (원시 배열 제외)에 저장되지 않은 경우 프리미티브를 사용합니다. 완전한 신생 물체 인 문자열을 제외한 다른 모든 프리미티브에 대해서도 마찬가지입니다.

int 에 캐스팅할 수 없습니다. String 을 사용하여 toString 또는 (String).

Integer 캐스팅할 수 있다 String ~와 함께 toString 또는 (String) 그리고 그것은 처리할 수 null.

당신이 확인하고 싶다면 null 그러면 가치 Integer 최고이지만 정수를 비교하려면 int가 더 나을 수 있습니다. 다음 예에서는 정수 c = 1000, d = 1000을 사용하고 있으며 false를 반환하지만 int의 경우 true를 반환합니다.

public class IntegerCompare {

    public static void main(String[] args) {
        int a = 1000;
        int b = 1000;

        Integer c = 1000;
        Integer d = 1000;

        if (a == b) {
            System.out.println("int Value Equals");

        }
        if (c == d) {
            System.out.println("Integer value Equals");

        } else {

            System.out.println("Integer Value Not Equals");
        }
    }
}

다루어야 할 시나리오는 검증입니다.

다음 수업이 있다고 상상해보십시오.

class Foo{
    @Min(value = 10)
    int val;
}

사용자가 값을 제공하지 않는 경우 val 요청에서 우리는 불쾌한 것을 얻을 것입니다 NumberFormatException.

만약에 int 대체됩니다 Integer, 우리는 사용할 수 있습니다 @NotNull 이 문제를 더 우아하게 해결하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top