ArrayList를 문자열로 변환하는 가장 좋은 방법


353

나는이 ArrayList나는 완전히 String으로 출력 할 것인지. 본질적 toString으로 탭으로 구분 된 각 요소를 사용하여 순서대로 출력하고 싶습니다 . 이 작업을 수행하는 빠른 방법이 있습니까? 루프를 반복하거나 각 요소를 제거하고 문자열에 연결할 수는 있지만 매우 느릴 것이라고 생각합니다.


4
또는 각 요소 제거 조심해야합니다. ArrayList 목록에서 요소를 제거하는 것은 큰 NO-NO입니다. "루프"는 요소 이동으로 인해 2 차적인 시간이 걸리기 때문에 (처음부터 마지막 ​​요소까지 반복되는 경우) 필요합니다.
Dimitry K

답변:


329

기본적으로 루프를 사용하여 반복하는 ArrayList것이 유일한 옵션입니다.

이 코드를 사용하지 말고, 왜이 코드가 바람직하지 않은지, 대신 어떤 코드를 사용해야하는지 확인하려면이 답변의 맨 아래를 계속 읽으십시오.

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

String listString = "";

for (String s : list)
{
    listString += s + "\t";
}

System.out.println(listString);

실제로, 문자열 연결은 javac컴파일러가 어쨌든 일련의 append작업으로 문자열 연결을 최적화 하기 때문에 괜찮을 것 StringBuilder입니다. for위 프로그램 의 루프에서 바이트 코드를 디스 어셈블하는 부분은 다음과 같습니다 .

   61:  new #13; //class java/lang/StringBuilder
   64:  dup
   65:  invokespecial   #14; //Method java/lang/StringBuilder."<init>":()V
   68:  aload_2
   69:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  aload   4
   74:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   77:  ldc #16; //String \t
   79:  invokevirtual   #15; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   82:  invokevirtual   #17; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

보다시피, 컴파일러는를 사용하여 루프를 최적화 StringBuilder하므로 성능에 큰 문제가되지 않습니다.

(두 번째 StringBuilder로, 루프의 각 반복에서 인스턴스화되고 있으므로 가장 효율적인 바이트 코드가 아닐 수 있습니다. 명시 적으로 인스턴스화하고 사용하면 StringBuilder성능이 향상됩니다.)

사실, 어떤 종류의 출력 (디스크 또는 화면)이 문자열 연결의 성능에 대해 걱정하는 것보다 적어도 속도가 느릴 것이라고 생각합니다.

편집 : 주석에서 지적했듯이 위의 컴파일러 최적화는 실제로 StringBuilder각 반복마다 새 인스턴스를 작성합니다 . (이전에 언급 한 것입니다.)

가장 최적화 된 기술 은 루프 외부의 단일 객체 만 인스턴스화하기 때문에 Paul Tomblin 의 응답 입니다.StringBuilderfor

위의 코드를 다시 작성하여 다음을 수행하십시오.

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder();
for (String s : list)
{
    sb.append(s);
    sb.append("\t");
}

System.out.println(sb.toString());

이 바이트 코드에서 입증 된 것처럼 StringBuilder루프 외부 에서 한 번만 인스턴스화하고 루프 append내부의 메소드 를 두 번만 호출합니다 (인스턴스화 StringBuilder및 루프 를 보여줍니다 ).

   // Instantiation of the StringBuilder outside loop:
   33:  new #8; //class java/lang/StringBuilder
   36:  dup
   37:  invokespecial   #9; //Method java/lang/StringBuilder."<init>":()V
   40:  astore_2

   // [snip a few lines for initializing the loop]
   // Loading the StringBuilder inside the loop, then append:
   66:  aload_2
   67:  aload   4
   69:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   72:  pop
   73:  aload_2
   74:  ldc #15; //String \t
   76:  invokevirtual   #14; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   79:  pop

따라서 for루프 내부 가 짧고 StringBuilder각 반복마다 인스턴스를 생성 할 필요가 없으므로 실제로 손 최적화가 더 잘 수행되어야합니다 .


8
성능상의 이유로 문자열을 추가하는 대신 StringBuilder 클래스를 사용하십시오.
Jeremy Jeremy

5
컴파일러는 문자열 연결을 최적화하지만 루프가 실행될 때마다 새 StringBuilder 객체를 만듭니다.
Pedro Henriques

