2016-04-11 9 views
2

Смотрите ниже фрагмент кода:разница между String.valueOf (INT I) и печать только я

int count = 0; 
String query = "getQuery"; 
String query1 = "getQuery"; 
final String PARAMETER = "param"; 

query += "&" + PARAMETER + "=" + String.valueOf(count); 
query1 += "&" + PARAMETER + "=" + count; 
System.out.println("Cast to String=>"+query); 
System.out.println("Without casting=>"+query1); 

Получили как выход точно так же. Так что мне интересно, почему это было использовано, когда мы можем получить тот же результат, используя только count.

У меня есть ссылка, но не найдено точно такой же путаницы.

+0

Почему вы ожидаете другого выхода? –

+1

Поймите, что когда вы объединяете строковый литерал и int (или любой примитивный тип), int (или примитив) автоматически преобразуется в String. –

+0

Я не ожидаю никакого выхода, но хочу знать причину, почему это было использовано. (Если какой-либо из курсов) – MonsterJava

ответ

6

Это хорошо объясняется в JLS - 15.18.1. String Concatenation Operator +:

Если только один операнд выражения имеет тип String, то строки преобразования (§5.1.11) выполняется на другой операнд для создания строки во время выполнения.

Вы должны обратить внимание на следующее:

Оператор + синтаксический левоассоциативной, независимо от того, является ли он определяется с помощью анализа типа для представления конкатенации или численного сложения. В некоторых случаях требуется получение желаемого результата .

Если вы пишете 1 + 2 + " fiddlers" результат будет

3 fiddlers 

Однако написание "fiddlers " + 1 + 2 урожайность:

fiddlers 12 
+1

Вот что я ищу - ссылка на JLS. Благодарю. 1+ –

1

Java компилятор играет небольшой трюк, когда он видит оператор + применяется к String и нестроковому: это null -Проверяет объект, вызывает toString() на него, а затем выполняет конкатенацию.

Это то, что происходит, когда вы пишете это:

query1 += "&" + PARAMETER + "=" + count; 
//  ^^^ ^^^^^^^^^ ^^^ 

Вы можете, конечно, сделать это, когда преобразование по умолчанию в String является то, что вы хотите.

Однако, если вы сделаете это

String s = count; // <<== Error 

компилятор не собирается собрать это, потому что нет конкатенации. В этой ситуации вы хотели бы использовать valueOf:

String s = String.valueOf(count); // <<== Compiles fine 
0

String.valueOf(int) фактически вызывает Integer.toString().

Таким образом, он используется для преобразования int в строку элегантно. Поскольку, делая i+"", это IMNSHO, не совсем элегантный.

Кроме того, когда вы печатаете любое число напрямую, оно на самом деле вызывает метод его класса Wrapper и печатает строку.