Если вам действительно нужны переменные с именами, неизвестными во время компиляции, вы можете добиться этого эффекта, создав структуру, которая содержит произвольные имена и значения. Например, вы можете создать HashMap, где ключом является имя. Тогда ваш пример выше станет примерно таким:
HashMap myData=new HashMap();
for (int i=0;i<2;++i)
{
myData.put("hallo"+i,Integer.toString(i));
}
Позже вы вытащите их с помощью:
String whatever=myData.get("hallo1");
и т.д.
Конечно, вы не можете получить доступ к значениям с карты как к переменным напрямую, вам всегда нужно было бы помещать и получать их для обновления и извлечения, но концепция та же.
Тем не менее, я буду очень осторожен с этим, потому что это затрудняет поддержку кода. Если нужные вам имена действительно появляются неожиданно - если вы пишете универсальный код для чтения произвольной таблицы базы данных, имя которой было введено пользователем во время выполнения или что-то в этом роде - круто. Но если вы думаете, что это удобный ярлык для чего-то вроде:
if (region.equals("1"))
region1Total+=amount;
else
region2Total+=amount;
Мой простой ответ - НЕ !! Код гораздо проще поддерживать, если вы используете оператор IF и обычные переменные. Тогда любой, кто читает код, может просмотреть ваши объявления и посмотреть, какие есть все возможные переменные. Вы можете сделать поиск текста, чтобы найти везде, где они используются. Если вы неправильно написали имя переменной, вместо волшебного создания новой переменной вы получите чистое сообщение об ошибке во время компиляции. И т.д.
С другой стороны, если вы МОЖЕТЕ написать что-то вроде
String n=getInputFromScreen();
String s=getAnotherInputFromScreen();
hallo & n = s;
вы бы не знали, какие переменные существуют в вашей программе, и не могли бы отследить, где они используются.