4
+ =를 사용하는 경우 -1입니다.이 경우 성능이 저하됩니다. 문자열에 반복적으로 추가하려면 항상 StringBuilder를 사용하십시오.
starblue

10
이 솔루션은 문자열 끝에 여분의 "\ t"를 추가합니다. 특히 쉼표로 구분 된 목록이나 이와 유사한 것을 만들 때 바람직하지 않은 경우가 많습니다. Apache Commons 또는 Guava를 사용하여 여기에 게시 된 다른 솔루션이 우수하다고 생각합니다.
Peter Goetz

3
이것은 최선의 대답이 아닙니다. Vitalii Java또는 GeewaxAndroid
Gibolt

895

Java 8 이상에서 :

String listString = String.join(", ", list);

list가 String 유형이 아닌 경우, 결합 콜렉터를 사용할 수 있습니다.

String listString = list.stream().map(Object::toString)
                        .collect(Collectors.joining(", "));

144
Java 8이 이것을 추가하기까지 걸린 시간은 믿을 수 없습니다.
Paul

45
이 답변은 더 많이 투표해야합니다! 해킹, 라이브러리 및 루프가 없습니다.
Songo

4
이것은 OP가 말한 것에는 효과가 없습니다. String.join은 두 번째 인수 Iterable <? CharSequence>를 확장합니다. 따라서 표시하려는 List <String>이 ​​있으면 작동하지만 List <MyObject>가 있으면 OP에서 원하는대로 toString ()을 호출 하지 않습니다.
Hilikus

3
도대체 왜 이것이 첫 번째 (그리고 받아 들여지는) 대답이
Jack


391

Android 에서이 작업을 수행하는 경우 TextUtils 라는 유용한 유틸리티 가 .join(String delimiter, Iterable)있습니다.

List<String> list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
String joined = TextUtils.join(", ", list);

분명히 안드로이드 외부에서는 많이 사용하지는 않지만이 스레드에 추가 할 것이라고 생각했습니다 ...


1
이후 TextUtils.join소요 Object[], 나는 그것이 부르고 있다고 가정 것입니다 toString()각 토큰에. 않습니다 PatientDetails구현 toString()? 그래도 문제가 해결되지 않으면 Separator수업에 문제가있을 수 있습니다 .
JJ Geewax

5
org.apache.lang3.StringUtils거의 동일합니다, 그래서 당신의 대답은 안드로이드 밖에서 나에게 많은 도움이되었습니다 :)
Patrick

1
이 답변의 인기는 많은 자바 질문 안드로이드 개발에서 줄기 당신을 보여줍니다 (현재 가장 높은 하나의 투표)
아 므르 H. 압드 Elmajeed을

1
난 당신이 내 문제를 해결하기 위해이 지구로 보냈다 내기 수 :)
kofoworola

1
당신은 내 생명을 구했습니다. <3
Pratik Butani

234

Apache Commons Lang을 다운로드하고 메소드를 사용하십시오.

 StringUtils.join(list)

 StringUtils.join(list, ", ") // 2nd param is the separator.

물론 직접 구현할 수도 있지만 코드는 완전히 테스트되었으며 아마도 가장 좋은 구현 일 것입니다.

저는 Apache Commons 라이브러리의 열렬한 팬이며 Java 표준 라이브러리에 큰 도움이된다고 생각합니다.


63
불행히도, SO의 이재민들은 바퀴를 재발 명하는 것을 선호합니다.
skaffman

33
또한 Apache Commons Lang에서. 사용법은 다음과 같습니다StringUtils.join(list.toArray(),"\t")
Muhd

33
이 특정 휠은 추가적인 의존성이 거의 없습니다.
Seva Alekseyev

25
@SevaAlekseyev 나는 그것이 논쟁의 여지가 있다고 생각합니다. 이 의존성을 즉시 추가하면 클래스를 자주 사용하지 않을 것입니다. "if string! = null && string.trim ()! =" "을 사용하는 대신 StringUtils.isNotEmpty를 사용합니다. ObjectUtils.equals ()를 사용하므로 어디서나 null을 확인할 필요가 없습니다. 이러한 라이브러리 사용을 정당화하는 하나의 종속성을 기다리는 경우 실제로는 사용하지 않을 수 있습니다.
Ravi Wallau

