2017-10-04 3 views
-3

그래서 이런 코드 가지고자바에서의 StringBuilder 어레이에서의 StringBuilder 조작

StringBuilder[] a = new StringBuilder[5]; 
     Arrays.fill(a, new StringBuilder("asdfg")); 
     a[0].deleteCharAt(0); 
     for (StringBuilder s : a) { 
      System.out.println(s); 
     } 

및 출력이 어레이의 모든 요소는 참조 것 같다

sdfg 
sdfg 
sdfg 
sdfg 
sdfg 

같은 StringBuilder 개체, 나는 Arrays.fill() 때문에 그것을 추측한다. 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까? p.s : fill()이 StringBuilder []와 다르게 동작하기 때문에 루프를 사용하지 않으려 고하고 이유를 이해하고 싶습니다. API, Arrays.fill 가입일

+0

뜻 어떻게 "fill()은 StringBuilder []"와는 다르게 동작 합니다만 그렇지 않다고 확신합니다. – daniu

+2

'StringBuilder'와 다른 점을 나타낼 수 있습니까? 다른 결과를 산출 할 수있는 * 다른 클래스 *로 샘플을 제공 할 수 있습니까? –

답변

1

나는 "fill()StringBuidler[]과 다르게 동작"당신은 단지 다른 불변 개체를 시도했기 때문이다 말을하는 이유 확신하고 StringBuilder는 없습니다.

List<String> list[] = new List[5]; 
Arrays.fill(list, new ArrayList<String>()); 
list[0].add("hello"); 
for (List l : list) { 
    System.out.println(l); 
} 

불변의 인스턴스에서 호출하는 방법이 변경되지 않음을 의미합니다 시도하는 것은 '의 경우 누적 String, 또는 List에서'의 StringBuilder에 같은 상태 (의 S, 포함 된 항목.

+0

오, 나는'StringBuilder'가 변경 가능하다는 것과'String' (내가 시도한 것 중 하나)이 아니라는 것을 몰랐습니다. 시간을 낭비해서 죄송합니다. 앞으로 더 사려 깊을 것입니다. –

1

...

오브젝트의 배열의 각 요소에 지정된 객체 참조를 할당한다.

는 그래서 그래, 그것은 동일한 참조하고, 불행하게도 당신은 모든 요소에 다른 StringBuilder을 할당하는 반복의 형태가 필요합니다.

5

나타나는 동작이 예상됩니다. the javadoc of Arrays.fill()을 인용

:

를 할당 오브젝트의 배열의 각 요소에 지정된 개체 참조.

강조 광산.

참조 여기에 프로토 타입 val입니다 (리콜 : public static void fill(Object[] a, Object val), 당신의 new StringBuilder("asdfg")입니다

당신이 다른 요소와 배열의 각 요소를 채우려는 경우

, 당신은 배열 인덱스를 순환해야합니다. 새로운 개체와 각 시간을 채우기 예를 들어 (자바 8을 사용).

IntStream.range(O, a.length).foreach(index -> a[index] = new StringBuilder("asdfg")); 
보조 노트로

, 당신은,243를 사용할 수도직접 코드를 읽을 수 있을지 모르겠지만 배열을 직접 빌드하십시오. 스트림 API 악용 경고!

final StringBuilder[] a = IntStream.range(0, 5) 
    .mapToObj(ignored -> new StringBuilder("asdfg")) 
    .toArray(StringBuilder[]::new);