> Java > java지도 시간 > 본문

정수와 정수의 차이점과 정수.값() 메소드에 대한 자세한 설명

巴扎黑
풀어 주다: 2017-06-26 10:20:01
원래의
1528명이 탐색했습니다.

면책조항: 이 글은 해당 블로거의 글을 재인쇄한 것입니다. 원본 주소는 글 끝에 있습니다.

지식 1: 정수와 정수의 차이점

/*
* int는 java에서 제공하는 8가지 기본 데이터 유형 중 하나입니다. Java는 각 기본 유형에 대한 래퍼 클래스를 제공합니다. Integer는 int에 대해 Java에서 제공하는 래퍼 클래스입니다. int의 기본값은 0,
*이고 Integer의 기본값은 null
* 즉, Integer는 할당되지 않은 값과 0의 값을 구분할 수 있지만 int는 할당되지 않은 상황을 표현할 수 없습니다. 예를 들어 시험에 응시하지 않은 것과 시험 점수가 0점인 것의 차이를 표현하려면
* , Integer
* 만 사용할 수 있습니다. JSP 개발에서는 Integer의 기본값이 null이므로 el 표현식을 사용하여 텍스트 상자에 표시하면 값이 빈 문자열이고 int의 기본값은 0이므로 el 표현식을 사용하면 텍스트 상자에 표시하려면
* 결과가 0이므로 int는 웹 레이어의 양식 데이터 유형으로 적합하지 않습니다.
* Hibernate에서 OID가 Integer 타입으로 정의된 경우, Hibernate는 객체의 값이 null인지 여부에 따라 객체가 임시인지 여부를 결정할 수 있습니다.
* * OID가 int 타입으로 정의된 경우, 해당 객체를 설정해야 합니다. hbm 매핑 파일에서 저장되지 않은 값 속성을 0으로 설정합니다.
* 또한 Integer는 문자열을 정수로 변환하는 등 다양한 정수 관련 연산 방법을 제공합니다. Integer는 정수의 최대값과 최소값을 나타내는 상수도 정의합니다.

*/

지식 2: 정수.값() 메소드에 대한 자세한 설명

System.out.println(Integer.parseInt ("128")==Integer.valueOf( "128"));
1
2
3
System.out.println(Integer.valueOf("127")==Integer.valueOf ("127"));System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));
System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));
System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));
System. out.println(Integer.valueOf("128")==Integer.valueOf("128"));
🎜🎜🎜

첫 번째 판단은 true를 반환하고 두 번째 판단은 false를 반환하는 이유는 무엇입니까? 127 128내가 모르는 차이점이 있나요? (물론127미만128...)

true而第二个判断返回了false127128有什么我不知道的区别吗?(当然除了127小于128…)

还有,为什么第三个判断返回了true
我看了另一个相关提问的回答,但是我还是不知道它们什么时候返回true还有为什么第二个判断返回false

  回答#1:

Integer.valueOf(String)确有一个不同寻常的行为。

valueOf会返回一个Integer(整型)对象,当被处理的字符串在-128127(包含边界)之间时,返回的对象是预先缓存的。这就是为什么第一行的调用会返回true-127

这个整型对象是被缓存的(所以两次valueOf返回的是同一个对象)——第二行的调用返回false是因为128没有被缓存,所以每次调用,都会生成一个新的整型对象,

因此两个128整型对象是不同的对象。

重要的是你要知道在上面的比较中,你实际进行比较的是integer.valueOf返回的对象引用,所以当你比较缓存外的整型对象时,相等的判断不会返回true,就算你

传个valueOf的值是相等的也没用。(就像第二行中Integer.valueOf(128)==Integer.valueOf(128))。想让这个判断返回true,你需要使用equals()方法。

parseInt()返回的不是整型对象,而是一个int型基础元素。这就是为什么最后一个判断会返回true,第三行的判断中,在判断相等时,实际比较的是128 == 128

所以它必然是相等的。

再来说说第三种比较中的一点区别,使得它的结果与第二种比较不一样了:

一个unboxing conversion(一种比较时的转换,把对对象的引用转换为其对应的原子类型)在第三行的比较中发生了。因为比较操作符使用了==同时等号的两边

存在一个int型和一个Integer对象的引用。这样的话,等号右边返回的Integer对象被进一步转换成了int数值,才与左边进行相等判断。

所以在转换完成后,你实际比较的是两个原子整型数值。这种转换正是你在比较两个原子类型时所期待看到的那样,所以你最终比较了128等于128

 

  回答#2:

