찾다

 >  Q&A  >  본문

Android "1"=="1" 到底是true还是false

问题:

有个代码我判断是否等于字符串的“1”,因是新手不小心用了==,结果发生了很奇妙的问题。

Util u = new Util();
boolean result = u.getId() == "1";
Toast.makeText(this, String.valueOf(result), Toast.LENGTH_SHORT).show();
  1. 结果在手机上运行会提示true(部分华为Android版本5.0以下手机会提示false)

  2. 在IDE中调试结果是false

看截图,调度过程中代码后面显示的result:true,可是在计算窗口中显示为false。见鬼了,求解。

高洛峰高洛峰2772일 전752

모든 응답(7)나는 대답할 것이다

  • 黄舟

    黄舟2017-04-17 17:38:46

    자바 메모리에는 힙 메모리(heap)가 있습니다. 단순 메모리란 새로 나오는 모든 것이 힙 메모리에 있다는 뜻입니다.
    문자열 상수와 같은 상수 풀이라는 Java 메모리 영역도 있는데, "1"과 같이 여기에 모두 존재합니다.
    "1"은 상수 풀에 있어야 합니다. 키는 u.getId()에 있습니다. 값은 상수 풀이나 힙 메모리에 있습니다. 이는 Util 구성 방법의 소스 코드에 따라 다릅니다. 스크린샷에서는 "1"이 직접 반환됩니다. 이는 디버깅 중에 가상 머신이 상수 풀에 두 개의 메모리를 할당했으며 Android가 동일한 메모리를 직접 공유한다는 의미입니다. 차별은 컴파일러의 기분에 따라 달라집니다. 앞으로는 ==를 사용하지 말고 같음을 사용하세요

    회신하다
    0
  • 黄舟

    黄舟2017-04-17 17:38:46

    JAVA의 문제는 가상 머신에 따라 다릅니다.

    • == 비교 메모리 주소

    • 문자열 비교에는 equal

    • 을 사용하세요.

    회신하다
    0
  • ringa_lee

    ringa_lee2017-04-17 17:38:46

    문자는 같음을 사용하여 비교해야 하며, 기본 유형은 "=="를 사용하여 비교해야 합니다. 기본형은 메모리에 저장되기 때문에 "=="는 비교를 위해 메모리에 저장되는 주소입니다. 문자 등 복합형이라면 언뜻 보아도 저장주소가 다를 수 있으므로, "=="를 사용하면 가능합니다. 사실일 수도 있고, 거짓일 수도 있습니다

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:38:46

    1. ==는

    2. 보다 우선순위가 높습니다.
    3. == 주소 비교, 같음 값 비교

    4. == 두 문자열의 주소가 동일한지, 즉 동일한 문자열에 대한 참조인지 비교하는 것입니다.

    5. 문자열은 상수 풀에 저장되고 리터럴의 복사본은 하나만 저장되므로 주소가 동일하므로
    6. 이 true를 반환합니다.

      "1"=="1"

      회신하다
      0
  • 巴扎黑

    巴扎黑2017-04-17 17:38:46

    == 주소를 직접 비교하면 가상집은 "1"과 "1"이 동일한 상수 객체, 즉 동일한 주소라고 판단하므로 true를 반환합니다. 디버깅할 때 메커니즘이 다를 수 있습니다(디버깅 모드가 사용되기 때문일 수 있음). 이로 인해 가상 머신은 두 개의 '1' 문자열이 동일한 개체가 아니라고 생각하고 false를 반환하게 됩니다. 그러니 이것을 무시하십시오. .

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-17 17:38:46

    산술 연산자의 구문 분석 순서에 따르면 =가 앞에 ==
    그래서 결과 = u.getId()가 먼저 구문 분석되고 할당 연산 결과가 Boolean true입니다
    그래서 true==“ 1” 참이 "1"인지에 대한 주제를 공부해야 합니다. 이론적으로 그것은 fasle입니다.
    "1"은 int 1이 아닌 문자열이고 int 1은 실제로 Boolean 유형 true로 표현될 수 있습니다

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 17:38:46

    비교하려는 문자열이 모두 숫자인 경우 Integer.parse를 사용하여 변환할 수 있습니다.

    회신하다
    0
  • 취소회신하다