> Java > java지도 시간 > 본문

항목 패키지된 기본 유형보다 기본 유형을 선호합니다.

Patricia Arquette
풀어 주다: 2024-10-10 08:09:02
원래의
495명이 탐색했습니다.

Item  Dê preferência aos tipos primitivos em vez dos tipos primitivos empacotados

기본 유형과 패키지된 기본 유형

  • 기본 유형: int, double, boolean 등
  • 패킹된 기본 유형: 정수, Double, 부울 등
  • Java에는 기본 유형과 참조 유형(객체)이라는 이중 유형 시스템이 있습니다.
  • 각 기본 유형에는 해당 래퍼 클래스가 있습니다.

주요 차이점

  • 신원 vs. 값:
    프리미티브: 정체성이 없습니다. 동일한 값을 갖는 두 개의 프리미티브는 항상 동일합니다.
    패키지형: 그것들은 사물이며 정체성을 가지고 있습니다. 두 객체는 ​​동일한 값을 가질 수 있지만 ID는 다를 수 있습니다.

  • Null 값:
    기본값: 항상 기본값을 갖습니다(예: int의 경우 0).
    패키지: null일 수 있으며 제대로 처리되지 않으면 NullPointerException 예외가 발생할 수 있습니다.

  • 공연:
    기본 요소: 시간과 공간 측면에서 더 효율적입니다.
    Packaged: 추가 객체 생성으로 인한 오버헤드를 도입합니다.

프리미티브와 패키지를 혼합할 때 발생하는 일반적인 문제

  • 1. 가치보다는 정체성의 비교
  • ==를 사용하여 패키지된 개체를 비교할 때는 값이 아닌 개체 참조를 비교하는 것입니다. 이로 인해 예상치 못한 결과가 발생할 수 있습니다.

문제가 있는 예:

Comparator<Integer> naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1);

로그인 후 복사

문제: i == j 비교는 값이 아닌 참조를 비교합니다.
잘못된 동작: naturalOrder.compare(new Integer(42), new Integer(42))는 0 대신 1을 반환합니다.

해결책:
Integer 클래스의 CompareTo 메소드나 유틸리티 메소드를 사용하세요.

Comparator<Integer> naturalOrder = Integer::compare;

로그인 후 복사

또는 원래 비교기를 수정:

Comparator<Integer> naturalOrder = (iBoxed, jBoxed) -> {
    int i = iBoxed;
    int j = jBoxed;
    return (i < j) ? -1 : ((i == j) ? 0 : 1);
};

로그인 후 복사

2. 자동 언박싱 및 NullPointerException
null이 될 수 있는 패킹된 유형을 사용할 때 객체가 null이면 자동 unboxing에서 예외가 발생할 수 있습니다.

문제가 있는 예:

Integer i = null;
if (i == 42) {
    System.out.println("Inacreditável");
}

로그인 후 복사

문제: i는 null입니다. 42와 비교하면 null autounboxing이 발생하여 NullPointerException이 발생합니다.
해결책: 가능하면 기본 유형을 사용하세요.

int i = 0;
if (i == 42) {
    System.out.println("Inacreditável");
}

로그인 후 복사

3. Autoboxing/Unboxing으로 인한 성능 저하
집약적인 작업에서 래핑된 유형을 실수로 사용하면 오토박싱 및 불필요한 객체 생성으로 인해 성능 저하가 발생할 수 있습니다.

문제가 있는 예:

Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
    sum += i;
}
System.out.println(sum);

로그인 후 복사

문제: sum은 꽉 찬 Long입니다. 각 반복마다 자동박싱/언박싱이 발생합니다.

영향: 코드 속도가 훨씬 느려지고 메모리 사용량이 과도해집니다.
해결책:
집중적인 작업에서는 지역 변수에 기본 유형을 사용합니다.

long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
    sum += i;
}
System.out.println(sum);

로그인 후 복사

패키지 유형을 사용해야 하는 경우

  • 컬렉션: 일반 컬렉션(예: 목록)에서는 기본 유형을 사용할 수 없습니다.
  • 일반 매개변수: 일반 유형은 기본 유형(예: ThreadLocal)을 지원하지 않습니다.
  • 객체를 요구하는 API: 특정 API에는 기본 유형 대신 객체가 필요합니다.

우수 사례

  • 기본 유형 선호: 가능하면 단순성과 효율성을 위해 기본 유형을 사용하세요.
  • 오토박싱/언박싱에 주의하세요. 오토박싱은 자세한 내용을 줄이지만 미묘한 오류가 발생할 수 있습니다.
  • 래핑에서 ==와의 비교 방지: equals()와 같은 메소드를 사용하거나 래핑되지 않은 값을 비교하세요.
  • Null 확인: 패키지 유형으로 작업할 때 Null이 될 수 있고 NullPointerException이 발생할 수 있다는 점에 유의하세요.

요약
기본 유형:
더 간단하고 빠릅니다.
null일 수 없습니다.
정체성이 없습니다(가치만 있음).

포장 유형:
컬렉션 및 일반 API에 사용하는 데 필요합니다.
null일 수 있습니다.
그들은 객체 정체성을 가지고 있습니다.

위 내용은 항목 패키지된 기본 유형보다 기본 유형을 선호합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