2013-12-16 4 views
0

문자열이 불변이므로 다음과 같이 작성하여 str에서 영숫자가 아닌 모든 문자를 제거해야합니다. 나는 이해할 수 없었다 무엇Java String은 내부적으로 모든 비 숫자 작업을 어떻게 제거합니까?

void test(String str) { 
    str = str.replaceAll("[^a-zA-Z0-9\\s]", "").toLowerCase(); 
    System.out.println("\n" +str); 
    } 

방법이 다시 할당 str에하는 방식으로 작동합니다 올 것입니다?

문자열이 불변이므로, 새로운 문자열 newString에 할당하면 str과 newString이라는 두 개의 다른 객체를 가리킨다는 것을 이해합니다. 원래 문자열은 str을 가리키고 수정 된 문자열은 두 개의 다른 불변 문자열을 가진 newStr을 가리키고 있습니다. 이것은 나에게 좋다.

void test(String str) { 
      String newStr = str.replaceAll("[^a-zA-Z0-9\\s]", "").toLowerCase(); 
    System.out.println("\n" +newStr); 
    } 

하지만 어떻게 동일한 str 개체에 다시 할당하여 작동합니까? 내 이해를 기반으로, 그것은 일하지 말았어야 이후 불변의 str을 수정할 수 없습니다, 그래서 수정 된 str의 결과는 불변의 str에 저장할 수 없습니다.

void test(String str) { 
     // this shouldn't be working based on my understanding. But it works. Why? 
    str = str.replaceAll("[^a-zA-Z0-9\\s]", "").toLowerCase(); 
    System.out.println("\n" +str); 
    } 

다음 이미지에서 보았 듯이 string1과 string2는 힙의 동일한 String 개체를 가리 킵니다. 이것이 내부적으로 어떻게 작동하는지 분명히 할 수 있습니까?

+0

글쎄, 단순히 참조 ('str')를 새로 생성 된'String' 객체로 바꾸기 만하면됩니다. 나에게 꽤 기초적인 것 같다. – GGrec

+0

'String str'은 문자열에 대한 ** 참조 **입니다. –

답변

2

동일한 str 개체에 지정하지 않았습니다.

replaceAll 등의 메소드를 살펴보면 replaceAll 메소드가 생성 한 String 객체 인 String을 반환한다는 것을 알 수 있습니다.

그래서 str=str.replaceAll()str에서 String 참조를 소요 StringreplaceAll()를 호출합니다. replaceAll 프로세스 this 다음 처리 결과와 함께 새로운 String 개체를 반환합니다. 그런 다음 원래 참조로 다시 할당합니다.

2

참조를 이해해야합니다. str은 메모리의 특정 영역에 대한 참조입니다. Java 런타임은 모든 문자가 제거 된 문자열로 새로운 메모리 영역을 만들고 나서 새 메모리 영역에 str을 가리킨다.

이미 가리키는 메모리 영역을 수정하는 것과 같지 않습니다. str.

"변경 가능"은 변수가 가리키는 메모리 영역을 수정할 수 없음을 의미합니다. 내용이 수정되었습니다. "수정"하려면 메모리를 복사하고 수정 한 다음 다시 할당해야합니다.

"변경 가능"개체는 이전 데이터를 새 메모리 영역으로 복사하지 않고 메모리의 데이터를 수정할 수 있습니다.


그런데이 예에서 문자열은 두 번 복사됩니다. 그런 다음 다른 복사본이 다음 마지막으로 당신의 변수에 할당

toLowerCase() 

에 의해 생성된다

replaceAll("[^a-zA-Z0-9\\s]", "") 

:

처음,이 문자열을 copyies.

코드는에 따라서 동일 다음

void test(String str) 
{ 
    String str1 = str.replaceAll("[^a-zA-Z0-9\\s]", ""); 
    String str2 = str1.toLowerCase(); 
    str = str2; 

    System.out.println("\n" +str); 
} 
0

당신은 자바에서 변수는 객체가 아니라는 것을 이해할 필요가있다; 변수는 이고 개체에 대해서는입니다.

따라서 은 String 개체가 아니기 때문에 String 개체에 대한 참조입니다. "변경할 수 없음"은 변수가 참조하는 객체의 내용을 변경할 수 없음을 의미합니다. 변수 자체가 다른 오브젝트를 참조하도록 변경 될 수 없다는 것을 의미하지는 않습니다.

str은 다른 String 개체를 가리키고 있습니다. 즉 이 반환하는 새로운 String 개체입니다.

관련 문제