Java 자동 박싱 및 언박싱 소스 코드 분석
포장&언박싱이 무엇인가요?
int 기본 유형을 Integer 패키징 유형으로 변환하는 과정을 boxing이라고 하고, 그 반대로 변환하는 과정을 unboxing이라고 합니다.
먼저 코드를 살펴보세요
public static void main(String[] args) { Integer a = 127, b = 127; Integer c = 128, d= 128; System.out.println(a == b); // true System.out.println(c == d); // false }
이 코드에 참과 거짓이 나타나는 이유를 모르는 사람이 있을지 모르겠습니다. 여기에서 Java boxing의 동작을 소개합니다. 우리는 질문으로 분석합니다.
Boxing (valueOf())
public static Integer valueOf(int i) { // -128 - 127 if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
처음에 판단이 있음을 알 수 있습니다. 값 범위가 [-128,127] 사이이면 이 캐시(정수 배열)에서 가져옵니다. 범위는 바로 새로운 것입니다.
왜 [-128,127] 캐시가 필요한가요?
저희 비즈니스에는 정수형의 다양한 상태 및 식별 필드가 있을 수 있으므로 이러한 값은 일반적으로 0, 1, 2, 3 등이며 더 자주 나타납니다. 캐시가 없으면 자주 새로운 객체가 필요했다가 해제되므로 메모리 공간을 많이 소모하므로 캐시가 나타나므로 공간 낭비를 최적화하는 데 큰 도움이 될 수 있습니다.
왜 [-128,127]인가요?
여기서는 구체적인 이유를 설명하지 않겠습니다. 주로 기본적인 컴퓨터 지식에 의존합니다. 원래 코드, 역코드, 보완 코드가 무엇인지 이해한 후에요. 왜 이 범위에 속하는지 아는 것은 쉽습니다.
이 값은 시작 매개변수를 통해서도 변경될 수 있습니다.
-XX:AutoBoxCacheMax=(size)
자동 박싱으로 인한 성능 문제
이제 위 코드의 결과가 다른 이유를 이해해야 하며, 이에 대해 생각해 본 적이 있습니까? for 루프에서 이와 유사한 통계 데이터 작업이 발생하면 자동 박싱이 발생합니다. 다음 코드를 살펴보겠습니다.
public static void main(String[] args) { long startTime = System.currentTimeMillis(); Integer count = 0; // int count = 0; for (int i = 0; i < 5000000; i++) { count += i; } System.out.println("计算时长:" + (System.currentTimeMillis() - startTime) + " ms"); } // 执行结果: // Integer 计算时长:51 ms // int 计算时长:6 ms
그러면 실행 결과를 통해 빈번하게 발생하는 새로운 객체에 대한 자동 박싱과 메모리 할당이 시간적, 공간적으로 성능 손실을 가져온다는 것을 명확하게 알 수 있습니다.
간단한 요약
위의 소스 코드 읽기 및 테스트 분석을 통해 우리는 일반적으로 통계를 계산하거나 메서드에 매개 변수를 입력할 때 이러한 유형 변환 문제를 피하기 위해 최선을 다해야 한다는 결론을 내릴 수 있습니다. 전체 코드의 실행 효율성을 향상시킵니다.
Unboxing(intValue)
Unboxing에는 복잡한 로직이 없으며 값의 기본 유형을 직접 반환합니다.
추가: 자동 박싱 및 언박싱이 항상 발생합니까?
사실 반드시 그런 것은 아닙니다. 아래 샘플 코드를 보면 출력 문 뒤에 출력 결과가 주석 처리되어 있습니다.
public static void main(String[] args) { // TODO 自动生成的方法存根 Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; Long g = 3L; System.out.println(c==d);//true //包装类的==在没有遇到算术运算的情况下不会自动拆箱 System.out.println(e==f);//false System.out.println(c==(a+b));//true System.out.println(c.equals(a+b));//true System.out.println(g==(a+b));//true //equals方法不会处理数据转型关系 System.out.println(g.equals(a+b));//false }
자동 Boxing 및 Unboxing이 발생하는 상황은 다음과 같습니다.
Autoboxing: 포장 유형에 따라 기본 유형이 지정됩니다. 예: Integer i1 = 1;
자동 언박싱:
포장 유형은 기본 유형에 지정됩니다. 예: int i2 = new Integer(1);
int 유형과 Integer 유형을 비교합니다. int 유형과 Integer 유형의 값이 같으면 결과는 항상 true입니다.
정수 유형에서 산술 연산이 발생합니다
그러나 위의 예에서 System.out.println(c==d); 및 System.out.println(e==f); 똑같지 않아 똑같아?
주로 Integer.valueOf() 메서드 때문입니다. Integer의 소스 코드 일부가 아래에 게시되어 있습니다.
// private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} } public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
IntegerCache는 Integer의 정적 내부 클래스이고 valueOf()는 패키징 방법입니다. 소스 코드에서 볼 수 있듯이 캐시는 캐시 배열입니다. valueOf() 메서드의 입력 매개 변수 i가 [-128,127] 범위에 있으면 캐시 배열의 정수 값이 반환됩니다. 정수가 생성됩니다.
이것이 System.out.println(c==d);와 System.out.println(e==f);의 출력 결과가 다른 이유입니다. c와 d는 캐시 간격에 있으므로 동일한 참조를 반환하지만 e와 f는 캐시 간격에 없으면 더 이상 동일한 참조가 아닌 새 Integer를 반환합니다.
위 내용은 Java 자동 박싱 및 언박싱 소스 코드 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

AI는 작곡가 사용을 최적화하는 데 도움이 될 수 있습니다. 특정 방법에는 다음이 포함됩니다. 1. 종속성 관리 최적화 : AI는 종속성을 분석하고 최상의 버전 조합을 권장하며 충돌을 줄입니다. 2. 자동화 된 코드 생성 : AI는 모범 사례를 준수하는 composer.json 파일을 생성합니다. 3. 코드 품질 향상 : AI는 잠재적 인 문제를 감지하고 최적화 제안을 제공하며 코드 품질을 향상시킵니다. 이러한 방법은 기계 학습 및 자연어 처리 기술을 통해 구현되어 개발자가 효율성과 코드 품질을 향상시킬 수 있도록 도와줍니다.

HTML5는 5 가지 주요 개선 사항을 제공합니다. 1. 시맨틱 태그는 코드 선명도 및 SEO 효과를 향상시킵니다. 2. 멀티미디어 지원은 비디오 및 오디오 임베딩을 단순화합니다. 3. 형태 향상은 검증을 단순화한다. 4. 오프라인 및 로컬 스토리지는 사용자 경험을 향상시킵니다. 5. 캔버스 및 그래픽 기능은 웹 페이지의 시각화를 향상시킵니다.

MySQL 기능은 데이터 처리 및 계산에 사용될 수 있습니다. 1. 기본 사용에는 문자열 처리, 날짜 계산 및 수학 연산이 포함됩니다. 2. 고급 사용에는 복잡한 작업을 구현하기 위해 여러 기능을 결합하는 것이 포함됩니다. 3. 성능 최적화를 위해서는 WHERE 절에서 기능 사용 및 GroupBy 및 임시 테이블 사용을 피해야합니다.

Java에서 플랫폼 별 코드를 작성하는 이유에는 특정 운영 체제 기능에 대한 액세스, 특정 하드웨어와 상호 작용하고 성능 최적화가 포함됩니다. 1) JNA 또는 JNI를 사용하여 Windows 레지스트리에 액세스하십시오. 2) JNI를 통한 Linux 특이 적 하드웨어 드라이버와 상호 작용; 3) 금속을 사용하여 JNI를 통해 MacOS의 게임 성능을 최적화하십시오. 그럼에도 불구하고 플랫폼 별 코드를 작성하면 코드의 이식성에 영향을 미치고 복잡성을 높이며 잠재적으로 성능 오버 헤드 및 보안 위험을 초래할 수 있습니다.

Typetraits는 컴파일 타임 유형 확인 및 작동에 C에서 사용되어 코드 유연성 및 유형 안전성을 향상시킵니다. 1) 유형 판단은 STD :: IS_INTEGRAL 및 STD :: IS_FLOATING_POINT를 통해 수행되므로 효율적인 유형 확인 및 출력을 달성합니다. 2) std :: is_trivicial_copyable을 사용하여 벡터 복사를 최적화하고 유형에 따라 다른 사본 전략을 선택하십시오. 3) 컴파일 타임 의사 결정, 유형 안전, 성능 최적화 및 코드 복잡성에주의하십시오. 타이피트 라이트를 합리적으로 사용하면 코드 품질을 크게 향상시킬 수 있습니다.

