나는 어디에서 모든 변환 프로젝트에서 일하고 있어요 int
에String
다음과 같이 수행됩니다 :
int i = 5;
String strI = "" + i;
Java에 익숙하지 않습니다.
내가 생각하는 것처럼 이것이 일반적인 습관입니까? 아니면 잘못된 것입니까?
답변
일반적인 방법은 Integer.toString(i)
또는 String.valueOf(i)
입니다.
연결은 작동하지만, 저자가 위의 두 가지 방법에 대해 알지 못한다는 것을 암시하는 것은 독창적이지 않으며 나쁜 냄새가 날 수 있습니다.
Java는 문자열과 함께 사용될 때 + 연산자를 특별히 지원합니다 ( 문서 참조 ).
StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();
컴파일 타임에. 그것은 약간 덜 효율적인 (의 sb.append()
호출 끝나는 Integer.getChars()
것 인, Integer.toString()
어쨌든 했을),하지만 작동합니다.
Grodriguez의 의견에 대답 : ** 아니오, 컴파일러 는 이 경우 빈 문자열을 최적화 하지 않습니다 .
simon@lucifer:~$ cat TestClass.java
public class TestClass {
public static void main(String[] args) {
int i = 5;
String strI = "" + i;
}
}
simon@lucifer:~$ javac TestClass.java && javap -c TestClass
Compiled from "TestClass.java"
public class TestClass extends java.lang.Object{
public TestClass();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: istore_1
StringBuilder를 초기화하십시오.
2: new #2; //class java/lang/StringBuilder
5: dup
6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
빈 문자열을 추가하십시오.
9: ldc #4; //String
11: invokevirtual #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
정수를 추가하십시오.
14: iload_1
15: invokevirtual #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;
마지막 문자열을 추출하십시오.
18: invokevirtual #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
21: astore_2
22: return
}
거기에 제안 JDK 9 타겟으로이 동작을 변경하고 지속적인 작업.
답변
괜찮습니다.하지만 그런 것을 쓰지 않았습니다. 나는 이것을 선호한다 :
String strI = Integer.toString(i);
답변
좋은 방법이 아닙니다.
int에서 문자열로 변환 할 때 다음을 사용해야합니다.
int i = 5;
String strI = String.valueOf(i);
답변
그것은 단지 최적화 1이 아닙니다 . 난 싫어
"" + i
내가 정말로하고 싶은 것을 표현하지 않기 때문에 2 .
(빈) 문자열에 정수를 추가하고 싶지 않습니다. 정수를 문자열로 변환하고 싶습니다.
Integer.toString(i)
또는 선호하는 것은 아니지만 연결보다 낫다면 객체 (정수)의 문자열 표현을 얻으십시오.
String.valueOf(i)
1. 루프 에서처럼 자주 호출되는 코드의 경우 최적화는 연결을 사용하지 않는 지점이기도합니다 .
2. 이 사용 유효하지 않습니다 실제 처럼 연결 System.out.println("Index: " + i);
또는 String id = "ID" + i;
답변
많은 입문 대학 과정이이 스타일을 가르치는 것 같습니다 (제 경험상).
-
클래스 나 메소드를 이해하지 않아도됩니다. 일반적으로 이것은“클래스”라는 단어가 언급되기 전에, 심지어 메서드 호출까지도 배웁니다. 따라서 같은
String.valueOf(…)
것을 사용하면 학생들을 혼란스럽게 할 수 있습니다. -
사실,이 같은 우리에게 판매되었다 – 그것은 “연산자 오버로드”의 그림입니다 (자바는 사용자 정의 연산자 오버로딩을 허용하지 않기 때문에, 여기에 작은 경이) 관용적 오버로드 된 연산자를 사용합니다.
따라서 그것은 교훈적 필요성에서 태어 났거나 (이것은 단지 나쁜 가르침이라고 주장하지만) 그렇지 않으면 Java에서는 시연하기 어려운 원리를 설명하는 데 사용될 수 있습니다.
답변
표현식
"" + i
로 연결 문자열 변환i
런타임시 으로 . 식의 전체 유형은입니다 String
. i
먼저 Integer
객체 ( new Integer(i)
) 로 변환 된 다음 String.valueOf(Object obj)
호출됩니다. 따라서
"" + String.valueOf(new Integer(i));
분명히 이것은 호출 String.valueOf(new Integer(i))
하는 것 보다 약간 성능이 떨어 지므로 동일한 결과를 얻을 수 있습니다.
장점은 ""+i
타이핑이 더 쉽고 빠르며 일부 사람들은 더 읽기 쉽다고 생각할 수 있다는 것입니다. 그것은하지 않습니다 코드 냄새 가 어떤 깊은 문제가있는 것은 아닙니다으로.
(참고 : JLS 15.8.1 )
답변
개인적으로, 나는이 코드에서 나쁜 것을 보지 못했습니다.
int 값을 기록하려고 할 때 매우 유용하며 로거는 문자열을 허용합니다. String을 허용하는 메서드를 호출해야하지만 int 값이있는 경우 이러한 변환이 편리하다고 말하고 싶습니다.
Integer.toString
또는 사이의 선택은 String.valueOf
모두 맛의 문제입니다.
… 그리고 내부적으로는 String.valueOf
호출이 Integer.toString
메서드를 호출합니다 . 🙂