6
끝에 추가 탭을 추가하지 않는 것도 좋습니다!
keuleJ

139

이것은 꽤 오래된 질문이지만 구아바Joiner수업을 사용하여 더 현대적인 답변을 추가 할 수 있다고 생각합니다 .

String joined = Joiner.on("\t").join(list);

2
이것이 내가 가장 좋아하는 솔루션입니다. :-> 구아바의 경우 +1
csgeek

구아바에도 Ctrl + F를 입력했습니다. 감사!
Priidu Neemre

List <String> list = new ArrayList <문자열> (); list.add ( "Hello"); list.add ( "Hai"); list.add ( "Hi"); System.out.println (list.toString (). substring (1, list.toString (). length ()-1) .replaceAll ( ",", "\ t"));
Lova Chittumuri

86

읽기 쉽고 의미있는 문자열로 List 를 변경 하는 것은 실제로 모든 사람이 직면 할 수있는 일반적인 질문입니다.

사례 1 . 클래스 경로에 아파치의 StringUtils가있는 경우 (rogerdpack 및 Ravi Wallau에서와 같이) :

import org.apache.commons.lang3.StringUtils;
String str = StringUtils.join(myList);

사례 2 . JDK (7)의 방법 만 사용하려는 경우 :

import java.util.Arrays;
String str = Arrays.toString(myList.toArray()); 

혼자서 바퀴를 만들지 마십시오.이 한 줄 작업에는 루프를 사용하지 마십시오.


1
내 게시물을 게시하기 전에 귀하의 Case 2 솔루션을 눈치 채지 못했습니다. 당신은 실제로 훨씬 나아지고 추가 단계를 저장합니다. 추가 도구가 필요한 것으로 보이는 일부 답변보다 확실히 권장합니다.
Elliander

5
Arrays.toString(myList.toArray())- 가장 쉽고 가장 간단한 솔루션
드레이 Bozek

나는 이것이 최고의 가장 효율적인 솔루션으로 간주해야한다고 생각
모리

Arrays.toString(list.toArray())쓰기는 쉽지만 비효율적입니다.
Matthieu

60

Java 5부터 빠른 원 라이너를 찾고 있다면 다음과 같이 할 수 있습니다.

myList.toString().replaceAll("\\[|\\]", "").replaceAll(", ","\t")

또한, 목적이 단지 내용을 인쇄하고 "\ t"에 대해 덜 염려한다면 다음과 같이하면됩니다.

myList.toString()

다음과 같은 문자열을 반환합니다

[str1, str2, str3]

ArrayList가 아닌 Array가있는 경우 다음과 같이 동일하게 수행 할 수 있습니다.

 Arrays.toString(myList).replaceAll("\\[|\\]", "").replaceAll(", ","\t")

3
나는 이것이 실제로 게시 된 방법보다 더 효율적이라고 생각합니다. 그 수치는 바닥에 표시되어 있습니다. 우아하지 않을 수도 있지만 솔루션이 O (n)을 실행하는 반면 다른 것은 이론적으로 O (n ^ 2)를 실행한다고 믿습니다 (Java 문자열은 변경할 수 없으므로 기본적으로 모든 병합에서 새 문자열을 작성하므로 더 악화됩니다. 결과 문자열이 커짐)
user3790827 2016

텍스트가 매우 크면 컴퓨터 리소스를 많이 사용하게됩니다.
user3790827

이 메소드는 StringBuilder를 사용하는 것보다 7-8 배 더 느립니다.
Zoka

@ user3790827 매우 피상적 ​​인 수준을보고 있습니다. 주에 m있는 n도시의 가구에서 사람을 검색하라고 말하면 그 사람은 또는 이라고 말하지만 "이 나라에서이 사람을 찾으십시오"라고 말하면 즉시 말해 줄 수 있습니다. 또한 여기의 모든 알고리즘은 일반적으로 루프 내에 루프 가 없습니다 . xO(mnx)O(n^3)O(n)O(n)
Jai

39

그것을 반복하고 toString을 호출하십시오. 마법의 방법이 없으며, 있다면, 그것을 통해 루핑하는 것 이외의 덮개 아래에서 무엇을 할 것이라고 생각하십니까? 마이크로 최적화의 유일한 방법은 String 대신 StringBuilder를 사용하는 것입니다. 심지어 큰 승리는 아닙니다. 커버 아래에서 문자열을 연결하면 StringBuilder로 바뀌지 만 적어도 그렇게 작성하면 상황을 볼 수 있습니다.