Integer类有一个静态缓存,存储了256个特殊的Integer对象——每个对象分别对应`-128 和127之间的一个值。
有了这个概念,就可以知道上面三行代码之间的区别。

1
new Integer(123);그리고 왜 세 번째 판단은 true를 반환합니까? >?
다른 관련 질문에 대한 답변을 읽었지만 언제 그것이 참인지, 왜 두 번째 판단이 false를 반환하는지 모르겠습니다.

답변 #1:

Integer.valueOf(String)실제로 있습니다. 하나의 비정상적인 행동.

valueOf는 처리 중인 문자열이 에 있는 경우 <code>Integer(정수) 개체를 반환합니다. >-128 및 127(포함), 반환된 객체는 미리 캐시됩니다. 이것이 첫 번째 줄의 호출이 true-127

이 정수 객체가 캐시된 이유입니다(그래서 valueOf는 동일한 객체를 두 번 반환합니다. - 두 번째 줄의 호출은 128가 캐시되지 않기 때문에 false를 반환합니다. 따라서 호출될 때마다 새로운 정수 개체가 생성됩니다.

따라서 두 개의 128 정수 개체는 서로 다른 개체입니다.

중요 위의 비교에서 실제로 비교하는 내용은 integer.valueOf입니다. 반환된 개체 참조이므로 캐시 외부의 정수 개체를 비교할 때 동일성 판단은 true를 반환하지 않습니다.

값이 동일한 경우 valueOf를 전달하는 것은 쓸모가 없습니다. (두 번째 줄의 Integer.valueOf(128)==Integer.valueOf(128))와 같습니다. 이 판단이 true를 반환하도록 하려면 equals() 메서드를 사용해야 합니다.

parseInt()는 정수 객체가 아니라 int 기본 요소를 반환합니다. 이것이 마지막 판단이 true를 반환하는 이유입니다. 세 번째 판단 줄에서 동등성을 판단할 때 실제 비교는 128 == 128,

따라서 동일해야 합니다.

두 번째 비교와 결과가 달라지는 세 번째 비교의 약간의 차이점에 대해 이야기해 보겠습니다.

세 번째 줄의 비교 중에 언박싱 변환(객체에 대한 참조를 해당 원자 유형으로 변환하는 비교 변환)이 발생합니다. 비교 연산자는 ==와 등호 양쪽을 사용하기 때문에

int 유형이 있고 Integer 객체에 대한 참조입니다. 이 경우 등호 오른쪽에 반환된 Integer 개체는 왼쪽과 동일해지기 전에 int 값으로 추가로 변환됩니다.

따라서 변환이 완료된 후 실제로 두 원자 정수 값을 비교하게 됩니다. 이 변환은 두 원자 유형을 비교할 때 예상할 수 있는 것과 정확히 같으므로 128128과 동일하게 비교하게 됩니다.

답변 #2:

Integer 클래스 256개의 특수 Integer 개체를 저장하는 정적 캐시가 있습니다. 각 개체는 `-128에서 127 사이의 값에 해당합니다.
이 개념을 통해 위 세 줄의 코드 사이의 차이점을 알 수 있습니다.

1
new Integer(123);
🎜🎜

显示创建了一个 새로운정수对象.

1Integer对象。
1
Integer.parseInt("123");

解析完字符串后返回一个int值。

1
Integer.valueOf("123");

这种情况比其他的要更复杂一些。首先进行了字符串解析,然后如果解析的值位于-128127之间,就会从静态缓存中返回对象。如果超出了这个范围,就会调用

Integer()方法并将解析的值作为参数传入,得到一个新的对象。

现在,让我们看一下问题中的3个表达式。

1
Integer.valueOf("127")==Integer.valueOf("127");

上面的表达式返回true,因为Integer的值从静态缓存中取了2次,表达式返回了对象与自己比较的结果。因为只有一个Integer对象,所以返回结果为true

1
Integer.valueOf("128")==Integer.valueOf("128");
Integer.parseInt("123");
🎜🎜🎜 🎜解析完字符串后返回一个int值。
1🎜🎜
Integer.valueOf("123");🎜🎜🎜🎜🎜🎜🎜🎜🎜这种情况比其他的要更复杂一些。首先进行了字符串解析,然后如果解析的值位于-128 and 127 间,就会从静态缓存中返回对象。如果超了这个范围,就会调用🎜Integer() 方法并将解析的值作为参数传入,得到一丠入,得到一丠新的对象。 🎜现在,让我们看一下问题中的3个表达式。
1🎜🎜
정수. valueOf("127")==Integer.valueOf("127");🎜🎜🎜🎜🎜🎜🎜🎜🎜상면적表达式返回true,因为 정수가 值从静态缓存中取了2次,表达式返回了对象与自己比较的结果。因为只有一个Integer对象,所以返回结果为true
1🎜🎜
Integer.valueOf("128" )==Integer.valueOf("128") ;🎜🎜🎜🎜🎜🎜

위 표현식은 128이 정적 버퍼에 존재하지 않기 때문에 false를 반환합니다. 따라서 동등성이 결정될 때마다 방정식의 양쪽에 새로운 Integer 객체가 생성됩니다. 두 개의 Integer 개체가 다르기 때문에 ==는 방정식 false,因为128没有存在静态缓冲区。所以每次在判断相等时等式两边都会创建新的Integer对象。由于两个Integer对象不同,所以==只有等式

两边代表同一个对象时才会返回true。因此,上面的等式返回false

1
Integer.parseInt("128")==Integer.valueOf("128");

上面的表达式比较的是左边的原始int128与右边新创建的Integer对象。但是因为intInteger之间比较是没有意义的,所以Java在进行比较前会将Integer

自动拆箱,所以最后进行的是intint值之间的比较。由于128和自己相等,所以返回true

의 양쪽이 동일한 개체를 나타내는 경우에만 true를 반환합니다. 따라서 위 방정식은 false를 반환합니다. 🎜
1🎜
Integer.parseInt("128")==Integer.valueOf("128");🎜🎜
🎜🎜🎜위 표현식은 왼쪽int 값을 비교합니다. >128 및 새로 생성된 Integer 개체가 오른쪽에 있습니다. 하지만 intInteger 사이의 비교는 의미가 없기 때문에 Java는 자동 unboxing 전에 Integer🎜

를 변환하므로 최종 비교는 intint 값 사이에서 이루어집니다. 128은 자신과 동일하므로 true가 반환됩니다. 🎜

위 내용은 정수와 정수의 차이점과 정수.값() 메소드에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!