¿cómo declarar i y j para que sea un bucle infinito?
while( i <= j && i >= j && i != j) {}
¿Cómo declarar i y j para que sea un bucle infinito ?
// es una pregunta de entrevista que conocí.
Se trata de preguntar cuáles son las declaraciones de i y j, hacer que sea siempre cierto.
Y no puedo hacerlo declarando i y j como tipos numéricos. ¿Qué otros tipos pueden enfrentarlo ?
3 answers
Integer i=new Integer(1000);
Integer j=new Integer(1000);
System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j));
i
y j
se desvinculará automáticamente a ints para <=
y >=
, pero no para !=
. i
y j
son instancias diferentes, pero tienen el mismo valor int. Es por eso que las tres comparaciones volverán verdaderas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-04 20:59:19
Esto también funciona ("en mi máquina"):
Integer a = 128, b = 128;
Considerando que esto no funcionará:
Integer a = 127, b = 127;
Auto-boxing un int
es azúcar sintáctico para una llamada a Integer.valueOf(int)
. Esta función utiliza una caché para valores de -128 a 127, inclusive. puede almacenar en caché otros valores, pero en mi caso, no lo hace.
Por lo tanto, la asignación de 128 no tiene una coincidencia de caché; crea una nueva instancia Integer
con cada operación de auto-boxing, y la comparación de referencia a != b
es verdadera. La asignación de 127 tiene un acierto de caché, y los objetos Integer
resultantes son realmente la misma instancia de la caché. Por lo tanto, la comparación de referencia a != b
es falsa.
Lo que realmente quiero señalar es tener cuidado con la comparación de referencia con el auto-boxeo. Un problema más probable del mundo real es que esperas que a == b
sea cierto porque se les asignó el mismo valor (en caja automática), ejecutas algunas pruebas unitarias que confirman tu expectativa, y luego tu código falla "in the wild" cuando algún contador excede el límite superior de cache. ¡Momentos divertidos!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-26 11:36:20
Cualquier valor igual de ' i 'y' j ' revelará verdadero con la declaración dada, diga:
Integer i = new Integer(1);
Integer j = new Integer(1);
while( i <= j && i >= j && i != j) {}
La magia es con operador usado! En caso de != operator el compilador toma los operandos como objetos(incluyendo sus valores) mientras que en el caso de >= o
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-20 09:17:12