문제

실제로 여기 실용적인 가치가 거의 없는 유사한 주제입니다.내가 이해하는 한, 프리미티브는 더 나은 성능을 발휘하며 객체 관련 기능(예: null 확인)이 필요합니다.오른쪽?

도움이 되었습니까?

해결책

모든 권투 발생에 대한 새 포장지를 만드는 것이 매우 비싸기 때문에, 특히 단일 방법의 방법으로 사용되는 것을 고려하면 상당히 비싸다는 것을 잊지 마십시오. 오토 옥싱 공통 포장지 풀을 사용합니다.

이것은 실제로의 구현입니다 플라이급 디자인 패턴. 새 래퍼 인스턴스를 작성하는 대신 잘 알려진 값에 대한 권투가 발생하면 사전 만들어진 인스턴스가 수영장에서 가져와 반환됩니다.

한 가지 결과는 다음과 같습니다. 과학적 계산에 자서전을 사용하는 것이 여전히 권장되지 않습니다.. 예를 들어, 코드 d = a * b + c는 a, b, c 및 d에 정수 클래스를 사용하고 있으며 생성 된 코드는 d.Valueof (a.intValue () * b.intValue () + c.intValue (C.IntValue)입니다. )). 이 모든 메소드 호출에는 자체 오버 헤드가 있으므로 일반적으로 컬렉션에 프리미티브를 저장하는 데 필요할 때 자서전을 사용하는 것이 좋습니다..

그리고 그럼에도 불구하고, 당신이 있다면 거대한 컬렉션 정수 랩핑 int의 오버 헤드는 실행 시간이 더 긴 것을 의미 할 수 있습니다. 20 배 더, 처럼 이 기사에서보고되었습니다.


JB는이 중요한 의견을 추가합니다.

또한 래퍼. valueof (원시)는 포장지 풀을 사용합니다. 그러니 정수를 선호합니다. valueof (5)에게 새로운 정수 (5)

다른 팁

프리미티브는 더 빠릅니다 사용된, 사용하기 전에 객체를 미지급해야하므로; 따라서 VM이 수행 할 추가 단계가 있습니다. 예를 들어, 정수에서 산술을 수행하려면 산술을 수행하기 전에 먼저 int로 변환해야합니다.

많은 비즈니스 응용 프로그램에서 이것은 아마도 거의 중요하지 않을 것입니다. 그러나 그래픽 변환 프로세서와 같이 매우 numnber-crunching 무거운 것을 쓰고 있다면 당신은 훨씬 더 관심을 가질 가능성이 훨씬 높습니다.

예, 프리미티브는 물체보다 빠릅니다. Java 5이므로 수동으로 서로 변환하지 않고 프리미티브와 물체를 혼합 할 수도 있습니다. 오토 옥스 메커니즘은 그것을 처리합니다.

즉, 컬렉션에 프리미티브를 넣으면 컴파일러가 불만을 제기하지 않고 원시를 암시 적으로 객체로 변환합니다.

컬렉션에 기본 요소 저장이 필요한 경우 다음을 사용할 수 있습니다. 커먼즈 프리미티브.

나는 래퍼보다 프리미티브를 사용하는 것을 선호합니다. 래퍼가 절대적으로 필요한 곳은 엔터티 클래스뿐입니다.데이터베이스는 Null을 지원하므로 엔터티도 Null을 지원해야 합니다.

저는 데이터베이스 액세스에 기본 요소(및 홈브류 ORM)를 사용하는 프로젝트에 참여한 적이 있습니다.

 class Foo{
    int xxx = -1;
 ...
 }

그리고 당신은 다음을 가졌습니다 :

 void persist(Foo foo){
     ...
     statement.setInt(15,foo.getXXX()==-1?null:foo.getXXX());
     ...
}

맙소사, 그것은 악한 일이었습니다.

애플리케이션을 프로파일 링하고 오토 옥싱이 성능 또는 메모리 문제라는 것을 알 때만 랩퍼를 통해 프리미티브를 사용하는 것에 대해 걱정해야한다고 말합니다. 내 경험에서 메모리는 프리미티브 대 포장 물체에 대해 이야기 할 때 CPU 사이클 전에 문제가됩니다.

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