2015-09-24 8 views
46

miałem na to pytanie w moim teście Java, gdzie miałem do przypisania wartości do a i b więc wyrażenie to prawda:To „czy” ocena w Javie z trzech jednoczesnych wyrażeń

(a<=b && b<=a && a!=b) 

Niestety, miałem nie mam pojęcia, jaka była odpowiedź.

+3

Jakie są typy "a" i "b"? – Tunaki

+1

"a" i "b" mogą być dowolnymi opakowaniami liczbowymi, o ile są takie same. 'Byte',' Character' 'Integer',' Long', 'Float',' Double' jako '! =' Porównuje odniesienia, ale '<=' porównuje nieprzypisane wartości. –

+1

Jeśli podoba ci się ta układanka, spróbuj 'x! = X + 0' ma trzy możliwe typy, a' x == -x' ma 22 możliwe wartości/typy. –

Odpowiedz

80

Tu jest prosta sztuczka.

Nie możesz tego wymyślić tylko za pomocą logiki boolowskiej. Korzystanie z tym, to połączenie ...

  • a jest mniejsza lub równa b i
  • b jest mniejsza lub równa a i
  • a nie jest równa b

... nigdy nie wróci true.

Jednak operator != porównuje odwołania, jeśli jego operandy są obiektami.

Więc dodaje powróci true:

Integer a = 1; 
Integer b = new Integer(1); 
System.out.println(a<=b && b<=a && a!=b); 

Co się dzieje tutaj jest: a jako odwołania do obiektu nie jest równa b jako odwołania do obiektu, choć oczywiście posiadają równe wartości całkowitych.

+0

Zakłada się, że 'Integer' nigdy nie jest' internowany '- co jest uczciwym założeniem dla wyższych wartości, ale niektóre cache JVM '-127 - 128'. Możesz lepiej użyć '10000' lub czegoś podobnego. – OldCurmudgeon

+15

@ OldCurmudgeon - Używa 'new Integer (1);' która nie zwraca wartości z lokalnej pamięci podręcznej (w przeciwieństwie do 'Integer.valueOf()'). Więc dobrze, chyba zgaduję :) – TheLostMind

+3

@OldCurmudgeon chciał odpowiedzieć, ale ThwLostMind mnie pobił. Jawnie inicjowanie "nowej liczby całkowitej (wartość int)" usuwa interning. – Mena