2012-06-14 14 views
16

¿Cuántos casos son posibles para una sentencia de conmutación en Java? Por ejemplo, si estamos comprobando un número entero, ¿cuántos bloques de casos son posibles?Sentencia de conmutación en Java

+2

Java 7 también permite el cambio por cadenas [verifique aquí] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html). Esto permite un número ilimitado de interruptores. – Santosh

+2

+1 Gran pregunta, con suerte no un dup. – dacwe

+2

Hay un límite superior seguro, pero cuando no va a tener más de 20, ¿por qué esta pregunta? No me digas que estás escribiendo un programa para encontrar el caso de uso Prime. –

Respuesta

4

Depende de su requisito. puedes tener tantos casos de rango tipo int. Como el rango del tipo int es finito y después de ese concepto, el ciclo entero entrará en escena.

Como el tamaño de int varía de -2,147,483,648 a 2,147,483,647, por lo que puede tener un caso para cada número de ellos. Entonces hay un número limitado de casos en caso de número entero.

Pero si quiere usar String en el estuche, entonces puede tener un número ilimitado de casos como dice Bohemian.

7

No hay límite, a excepción del tamaño de la JVM para dar cabida a todo el código de bytes

+2

JVM spec! = Especificaciones de java. Si el jvm impone un límite donde las especificaciones de Java no lo hacen, puede presentar un informe de error en javac o en jvm – aioobe

+0

Yep Bohemian. Yo también asumí eso. Pero no pude encontrar ningún lugar donde se haya escrito. – namalfernandolk

2

El número total de casos será el número máximo que puede tomar int dependiendo del hardware. Eche un vistazo a datatypes in java

Por lo tanto, tendrá todo el rango posible de bloques de cajas.

-2

Infinite!! No hay tal restricción.

+3

No es del todo cierto. Hay un límite superior. – Blender

+0

límite superior es el número de casos que desea, ¿verdad? – namalfernandolk

+0

No, el límite superior se define por el número máximo de caracteres por método, que es 65535. Los métodos más largos que eso no compilarían, indicando "Código demasiado grande para compilar" o "código demasiado grande para la declaración try". – Nicktar

2

Sin límite de declaraciones de mayúsculas y minúsculas en un cambio. En el peor de los casos puede obtener espacio de montón pero no de manera fácil.

+0

Incorrecto. Un método Java puede contener un máximo de 65535 caracteres. – Nicktar

+1

@Nicktar:: D ¿Puedes compartir tu investigación o algo así, como es difícil de creer! Personalmente, he visto el método de 1800 líneas y dam seguro que tiene muchos más caracteres que 65535. http://stackoverflow.com/questions/6570343/maximum-size-of-a-method-in-java – manurajhada

+0

@manurajhada http: //bugs.sun.com/view_bug.do?bug_id=4262078 El 65535 es el tamaño máximo del bytecode generado (no el código fuente). Debe haber al menos un byte de bytecode generado por caja de conmutador. Por lo tanto, el límite debe ser inferior a 65535 casos. – emory

13

El límite que probablemente se encuentre primero es el del número máximo de entradas en el conjunto constante por clase que es 65535. Esto permitirá unos pocos miles de bloques de casos de pequeña complejidad. El grupo constante contiene una entrada para cada literal numérico o de cadena que se utiliza al menos una vez en la clase, pero también una o más entradas para todos los campos, métodos y/o referencias de clase, ya que estas entradas se componen en nombre de otras constantes que deben ser presente en el grupo constante también. Es decir. una entrada de referencia de método consiste en una referencia a una entrada de cadena para la firma del método y una referencia a la entrada de clase de la clase declarante. La entrada de la clase de nuevo hace referencia a una entrada de cadena para el nombre de la clase.

Ver: Limitations of the Java virtual machine y The Constant Pool en el Java Virtual Machine Specification

La absoluta límite superior para un interruptor ignorando o reutilizar el código en los bloques de caso es ligeramente menor que 2^30 casos desde cada caso tiene un objetivo de salto, que es una firmó un entero de 32 bits (véanse las instrucciones tableswitch y lookupswitch) y, por lo tanto, necesita 4 bytes por caso y el tamaño del código de bytes para cada método está limitado a un poco menos de 2^32 bytes. Esto se debe a que el código de bytes está envuelto en un code attribute y el length of a attribute se da como un entero de 32 bits sin signo. Este tamaño se reduce porque el atributo de código tiene información de encabezado, el método necesita algún código de entrada y de salida, y la instrucción de cambio de tabla necesita algunos bytes para sí misma con sus valores mín/máx y como máximo 3 bytes de relleno.

+0

Interesante respuesta (gracias por los enlaces). Sin embargo, ¿se aplica para cambiar? El grupo de constantes se utiliza para el "diseño de clases, interfaces, instancias de clase o matrices". Es probable que una sentencia switch se compile en una tabla de salto (¡una matriz!), Por lo que el límite teórico es de 2 G-casos por conmutador y la agrupación constante limita solo el número de matrices, es decir, las instrucciones de cambio. Por supuesto, en la práctica te quedarás sin memoria mucho antes. –

+0

Sí, las constantes de caso se encuentran directamente en el código de bytes y no en el grupo de constantes, pero es probable que el código en cada bloque de casos requiera un cierto número de entradas constantes del grupo. Por supuesto, podría intentar minimizar el uso de las entradas constantes del grupo, es decircompilando '5' como' 4 + 1' o invocando los mismos métodos con los mismos argumentos, pero en diferente orden, lo que permitiría trabajar alrededor del tamaño limitado del conjunto constante. – x4u

+0

Pero ese límite se aplica a cualquier clase de Java, no solo a las declaraciones de cambio, ¿verdad? –

1

Al leer la pregunta, las respuestas y los comentarios, no veo por qué es relevante. Sin duda, puede tener más case s de los que puede escribir manualmente. Y, en el caso improbable de que genere su código a máquina, hay mejores opciones que switch es en Java.

+0

¡Finalmente, una respuesta realista! – Taslim

4

.Al menos por un código simple como:

public class SwitchLimit { 

    public static void main(String[] args) { 
     int x = 0; 
     switch(x) { 
     case 0: 
     ... 
     case 16376: 
     default: 
     } 
     System.out.println("done."); 
    } 

} 

Usted puede tener 16377 declaraciones de caso en este ejemplo (sin contar default) y si se agrega un case 16377:, el código no se compilará con el siguiente error:

The code of method main(String[]) is exceeding the 65535 bytes limit

Como otros señalaron, este número probablemente será significativamente menor si su método realmente hace algo que tenga sentido.

Cuestiones relacionadas