source

int에서 String으로 변환하려면 어떻게 해야 하나요?

factcode 2022. 8. 24. 23:51
반응형

int에서 String으로 변환하려면 어떻게 해야 하나요?

프로젝트를 진행 중인데 모든 변환은int로.String다음과 같이 처리됩니다.

int i = 5;
String strI = "" + i;

저는 자바에 익숙하지 않습니다.

이게 일반적인 관행인가요, 아니면 뭔가 잘못된 건가요?

일반적인 방법은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()할 수 있었을지도 모릅니다). 하지만 효과가 있습니다.

Grodrigues의 코멘트에 답하려면:** 아니요, 컴파일러는 빈 문자열을 최적화하지 않습니다.이 경우 다음을 참조하십시오.

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

String Builder 초기화:

   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

왜냐하면 그것은 내가 정말 하고 싶은 것을 표현하지 못하기 때문이다.

(빈) 문자열에 정수를 추가하고 싶지 않습니다.정수를 문자열로 변환합니다.

Integer.toString(i)

또는 원하는 것은 아니지만 연결보다는 개체(정수)의 문자열 표현을 얻을 수 있습니다.

String.valueOf(i)

1. 루프와 같이 자주 호출되는 코드에 대해 최적화는 연결을 사용하지 않는 포인트이기도 합니다.

2. 이것은 다음같은 실제 연결 사용에는 유효하지 않습니다. System.out.println("Index: " + i); 또는 String id = "ID" + i;

많은 대학 입문 과정들이 두 가지 이유로 이 스타일을 가르치고 있는 것 같습니다.

  • 수업이나 방법에 대한 이해가 필요하지 않습니다.보통 이것은 "class"라는 단어가 언급되기 훨씬 전에 학습됩니다. 메서드 호출도 마찬가지입니다.그래서 이런 걸 이용해서String.valueOf(…)학생들을 혼란스럽게 할 것이다.

  • 이것은 "operator overloading"의 예시입니다.사실, 이것은 관용적인 오버로드 연산자로 우리에게 판매되었습니다(Java에서는 커스텀 연산자 오버로드가 허용되지 않기 때문에 여기서 놀랄 일은 아닙니다).

즉, 교육상의 필요성에 의해 탄생하거나(비록 이것은 잘못된 가르침이라고 주장하지만), 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참고로 방법.:)

제가 아는 다른 방법은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);다만, 변환의 최선은 아니라고 생각합니다.이렇게 사용하면 무슨 일이 일어나고 있는지 깨닫는 데 1초 정도 시간이 걸리기 때문입니다.또, 퍼포먼스가 염려되는 경우는, 속도가 늦어지는 것 같습니다(다른 회답과 마찬가지로, 이하도 늦어지는 것 같습니다).

개인적으로는 Integer.toString()을 선호합니다.왜냐하면 무슨 일이 일어나고 있는지 알기 때문입니다.String.valueOf()는 헷갈릴 것 같기 때문에 두 번째 선택입니다(darioo의 답변 뒤에 코멘트가 붙어 있습니다).

grins의 경우 :) " + i, Integer.toString, String의 3가지 기술을 테스트하기 위해 클래스를 작성했습니다.밸류 오브각 테스트에서는 ints가 1 ~10000에서 Strings로 변환되었습니다.그런 다음 Linux time 명령어를 각각 5번 실행했습니다.Integer.toString()은 String.valueOf()보다 약간 빨랐고, 3번 동점이 발생했으며, String.valueOf()는 1번 더 빨랐습니다.다만, 그 차이는 몇 밀리초를 넘지 않았습니다.

" + i" 기법은 Integer.toString()보다 1밀리초 빠르고 String.valueOf()보다 1밀리초 느렸습니다(String.valueOf()가 Integer.toString()보다 빠릅니다).보통 몇 밀리초 정도 느리지만 50 밀리초 정도 느린 테스트가 한 번 있었습니다.YMMV

문자열로 변환하는 방법은 다양합니다.

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);

String을 사용하는 방법에 따라 달라집니다.다음과 같은 이점이 있습니다.

String total =  Integer.toString(123) + Double.toString(456.789);

정수를 문자열로 변환하는 방법은 여러 가지가 있습니다.

1)

Integer.toString(10);

2)

 String hundred = String.valueOf(100); // You can pass an int constant
 int ten = 10;
 String ten = String.valueOf(ten)

3)

String thousand = "" + 1000; // String concatenation

4)

String million = String.format("%d", 1000000)

문자열로 변환하는 방법에는 세 가지가 있습니다.

  1. String string = "" + i;
  2. String string = String.valueOf(i);
  3. String string = Integer.toString(i);

대부분 SimonJ와 같다.저는 '+i'라는 말을 정말 싫어해요.String.valueOf(i)라고 하면 Java는 정수를 문자열로 변환하고 결과를 반환합니다."+i"라고 하면 Java는 StringBuilder 객체를 만들고 빈 문자열을 추가한 후 정수를 문자열로 변환하고 StringBuilder에 추가한 후 StringBuilder를 문자열로 변환합니다.그건 많은 추가 단계입니다.큰 프로그램에서 한 번 하면 별일이 아닐까요?하지만 항상 이렇게 하면 컴퓨터가 많은 작업을 하게 되고 청소가 필요한 추가 오브젝트를 만들 수 있습니다.미세 최적화에 열광하고 싶지는 않지만 쓸데없이 낭비하고 싶지도 않습니다.

