나는 어디에서 모든 변환 프로젝트에서 일하고 있어요 int
에String
다음과 같이 수행됩니다 :
int i = 5;
String strI = "" + i;
Java에 익숙하지 않습니다.
내가 생각하는 것처럼 이것이 일반적인 습관입니까? 아니면 잘못된 것입니까?
Integer.valueOf(i).toString()
. 그는 물건을 좋아했을 것입니다. 그것은 그의 의도를 매우 분명히 나타내지 만, 내 취향에는 약간 길다.
나는 어디에서 모든 변환 프로젝트에서 일하고 있어요 int
에String
다음과 같이 수행됩니다 :
int i = 5;
String strI = "" + i;
Java에 익숙하지 않습니다.
내가 생각하는 것처럼 이것이 일반적인 습관입니까? 아니면 잘못된 것입니까?
Integer.valueOf(i).toString()
. 그는 물건을 좋아했을 것입니다. 그것은 그의 의도를 매우 분명히 나타내지 만, 내 취향에는 약간 길다.
답변:
일반적인 방법은 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 타겟으로이 동작을 변경하고 지속적인 작업.
"" + 5
가 됨 "5"
).
"" + 5
그냥 대신에 "5"
하시겠습니까?
"" + integer
접근법은 공식 오라클 튜토리얼 중 하나 에서 사용됩니다 .
괜찮습니다.하지만 그런 것을 쓰지 않았습니다. 나는 이것을 선호한다 :
String strI = Integer.toString(i);
NumberFormatter
. 와 같은 형식을 사용할 수 있습니다 NumberFormat.getInstance(Locale.FRENCH)
.
좋은 방법이 아닙니다.
int에서 문자열로 변환 할 때 다음을 사용해야합니다.
int i = 5;
String strI = String.valueOf(i);
int i
박스에 넣 습니까? Integer
String strI
StringBuilder.append(int)
(그리고 모든 기본 유형에 StringBuilder
대한 append
메소드가 있습니다).
그것은 단지 최적화 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 )
String.valueOf
필요한 권투를 호출하더라도 i
(을 허용하는 과부하 int
가 없기 때문에) 사용하지 new Integer(i)
않고을 사용 Integer.valueOf(i)
합니다. 그러나 실제로이 작업을 수행하지 않습니다. 그것은 않습니다 new StringBuilder().append("").append(i).toString()
SimonJ의 대답 노트로,. StringBuilder는 프리미티브 int i
를 String으로 변환하는 자체 로직을 가지고 있습니다.
내가 아는 다른 방법은 Integer
수업입니다.
Integer.toString(int n);
Integer.toString(int n, int radix);
구체적인 예 (필요하지는 않지만) :
String five = Integer.toString(5); // returns "5"
예를 들어 다른 기본 유형에서도 작동합니다 Double.toString
.
이 기술은 제가 10 년 전에 취한 학부 수준의 자바 소개 수업에서 배웠습니다. 그러나 IIRC에서는 아직 String 및 Integer 클래스 메서드를 얻지 못했습니다.
이 기술은 간단하고 타이핑이 빠릅니다. 내가하고있는 모든 것이 무언가를 인쇄하는 것이라면 사용합니다 (예 :System.out.println("" + i);
. 그러나 변환을 수행하는 가장 좋은 방법은 아니라고 생각합니다. 또한 성능이 문제가 될 경우 속도가 느려집니다 (다른 답변뿐만 아니라 아래도 더).
개인적으로, 나는 무슨 일이 일어나고 있는지 분명하기 때문에 Integer.toString ()을 선호합니다. 혼란스러워 보이는 것처럼 String.valueOf ()가 두 번째 선택이 될 것입니다 (darioo의 답변 후 주석을 참조하십시오).
grins의 경우 :) 나는 ""+ i, Integer.toString 및 String.ValueOf의 세 가지 기술을 테스트하기 위해 클래스를 작성했습니다. 각 테스트는 정수를 1에서 10000으로 문자열로 변환했습니다. 그런 다음 Linux 시간을 통해 각각 실행 했습니다. 명령을 5 번 실행했습니다. Integer.toString ()은 String.valueOf ()보다 한 번 더 빠르며 세 번 묶었 고 String.valueOf ()는 한 번 더 빠릅니다. 그러나 그 차이는 몇 밀리 초를 넘지 않았습니다.
""+ i 기술은 Integer.toString ()보다 1 밀리 초 빠르고 String.valueOf ()보다 1 밀리 초 느리면 (하나는 String.valueOf () Integer.toString ())보다 빠릅니다. 일반적으로 몇 밀리 초 느리지 만, 약 50 밀리 초 느린 테스트가있었습니다. YMMV .
SimonJ에 주로 영향을 미칩니다. 나는 ""+ i 관용구를 정말로 싫어한다. String.valueOf (i)라고하면 Java는 정수를 문자열로 변환하고 결과를 반환합니다. ""+ i라고 말하면 Java는 StringBuilder 객체를 생성하고 빈 문자열을 추가하고 정수를 문자열로 변환 한 다음 StringBuilder에 추가 한 다음 StringBuilder를 String으로 변환합니다. 추가 단계가 많이 있습니다. 큰 프로그램에서 한 번만하면 큰 문제가되지 않습니다. 그러나 항상이 작업을 수행하는 경우 컴퓨터에서 추가 작업을 많이 수행하고 정리해야 할 추가 개체를 모두 만드는 것입니다. 마이크로 최적화에 열광하고 싶지 않지만 무의미하게 낭비하고 싶지 않습니다.
정수를 문자열로 변환하는 방법은 여러 가지가 있습니다.
1)
Integer.toString(10);
2)
String hundred = String.valueOf(100); // You can pass an int constant
int ten = 10;
String ten = String.valueOf(ten)
삼)
String thousand = "" + 1000; // String concatenation
4)
String million = String.format("%d", 1000000)
""+ i 사용은 숫자를 문자열로 변환하는 가장 짧고 간단한 방법입니다. 가장 효율적이지는 않지만 가장 분명한 IMHO이며 일반적으로 더 중요합니다. 코드가 단순할수록 실수 할 가능성이 줄어 듭니다.
""+i
개인적으로 나는 ""+ 나는 원래의 질문 포스터가 "취약한"상태라고 생각한다. Java 외에도 많은 OO 언어를 사용했습니다. 해당 구문이 적합하도록 의도 된 경우 Java는 문자열로 변환하기 위해 ""를 필요로하지 않고 i 만 해석하고 대상 유형이 명확하지 않고 오른쪽에 단일 값만 제공되기 때문에 수행합니다. . 다른 코드는 다른 제조사 나 다른 플랫폼에서 만든 다른 버전의 Javac가 코드를 포팅해야하는 경우 고려 될 때 컴파일러를 속이는 '트릭'처럼 보인다. Typecast를 사용하십시오 : (문자열) i. 윙크
내 학습 방식과 다른 코드를 빠르게 읽을 때 이러한 구문을 쉽게 이해할 수 있도록 Integer.toString (i) 메서드에 투표합니다. Java가 백그라운드에서 작업을 구현하는 방법에서 ns 또는 2를 잊어 버렸습니다 .String.valueOf (i)이 메소드는 나에게 올바르게 느끼고 정확히 무슨 일이 일어나고 있는지 말합니다.
좋은 점은 아마도 StringBuilder를 사용하는 것입니다. 텍스트와 int 또는 다른 객체가 혼합 된 문자열을 작성하는 좋은 대답입니다.
내 두 센트는 Mans 질문에 대한 이미 잘 지불 된 키티에 던져졌습니다 ... 스마일
일부 반사 후 내 자신의 답변 편집 :
Ok, Ok, 이것에 대해 좀 더 생각하고 있었고 String.valueOf (i)도 완벽하게 좋습니다. 정수 값을 나타내는 String을 원합니다. lol, 영어는 Java보다 구문 분석하기가 훨씬 어렵습니다! 그러나 나머지 답변 / 의견을 남깁니다 ... 가능한 경우 항상 가장 낮은 수준의 메소드 / 함수 체인을 사용하고 여전히 가독성을 유지하도록 String.valueOf가 Integer.toString을 호출하면 전체 오렌지를 사용하는 이유는 무엇입니까? 어쨌든 껍질을 벗기면 흠?
StringBuilder에 대한 내 의견을 명확히하기 위해 대부분 문자 그대로의 텍스트와 int로 구성된 콤보를 사용하여 많은 문자열을 작성하며 + 사이에 포함 된 위에서 언급 한 루틴에 대한 호출로 길고 추악한 느낌을 줄 수 있습니다. 어쨌든 SB 객체와 append 메소드에는 과부하가있어 계속 진행하여 사용하는 것이 더 깨끗할 수 있습니다 ... 그래서 지금은 최대 5 센트라고 생각합니다. 롤 ...
간단한 형변환 시도
char c = (char) i;
char c = (char) (i + 48);