StringBuilder out = new StringBuilder();
for (Object o : list)
{
  out.append(o.toString());
  out.append("\t");
}
return out.toString();

감사! 이것은 내가 끝내는 일이다 :)
Juan Besa

4
큰 배열의 경우 이것은 미세 최적화가 아닙니다. StringBuilder를 사용하기위한 자동 변환은 각 문자열 연결에 대해 개별적으로 수행되므로 루프의 경우 도움이되지 않습니다. 하나의 표현식에 많은 수의 요소를 연결해도 괜찮습니다.
starblue

1
연결하는 경우 StringBuilder를 명시 적으로 사용하는 것이 중요합니다. ~ 1MB의 결과 문자열을 만드는 50000 개의 문자열-1 초의 실행 시간과 1 분의 차이가있을 수 있습니다.
Mr. Napik

36

대부분의 Java 프로젝트에는 종종 Apache Commons 랭귀지가 있습니다. StringUtils.join () 메소드는 매우 훌륭하고 거의 모든 요구를 충족시키는 여러 가지 특징이 있습니다.

public static java.lang.String join(java.util.Collection collection,
                                    char separator)


public static String join(Iterator iterator, String separator) {
    // handle null, zero and one elements before building a buffer 
    Object first = iterator.next();
    if (!iterator.hasNext()) {
        return ObjectUtils.toString(first);
    }
    // two or more elements 
    StringBuffer buf = 
        new StringBuffer(256); // Java default is 16, probably too small 
    if (first != null) {
        buf.append(first);
    }
    while (iterator.hasNext()) {
        if (separator != null) {
            buf.append(separator);
        }
        Object obj = iterator.next();
        if (obj != null) {
            buf.append(obj);
        }
    }
    return buf.toString();
}

매개 변수 :

collection- 결합 할 값의 콜렉션. null의 경우도있다

separator- 사용하는 단락 문자

리턴 : 결합 된 문자열, 널 (null) 반복기 입력 인 경우 널

이후 : 2.3


2
join(...)메소드에는 배열과 컬렉션 모두에 대한 변형 이 있으므로 매우 좋습니다 .
vikingsteve

거의 채워지지 않은 요소와 임의의 숫자로 문자열 컬렉션을 만들어야했습니다. 결국 배열은 문자열이 아닌 배열이 아닌 문자열이 필요했습니다. 이것은 내 코드입니다 : Collections.shuffle (L); StringBuilder sb = new StringBuilder (); L.forEach (e-> sb.append (e)); return sb.toString ();
dobrivoje


14

이 간단한 유스 케이스의 경우 단순히 문자열을 쉼표로 결합 할 수 있습니다. Java 8을 사용하는 경우 :

String csv = String.join("\t", yourArray);

그렇지 않으면 commons-lang에는 join () 메소드가 있습니다.

String csv = org.apache.commons.lang3.StringUtils.join(yourArray, "\t");

13

후행 분리 문자를 처리하는 우아한 방법은 Class Separator 를 사용하는 것입니다.

StringBuilder buf = new StringBuilder();
Separator sep = new Separator("\t");
for (String each: list) buf.append(sep).append(each);
String s = buf.toString();

Class Separator의 toString 메소드 는 첫 번째 호출을 제외하고 구분자를 리턴합니다 . 따라서 우리는 후행 (또는이 경우) 선행 구분 기호없이 목록을 인쇄합니다.


8

Java 8에서는 간단합니다. 정수 목록은 예를 참조하십시오.

String result = Arrays.asList(1,2,3).stream().map(Object::toString).reduce((t, u) -> t + "\t" + u).orElse("");

또는 여러 줄 버전 (읽기가 더 간단 함) :

String result = Arrays.asList(1,2,3).stream()
    .map(Object::toString)
    .reduce((t, u) -> t + "\t" + u)
    .orElse("");

업데이트-더 짧은 버전

String result = Arrays.asList(1,2,3).stream()
                .map(Object::toString)
                .collect(Collectors.joining("\t"));

2
이것은 단지 한 줄의 코드 일 수도 있지만 간단하지는 않습니다. 나를 위해 List를 탐색하고 해당 요소를 String으로 파싱하는 것이 이것보다 간단합니다.
Bartzilla

