"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 항목 패키지된 기본 유형보다 기본 유형을 선호합니다.

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

2024년 11월 11일에 게시됨
검색:673

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

기본 유형과 압축된 기본 유형

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

주요 차이점

  • 신원과 신원 값:
    기본 요소: 정체성이 없습니다. 동일한 값을 가진 두 개의 프리미티브는 항상 동일합니다.
    패키지: 객체이며 정체성을 가지고 있습니다. 두 객체는 ​​동일한 값을 가질 수 있지만 ID는 다를 수 있습니다.

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

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

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

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

문제가 있는 예:

Comparator naturalOrder = (i, j) -> (i 



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

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

Comparator naturalOrder = Integer::compare;

또는 원래 비교기를 수정합니다.

Comparator naturalOrder = (iBoxed, jBoxed) -> {
    int i = iBoxed;
    int j = jBoxed;
    return (i 



2. Autounboxing 및 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 



문제: sum은 Long으로 가득 차 있습니다. 각 반복마다 오토박싱/언박싱이 발생합니다.

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

long sum = 0L;
for (long i = 0; i 



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

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

우수 사례

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

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

포장 유형:
컬렉션 및 일반 API에 사용하는 데 필요합니다.
null일 수 있습니다.
객체 ID가 있습니다.

릴리스 선언문 이 기사는 https://dev.to/giselecoder/item-61-de-preferencia-aos-tipos-primitivos-em-vez-dostipos-primitivos-empacotados-34fk?1에서 복제됩니다. 침해가 있는 경우, 문의 Study_golang@163 .comdelete
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3