> Java > java지도 시간 > 본문

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

不言
풀어 주다: 2018-09-17 17:12:15
원래의
2258명이 탐색했습니다.

이 기사의 내용은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!