MySQL에서 문자 세트 및 콜라주를 구성하는 방법은 다음과 같습니다. 1. 서버 수준에서 문자 세트 및 콜라주 설정 : setNames'Utf8 '; setcharactersetutf8; setCollation_connection = 'utf8_general_ci'; 2. 특정 문자 세트 및 콜라주를 사용하는 데이터베이스를 만듭니다. createAbaseexample_DBCHARACTERSETUTF8COLLATEUTF8_GENERAL_CI; 3. 테이블을 만들 때 문자 세트 및 콜라주를 지정하십시오 : CreateTableAmplipt_table (idint

MySQL에서 데이터베이스를 바꾸려면 간접적 인 방법이 필요합니다. 단계는 다음과 같습니다. 1. 새 데이터베이스를 만듭니다. 2. mysqldump를 사용하여 이전 데이터베이스를 내보내십시오. 3. 데이터를 새 데이터베이스로 가져옵니다. 4. 이전 데이터베이스를 삭제합니다.

C에서 싱글 톤 패턴을 구현하면 정적 멤버 변수 및 정적 멤버 함수를 통해 클래스의 인스턴스가 하나뿐입니다. 특정 단계에는 다음이 포함됩니다. 1. 개인 생성자를 사용하고 사본 생성자 및 할당 연산자를 삭제하여 외부 직접 인스턴스화를 방지합니다. 2. 정적 메소드 GetInstance를 통해 전역 액세스 포인트를 제공하여 하나의 인스턴스 만 생성되도록하십시오. 3. 스레드 안전의 경우 이중 확인 잠금 모드를 사용할 수 있습니다. 4. STD :: Shared_ptr과 같은 스마트 포인터를 사용하여 메모리 누출을 피하십시오. 5. 고성능 요구 사항의 경우 정적 로컬 변수를 구현할 수 있습니다. 싱글 톤 패턴은 글로벌 주 남용으로 이어질 수 있으며,이를주의해서 사용하고 대안을 고려하는 것이 좋습니다.
