>  기사  >  Java  >  Java에서 문자열을 변경할 수 있나요? (자세한 예시)

Java에서 문자열을 변경할 수 있나요? (자세한 예시)

不言
不言원래의
2018-09-17 17:12:152273검색

이 기사의 내용은 Java의 문자열이 변경 가능한지 여부에 관한 것입니다. (예제에 대한 자세한 설명)은 참고할만한 가치가 있습니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

우리 모두는 Java의 String 클래스가 불변으로 설계되었다는 것을 알고 있습니다. String 클래스의 소스 코드를 살펴보겠습니다.

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
    /** The value is used for character storage. */
    private final char value[];
    
    /** Cache the hash code for the string */
    private int hash; // Default to 0
    
    // ...
    
}

String 클래스가 최종 유형이고 String을 상속할 수 없음을 알 수 있습니다. 그 값은 문자 배열의 캡슐화, 즉 char[]입니다. 그 값은 private final로 정의됩니다. 즉, 외부 세계에서 수정할 수 없습니다. 즉, 변경할 수 없습니다.

문자열은 정말 "불변"인가요?

아래 예를 보세요.

String str = "Python";
System.out.println(str); // Python

str = "Java";
System.out.println(str); // Java

str = str.substring(1);
System.out.println(str); // ava

질문하실 수도 있습니다. str이 Python에서 Java로 변경되지 않았나요? 그러면 substring 방식을 통해서 ava가 되는 건가요?

사실 초보자들이 오해하는 부분이 있습니다. 위의 String 구조를 보면 문자열이 문자 배열로 구성되어 있다는 것을 알 수 있습니다. str은 단지 참조일 뿐이고, 이후에는 "Java"가 됩니다. " 및 하위 문자열도 Arrays.copyOfRange 메서드를 사용하여 문자 배열을 다시 복사하여 새 문자열을 구성합니다.

Java에서 문자열을 변경할 수 있나요? (자세한 예시)

여기의 문자열은 변경할 수 없으며 문자열 참조만 변경합니다.

다양한 JDK 버전의 하위 문자열 간의 차이점에 대해서는 "참고: jkd6, 7 및 8의 문자열 하위 문자열 방법의 차이점" 기사를 읽을 수도 있으며 각 하위 문자열 버전의 소스 코드도 볼 수 있습니다.

문자열은 정말 "불변"인가요?

위의 예는 확실히 불변이지만 다음 예는 당황스럽습니다.

String str = "Hello Python";
System.out.println(str); // Hello Python

Field field = String.class.getDeclaredField("value");
field.setAccessible(true);

char[] value = (char[])field.get(str);
value[6] = &#39;J&#39;;
value[7] = &#39;a&#39;;
value[8] = &#39;v&#39;;
value[9] = &#39;a&#39;;
value[10] = &#39;!&#39;;
value[11] = &#39;!&#39;;
System.out.println(str); // Hello Java!!

반사를 통해 기본 문자 배열의 값을 변경하고 문자열의 "불변성"을 달성합니다. 이는 교활한 작업이므로 String 클래스에 대한 Java의 불변 설계 원칙을 위반합니다. 일부 보안 문제가 발생할 수 있습니다.

위 내용은 Java에서 문자열을 변경할 수 있나요? (자세한 예시)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.