1
이것은 나의 첫인상이기도했다. 그러나 익숙해지면 정말 멋집니다. 예를 들어과 같은 작업을 추가 할 수 있습니다 filter. 결국 코드를 ​​읽는 것이 훨씬 쉽습니다.
amra

3
자바 8 : String.join ( "\ t", array)
Tomasz

마지막 주석은 내용도 String마찬가지로 작동합니다. 의 목록에 Integer문제가있는 경우
LeO

이 세 가지 모두 Android에서 API 레벨 24가 필요합니다.
Asad35

6

그것은 O(n) 어느 쪽이든 알고리즘입니다 (목록을 여러 하위 목록으로 나누는 다중 스레드 솔루션을 수행하지 않은 한, 그것이 당신이 요구하는 것이라고 생각하지 않습니다).

StringBuilder아래와 같이 a 를 사용하십시오 .

StringBuilder sb = new StringBuilder();

for (Object obj : list) {
  sb.append(obj.toString());
  sb.append("\t");
}

String finalString = sb.toString();

StringBuilder당신이 다시 인스턴스화 수 없기 때문에 훨씬 빨리 문자열 연결보다 것이다 String각 연결 개체를.


5

Android에 있고 아직 Jack을 사용하지 않는 경우 (예 : Instant Run에 대한 지원이 여전히 부족하기 때문에) 결과 문자열의 형식을보다 세밀하게 제어하려는 경우 (예 : 줄 바꿈 문자를 다음과 같이 사용하려는 경우) 요소 나누기)를 사용하고 StreamSupport 라이브러리를 사용하여 Java7 또는 이전 버전의 컴파일러에서 스트림을 사용하는 경우 다음과 같이 사용할 수 있습니다 (이 방법을 내 ListUtils 클래스에 넣습니다).

public static <T> String asString(List<T> list) {
    return StreamSupport.stream(list)
            .map(Object::toString)
            .collect(Collectors.joining("\n"));
}

물론 목록 객체의 클래스에 toString ()을 구현해야합니다.


1
reduce문자열 연결에는 사용 이 매우 비효율적입니다. return StreamSupport.stream(list).map(Object::toString).collect(joining("\n"))내부적으로 사용 하는 Java 8 방식으로해야 합니다 StringJoiner. streamsupport로이 작업을 수행 할 수없는 이유는 없습니다 .
Stefan Zobel

또 다른 것은 Optional#get빈 목록을 전달하면 코드가 끔찍하게 실패한다는 것입니다 .
Stefan Zobel

@StefanZobel 효율성 및 엣지 케이스 문제를 지적 해 주셔서 감사합니다. 코드를 수정했습니다.
Javad Sadeqzadeh

3

마지막 요소 다음에 마지막 \ t를 원하지 않으면 인덱스를 사용하여 확인해야하지만 목록이 RandomAccess를 구현할 때이 "작동"(즉, O (n)) 만 기억하십시오.

List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

StringBuilder sb = new StringBuilder(list.size() * apprAvg); // every apprAvg > 1 is better than none
for (int i = 0; i < list.size(); i++) {
    sb.append(list.get(i));
    if (i < list.size() - 1) {
        sb.append("\t");
    }
}
System.out.println(sb.toString());

3

아래 코드가 도움이 될 수 있습니다.

List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
String str = list.toString();
System.out.println("Step-1 : " + str);
str = str.replaceAll("[\\[\\]]", "");
System.out.println("Step-2 : " + str);

산출:

Step-1 : [1, 2, 3]
Step-2 : 1, 2, 3

3

가장 좋은 방법은 아니지만 우아한 방법 일 수 있습니다.

Arrays.deepToString (Arrays.asList ( "Test", "Test2")

import java.util.Arrays;

    public class Test {
        public static void main(String[] args) {
            System.out.println(Arrays.deepToString(Arrays.asList("Test", "Test2").toArray()));
        }
    }

산출

[테스트, 테스트 2]


1
"best"가 코드 판독성을 의미한다면 이것이 최선의 방법이라고 생각합니다. 코드를 보지 않았지만 출력에서 ​​사용자 정의 할 수는 없지만 StringBuilder 메서드 (아마도 StringBuilder를 사용합니다)만큼 효율적일 것입니다.
Mike Miller

3

다음이 좋을까요?

List<String> streamValues = new ArrayList<>();
Arrays.deepToString(streamValues.toArray()));   

