有个代码我判断是否等于字符串的“1”,因是新手不小心用了==,结果发生了很奇妙的问题。
Util u = new Util();
boolean result = u.getId() == "1";
Toast.makeText(this, String.valueOf(result), Toast.LENGTH_SHORT).show();
结果在手机上运行会提示true(部分华为Android版本5.0以下手机会提示false)
在IDE中调试结果是false
看截图,调度过程中代码后面显示的result:true,可是在计算窗口中显示为false。见鬼了,求解。
黄舟2017-04-17 17:38:46
자바 메모리에는 힙 메모리(heap)가 있습니다. 단순 메모리란 새로 나오는 모든 것이 힙 메모리에 있다는 뜻입니다.
문자열 상수와 같은 상수 풀이라는 Java 메모리 영역도 있는데, "1"과 같이 여기에 모두 존재합니다.
"1"은 상수 풀에 있어야 합니다. 키는 u.getId()에 있습니다. 값은 상수 풀이나 힙 메모리에 있습니다. 이는 Util 구성 방법의 소스 코드에 따라 다릅니다. 스크린샷에서는 "1"이 직접 반환됩니다. 이는 디버깅 중에 가상 머신이 상수 풀에 두 개의 메모리를 할당했으며 Android가 동일한 메모리를 직접 공유한다는 의미입니다. 차별은 컴파일러의 기분에 따라 달라집니다. 앞으로는 ==를 사용하지 말고 같음을 사용하세요
ringa_lee2017-04-17 17:38:46
문자는 같음을 사용하여 비교해야 하며, 기본 유형은 "=="를 사용하여 비교해야 합니다. 기본형은 메모리에 저장되기 때문에 "=="는 비교를 위해 메모리에 저장되는 주소입니다. 문자 등 복합형이라면 언뜻 보아도 저장주소가 다를 수 있으므로, "=="를 사용하면 가능합니다. 사실일 수도 있고, 거짓일 수도 있습니다
伊谢尔伦2017-04-17 17:38:46
==는
== 주소 비교, 같음 값 비교
== 두 문자열의 주소가 동일한지, 즉 동일한 문자열에 대한 참조인지 비교하는 것입니다.
"1"=="1"
巴扎黑2017-04-17 17:38:46
== 주소를 직접 비교하면 가상집은 "1"과 "1"이 동일한 상수 객체, 즉 동일한 주소라고 판단하므로 true를 반환합니다. 디버깅할 때 메커니즘이 다를 수 있습니다(디버깅 모드가 사용되기 때문일 수 있음). 이로 인해 가상 머신은 두 개의 '1' 문자열이 동일한 개체가 아니라고 생각하고 false를 반환하게 됩니다. 그러니 이것을 무시하십시오. .
怪我咯2017-04-17 17:38:46
산술 연산자의 구문 분석 순서에 따르면 =가 앞에 ==
그래서 결과 = u.getId()가 먼저 구문 분석되고 할당 연산 결과가 Boolean true입니다
그래서 true==“ 1” 참이 "1"인지에 대한 주제를 공부해야 합니다. 이론적으로 그것은 fasle입니다.
"1"은 int 1이 아닌 문자열이고 int 1은 실제로 Boolean 유형 true로 표현될 수 있습니다