String strI = String.valueOf(i);

String string = Integer.toString(i);

두 가지 방법 모두 맞습니다.

" + i 를 사용하는 것은 숫자를 문자열로 변환하는 가장 짧고 간단한 방법입니다.가장 효율적이지는 않지만 가장 명확한 IMHO이며 일반적으로 이것이 더 중요합니다.코드가 단순할수록 실수할 가능성이 낮아집니다.

개인적으로는 질문 포스터에 '냄새'라고 쓰여 있는 것처럼 '+i'는 보이지 않는다고 생각합니다.저는 자바 외에 많은 OO 언어를 사용해 왔습니다.만약 그 구문이 적절하다면, Java는 문자열로 변환하기 위해 ""를 원하는 대로 해석하지 않고 i만 해석하고, 행선지 유형이 모호하지 않고 오른쪽에 하나의 값만 제공되기 때문입니다.다른 하나는 컴파일러를 속이기 위한 '꼼수'로 보입니다.다른 제조업체나 다른 플랫폼에서 만든 다양한 버전의 Javac이 코드 포팅이 필요할 경우 mojo를 사용할 수 있습니다.다른 많은 OOL을 좋아할 것 같은데 그냥 Typecast: (String) i. winks

다른 코드를 빨리 읽을 때 이러한 구조를 쉽게 이해할 수 있도록 하기 위해 Integer.toString(i) 메서드에 투표합니다.Java가 백그라운드에서 작업을 구현하는 방법에 대해 ns 또는 ns를 잊은 경우String.valueOf(i) 이 메서드는 나에게 적절하다고 느껴지며, 무슨 일이 일어나고 있는지 정확하게 알려줍니다.I have and Integer가 있는데 String으로 변환되었으면 합니다.

String Builder를 미리 사용하는 것이 텍스트와 int 또는 기타 오브젝트를 혼합한 문자열 구축에 대한 좋은 답변일 수 있습니다.그것은 백그라운드에서 사용되는 것이기 때문입니다.

내 2센트만 이미 많은 돈을 받은 남자들의 질문에 대한 대답에 쏟아 부었다...미소짓다

일부 검토 후 내 답변에 맞게 편집:

OK, OK, 조금 더 생각해 봤는데 String.valueOf(i)도 완벽합니다.Integer 값을 나타내는 String을 원합니다.하하, 자바보다 영어가 훨씬 더 해석하기 어려워!하지만 나머지 답변/댓글은 남겨두고...가능하면 가장 낮은 수준의 메서드/함수 체인을 사용하도록 항상 교육받았습니다.그래서 String.value Of String이 Integer.toString을 호출하면 오렌지를 통째로 사용하는 이유는 무엇입니까?

String Builder에 대한 코멘트를 명확히 하기 위해 저는 대부분 리터럴 텍스트와 int의 조합을 사용하여 많은 문자열을 작성합니다.이 문자열은 + 사이에 삽입된 상기 루틴에 대한 호출로 길고 추한 결과를 초래합니다.따라서 이러한 루틴이 SB 오브젝트가 되어 추가 메서드에 과부하가 걸린다면 그대로 사용하는 것이 더 깔끔할 수 있습니다.그럼 이제 5센트까지 받을 수 있겠구나, 응? lol...

이미 지적한 바와 같이Integer.toString()또는String.valueOf()가는 길이에요.궁금해서 간단한 벤치마크를 해봤습니다.

Integer.toString(i)그리고.String.valueOf(i)퍼포먼스는 기본적으로 동일합니다.Integer.toString(i)조금 더 빨라지는 것 같아요.하지만i + ""속도가 1.7배 느립니다.

import java.util.Random;

public class Test {

    public static void main(String[] args) {
        long concat = 0;
        long valueOf = 0;
        long toString = 0;
        
        int iterations = 10000;
        int runs = 1000;
        for(int i = 0; i < runs; i++) {
            concat += concat(iterations);
            valueOf += valueOf(iterations);
            toString += to_String(iterations);
        }
        
        System.out.println("concat: " + concat/runs);
        System.out.println("valueOf: " + valueOf/runs);
        System.out.println("toString: " + toString/runs);
    }
    
    public static long concat(int iterations) {
        Random r = new Random(0);
        long start = System.nanoTime();
        for(int i = 0; i < iterations; i++) {
            String s = r.nextInt() + "";
        }
        return System.nanoTime() - start;
    }
    
    public static long valueOf(int iterations) {
        Random r = new Random(0);
        long start = System.nanoTime();
        for(int i = 0; i < iterations; i++) {
            String s = String.valueOf(r.nextInt());
        }
        return System.nanoTime() - start;
    }
    
    public static long to_String(int iterations) {
        Random r = new Random(0);
        long start = System.nanoTime();
        for(int i = 0; i < iterations; i++) {
            String s = Integer.toString(r.nextInt());
        }
        return System.nanoTime() - start;
    }
}

출력:

concat: 1004109
valueOf: 590978
toString: 587236

사용하다Integer.toString(tmpInt).trim();

간단한 활자 주조 시도

char c = (char) i;

언급URL : https://stackoverflow.com/questions/4105331/how-do-i-convert-from-int-to-string

반응형