3

당신이 사용하는 경우 이클립스 컬렉션 , 당신은 사용할 수있는 makeString()방법을.

ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

Assert.assertEquals(
    "one\ttwo\tthree",
    ArrayListAdapter.adapt(list).makeString("\t"));

당신이 당신을 변환 할 수 있습니다 경우 ArrayListA를 FastList, 당신은 어댑터를 제거 얻을 수 있습니다.

Assert.assertEquals(
    "one\ttwo\tthree",
    FastList.newListWith("one", "two", "three").makeString("\t"));

참고 : 저는 Eclipse Collections의 커미터입니다.


3
List<String> stringList = getMyListOfStrings();
StringJoiner sj = new StringJoiner(" ");
stringList.stream().forEach(e -> sj.add(e));
String spaceSeparated = sj.toString()

new StringJoiner분리 자로 사용하려는 문자 순서로 전달합니다 . CSV를 수행하려는 경우 :new StringJoiner(", ");


3

한 줄에 : [12,0,1,78,12]에서 12 1 78 12

String srt= list.toString().replaceAll("\\[|\\]|,","");

2
1) 더 이상 이와 같은 코드를 사용할 이유가 없습니다 (4 년 전). 2)이 답변은 Q & A에 아무 것도 추가하지 않습니다.
Radiodef

한 줄에 별 5 개. 고마워
Atef Farouk

이것은 완벽하게 작동합니다. 쉼표로 구분 된 문자열을 사용하는 경우 : String srt = list.toString (). replaceAll ( "\ [| \]", "");
Asad35Waheed

2

println 을 사용하는 대신 탭을 사용하여 분리 하려면 print 를 사용할 수 있습니다

ArrayList<String> mylist = new ArrayList<String>();

mylist.add("C Programming");
mylist.add("Java");
mylist.add("C++");
mylist.add("Perl");
mylist.add("Python");

for (String each : mylist)
{       
    System.out.print(each);
    System.out.print("\t");
}

1

추가 리소스에 의존하는 몇 가지 예를 보았지만 이것이 가장 간단한 해결책 인 것처럼 보입니다. (내 프로젝트에서 사용한 것) 기본적으로 ArrayList에서 Array로 변환 한 다음 List로 변환하는 것입니다 .

    List<Account> accounts = new ArrayList<>();

   public String accountList() 
   {
      Account[] listingArray = accounts.toArray(new Account[accounts.size()]);
      String listingString = Arrays.toString(listingArray);
      return listingString;
   }

0

이것은 지금까지 꽤 오래된 대화이며 아파치 커먼즈는 이제 내부적으로 StringBuilder를 사용하고 있습니다. http://commons.apache.org/lang/api/src-html/org/apache/commons/lang/StringUtils.html#line. 3045

이것은 우리가 알고있는 것처럼 성능을 향상 시키지만, 성능이 중요하다면 사용 된 방법이 다소 비효율적 일 수 있습니다. 인터페이스가 유연하고 다른 컬렉션 유형에서 일관된 동작을 허용하는 반면 원래 질문의 컬렉션 유형 인 목록에는 다소 비효율적입니다.

나는 전통적인 for 루프에서 단순히 요소를 반복함으로써 피할 수있는 약간의 오버 헤드가 발생한다는 점에서 이것을 근거로합니다. 대신, 동시 수정, 메소드 호출 등을 확인하는 장면 뒤에서 발생하는 몇 가지 추가 사항이 있습니다. 반면 강화 된 for 루프는 반복자가 Iterable 객체 (목록)에서 사용되므로 동일한 오버 헤드가 발생합니다.


0

이를 위해 정규식을 사용할 수 있습니다. 이것은 얻을만큼 간결합니다

System.out.println(yourArrayList.toString().replaceAll("\\[|\\]|[,][ ]","\t"));

-1

이 기능은 어떻습니까?

public static String toString(final Collection<?> collection) {
    final StringBuilder sb = new StringBuilder("{");
    boolean isFirst = true;
    for (final Object object : collection) {
        if (!isFirst)
            sb.append(',');
        else
            isFirst = false;
        sb.append(object);
    }
    sb.append('}');
    return sb.toString();
}

그것은 모든 유형의 컬렉션에서 작동합니다 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.