이 글은 java에 대한 관련 지식을 제공합니다. 문자열의 상수 풀, 문자열의 불변성 등을 포함하여 문자열 클래스와 관련된 문제를 주로 소개합니다. 모두에게 도움이 되기를 바랍니다.
추천 학습: "java 비디오 튜토리얼"
먼저 JDK에서 String 클래스 소스 코드를 살펴보겠습니다. String 클래스가 final에 의해 수정된 것을 볼 수 있습니다. 이는 String 클래스를 상속할 수 없으며 String의 하위 클래스가 없음을 의미합니다. 이러한 방식으로 JDK를 사용하는 모든 사람들은 String이 허용되는 경우 동일한 String 클래스를 사용합니다. 상속받으려면 누구나 String을 확장할 수 있습니다. 모두가 사용하는 String은 동일한 버전이 아닙니다. 서로 다른 두 사람이 동일한 방법을 사용하면 다른 결과가 표시됩니다.
상속 및 메서드 재정의가 불가능합니다. band 유연성을 가져오는 동시에 하위 클래스의 일관되지 않은 동작에 대한 많은 문제도 발생시킵니다
방법 1: 직접 할당(일반적으로 사용됨)
String str = " hello word "
방법 2: 생성 방법을 통해 객체 생성
String str1 = new String(" hello word ");
방법 3: 문자 배열을 통해 객체 생성
char[] data = new char[]{'a', 'b', 'c'};
방법 4: 문자열의 정적 메소드 사용 valueOf(모든 데이터 유형) = >문자열로 변환(일반적으로 사용됨)
String str2 = String.valueOf(10);
10 – > int literal
10.1 --> true --> boolean literal
" abc " – > object
String str = “hello word”;
String str2 = str; 이때는 문자열 리터럴이자 문자열 개체입니다. 이때 이해의 편의를 위해 그림을 그려보겠습니다. 일시적으로 힙에 저장되어 있다고 생각하는데, 실제로는 메소드 영역에 저장되어 있는데, 이때 str2 = "Hello"이면 str의 출력에는 영향을 미치지 않습니다. string 객체는 이때 힙에 새로운 공간이 열렸다는 의미이며, str2는 이때 새 객체의 주소 공간을 저장하므로 str에는 아무런 영향을 미치지 않습니다.
4 문자 문자열 비교는 동일합니다
모든 참조 데이터 유형은 동일한지 비교할 때 equals 메서드를 사용합니다. JDK의 공통 클래스는 equals 메서드를 재정의했으며 직접 사용할 수 있습니다.
참조 데이터 유형은 ==를 사용하여 주소를 비교합니다.
아래 그림은 다음을 가리키는 두 참조를 보여줍니다. 문자열의 상수 풀과 관련된 동일한 주소 공간
같음의 비교 크기는 대소문자를 구분하는 비교입니다
equalsIgnoreCase 메소드는 대소문자를 구분하지 않는 비교입니다
문자열 객체를 생성하기 위해 직접 할당 방식을 사용할 때 JVM은 객체가 그렇지 않은 경우 문자열 상수 풀을 유지합니다. 힙에 존재하면 문자열 객체가 생성되어 문자열 상수 풀에 추가됩니다. 문자열 객체를 생성하기 위해 직접 할당 방법을 계속 사용하면 JVM은 참조가 가리키는 내용이 상수 풀에 이미 존재한다는 것을 찾습니다. 이때, 새로운 문자열 객체를 생성할 필요는 없고, 기존 객체를 그대로 재사용하기 때문에 위 그림의 3개의 참조가 동일한 주소를 가리키고 있습니다
객체가 처음 생성되면, 아무것도 없으면 문자열 객체가 생성되어 상수 풀에 저장되고, 두 번째, 세 번째 객체가 생성되면 JVM은 동일한 내용이 상수 풀에 이미 존재하는 것을 발견하므로 더 이상 존재하지 않습니다. 이상은 새로운 객체를 생성하고 str1과 동일한 주소 공간을 직접 생성합니다.
이때 프로그램은 오른쪽에서 왼쪽으로 실행됩니다. 이때 코드의 첫 번째 줄의 오른쪽은 문자열 상수입니다. , 역시 문자열 개체이므로 먼저 상수 풀에서 공백 조각을 열고 새 문자열 개체를 생성하여 저장합니다. 프로그램은 왼쪽으로 실행되며 이때 새 키워드를 만나게 됩니다. 객체가 생성되어 힙에 저장됩니다. 그런 다음 str1은 힙의 객체를 가리킨 다음 두 번째 및 세 번째 줄을 가리킵니다. 코딩할 때 해당 객체가 상수 풀에 이미 존재하는 것으로 확인됩니다. . new 키워드를 만나면 새로운 객체가 생성됩니다.
String 클래스에서 제공하는 인턴 방법:
인턴 메소드를 호출하면 현재 문자열 참조가 가리키는 객체가 문자열 상수 풀에 저장됩니다.
1. 객체가 현재 상수 풀에 이미 존재하는 경우 새 객체가 다시 생성되지 않습니다. , 상수 풀에 있는 String 객체를 반환합니다
2. 현재 상수 풀에 해당 객체가 없으면 해당 객체를 풀에 추가하고 풀에 들어간 후 주소를 반환합니다.
1. 다음 코드 줄의 출력을 살펴보세요
intern 메서드에는 반환 값이 있으므로 str1은 이때 intern 메서드만 호출하고 반환 값을 받지 않으므로 str1은 여전히 를 가리킵니다. 힙에 있는 객체인 str2는 상수 풀에 있는 객체를 가리키므로 false를 반환합니다.
인턴 메서드 호출의 반환 값을 받는 한 true를 반환합니다. str1이 가리키는 개체가 풀에 수동으로 추가되고 풀에 이미 개체가 있으므로 str1이 개체를 직접 가리키도록 하세요
2. 다음 코드 줄의 출력을 살펴보세요
수영장, 수영장에 아무것도 없으니 바로 상수풀로 옮기세요
참고: 소위 문자열 불변성은 문자열의 참조를 변경할 수 없다는 의미가 아니라 문자열의 내용을 변경할 수 없음을 의미합니다
Immutable은 "hello", "world", "helloworld", "!!!"를 참조하고 이어진 "helloworld!!!"는 문자열 개체로 생성되었으며, 이러한 개체는 일단 선언되면 수정할 수 없습니다. 하지만 참조는 변경될 수 있습니다. 한 순간은 hello를 가리키고 또 다른 순간은 helloworld를 가리키며 이제는 hello world를 가리킵니다. ! ! , 이것이 모두 가능합니다
문자열은 단지 문자 배열일 뿐입니다 -> char[], 문자열은 실제로 문자 배열에 저장됩니다. 문자열의 내용을 변경할 수 없는 이유는 무엇입니까? 문자열의 소스코드를 살펴보고 알아봅시다.
String 내부의 문자 배열이 캡슐화되어 있음을 알 수 있습니다. 이 문자 배열은 문자열의 내용을 변경하는 것은 물론이고 String 클래스 외부에서 액세스할 수도 없습니다.
String str = " hello ";
1. 런타임 시 리플렉션을 통해 값 배열의 캡슐화를 파괴합니다
2. StringBuilder 또는 StringBuffer 클래스를 교체합니다. - - 더 이상 동일한 유형이 아닙니다
a.StringBuilder: 스레드가 안전하지 않고 강력한 성능을 발휘합니다
b .StringBuffer: 스레드 안전, 성능 저하
또한 두 클래스의 사용법은 완전히 동일합니다
문자열을 자주 연결해야 하는 경우 StringBuilder 클래스의 추가 메서드를 사용하세요. 잠시 후 변경되며 곧 hello world가 됩니다
StringBuilder 클래스와 String은 문자열 연결 문제를 해결하기 위해 만들어졌습니다.
StringBuilder 클래스와 클래스의 문자열 상호 변환:
1. StringBuilder는 toString 메서드를 호출하여 String 클래스로 변환할 수 있습니다.
2. String 클래스는 StringBuilder의 생성자 또는 추가 메서드를 사용하여 StringBuilder 클래스로 변환할 수 있습니다.
기타 일반적으로 사용되는 방법:
a. sb에서 제공하는 reverse(); 지정된 범위의 데이터를 삭제하고(int start, int end); to end, left 닫힌 오른쪽 open 간격
java 비디오 튜토리얼
》
위 내용은 Java의 String 클래스를 완전히 마스터하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!