2013-04-12 17 views
22

Ich hatte diese Interviewfrage vor einigen Jahren, aber ich habe die Antwort noch nicht gefunden.Wie mache ich eine unendliche Schleife mit "x <= y && x > = y && x! = Y"?

Was sollte x und y sein, um eine Endlosschleife zu erstellen?

while (x <= y&& x >= y && x != y) { 

} 

Wir haben versucht, mit Nan, infinity+/-, null

float vs int.

+0

Was ist der Typ von x und y? Sind sie Primitive oder Referenztypen oder dürfen sie irgendetwas sein? – prashant

+2

Sie möchten zwei Instanzen der gleichen Nummer. Die '<=' and '> =' heben sich gegenseitig auf, solange 'x gleich y ist, aber 'x == y' ist eine Referenzprüfung, daher werden zwei Instanzen auf' x! = y' wahr, obwohl sie gleichwertig sind. – Shark

+9

YAUIQ - noch eine nutzlose Interviewfrage. Interessant, sogar unterhaltsam, ich habe nichts dagegen, es hier zum Vergnügen und sogar zum Lernen zu stellen.Aber ich glaube nicht, dass es jemandem hilft zu bewerten, wie gut ein Programmierer-Mitarbeiter der Befragte sein wird. – arcy

Antwort

37

Sie benötigen zwei Variablen, die vergleichbar sind, haben den gleichen Wert, aber verschiedene Instanzen darstellen, zum Beispiel:

Integer x = new Integer(0); 
Integer y = new Integer(0); 

x <= y und y <= x beide wahr sind, weil die Integer unboxed sind jedoch die Gleichheit Instanz x == y ist falsch.

Beachten Sie, dass es funktioniert mit Float, Long und Double auch, und jeder Wert (und nicht nur 0) funktioniert.


Sie können auch mit den Feinheiten Ihrer JVM spielen - sie ganze Zahl von bis zu 127 nur allgemein zwischenzuspeichern, so dass diese auch funktionieren würde:

Integer x = 128; 
Integer y = 128; 

(aber es wäre nicht mit 127).

Oder einfach mehr, da Double s sind in der Regel überhaupt nicht im Cache gespeichert:

Double x = 0d; 
Double y = 0d; 
+3

... vergleichbar mit '<=' and '> =', ... die sind nur die primitive Wrapper (außer Boolean). – Dukeling

+0

Das ist ein teuflischer Trick mit Boxen. Gute Antwort. Leute, die dies lesen, sollten auch 'Integer.valueOf (0)' versuchen und sehen, wie sich das auf das Ergebnis auswirkt. –

+0

(+1) Clever! ... – NPE

5

Sie haben zwei Integer-Objekte zu erstellen, zum Beispiel:

Integer x = new Integer(2); 
Integer y = new Integer(2); 

Da x und y sind Objekte und Keine ordinalen Typen, Sie erhalten eine Endlosschleife.

0

Hier ist es.

Integer x =1; 
Integer y = new Integer(1); 
while(x <= y&& x >= y && x != y) { 
    System.out.println("Success"); 
} 
+1

Könnte die extra Meile gegangen sein und erklärte 'y = new Integer (x);' – Shark

2

Sie haben Ihre Antwort, ich wollte nur sagen, wie ich zum selben kam. In der normalen Welt wäre solch ein Test nutzlos, es gibt keine Möglichkeit, dass zwei Zahlen so funktionieren. Das bedeutet, dass es Java-spezifisch sein muss.

x und y könnten entweder einfache Typen sein - was es sofort unmöglich macht.

x und y könnten Objekte sein. Aber welche Objekte werden mit < = oder> = verglichen? Nur 'geboxte' Nummern. So kommt die Antwort wirklich schnell.