Как выполняются случаи переключения для строк? - PullRequest
1 голос
/ 03 февраля 2012

У меня есть сомнения в формулировке переключателя. Вот мой код:

String month = "April";
switch (month.toLowerCase()) {
            case "january":
                monthNumber = 1;
                break;
            case "february":
                monthNumber = 2;
                break;
            case "march":
                monthNumber = 3;
                break;
            case "april":
                monthNumber = 4;
                break;

и т. Д. *

У меня есть 3 вопроса в этом контексте:

1) При сравнении месяца со значениями регистра, т.е. регистр «Январь», регистр "Февраль" .. Что именно используется из следующего компилятором ?? - month.equals ("case-value")? - месяц == значение дела?

2) И являются ли значения прецедентов внутренне преобразованными в StringBuilder / StringStringBuffer или они просто остаются объектами String ??

3) Как я могу узнать это из байт-кода, т.е. есть ли какой-либо инструмент, с помощью которого я могу просматривать непосредственно сгенерированный компилятором код, просто чтобы выяснить, как все ведет себя внутри?

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

3) Я считаю, что JDeveloper имеет функцию отладчика байт-кода. Если JDeveloper не является опцией, посмотрите эти инструменты, которые я нашел:

http://sourceforge.net/projects/jbcd/

http://andrei.gmxhome.de/bytecode/index.html

http://www.drgarbage.com/how-to-debug-bytecode-with-bytecode-visualizer.html

1 голос
/ 03 февраля 2012

1 - строка в выражении переключателя сравнивается с выражениями, связанными с каждой меткой регистра, как если бы использовался метод String.equals.

2 - для этого оператора регистра переключателя используется объект нормальной строки

http://blogs.oracle.com/darcy/entry/project_coin_string_switch_anatomy

1 голос
/ 03 февраля 2012

Не уверен насчет числа 3, но просмотр байтового кода, вероятно, слишком низкий уровень, чтобы легко увидеть, какие методы используются.

1) строки сравниваются с помощью .equals ().

2) строки остаются как строковые объекты

См .: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html

...