이 기사의 내용은 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 메서드를 사용하여 문자 배열을 다시 복사하여 새 문자열을 구성합니다.
여기의 문자열은 변경할 수 없으며 문자열 참조만 변경합니다.
다양한 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] = 'J'; value[7] = 'a'; value[8] = 'v'; value[9] = 'a'; value[10] = '!'; value[11] = '!'; System.out.println(str); // Hello Java!!
반사를 통해 기본 문자 배열의 값을 변경하고 문자열의 "불변성"을 달성합니다. 이는 교활한 작업이므로 String 클래스에 대한 Java의 불변 설계 원칙을 위반합니다. 일부 보안 문제가 발생할 수 있습니다.
위 내용은 Java에서 문자열을 변경할 수 있나요? (자세한 예시)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!