자바 에는 어떤 조작 문자열 의 종류 가 있 습 니까?차이 가 어디 에 있 습 니까?
작업 문자열 의 종 류 는 주로 String 류,StringBuffer 류,StringBuilder 류 세 개 를 사용 합 니 다.
가 변 문자열
String 클래스
public class StringTest {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2); // true
System.out.println(s2 == s3); // false
s2 = "abc" + "def";
System.out.println(s1 == s2); // false
String s4 = "abcdef";
System.out.println(s4 == s2); // true
}
}
1.String 클래스 를 초기 화 할 때 상수 탱크 에 대상 을 만 들 고 s1 이 상수 탱크 의 주 소 를 가리 키 는 것 을 참조 합 니 다.2.s2 를 만 들 때 상수 탱크 에
=
대상 이 있 는 지 확인 하고 있 으 면 s2 를 상수 탱크 에 있 는"abc"
로 직접 가리 키 기 때문에 s1 과 s2 는 같은 대상 을 가리킨다.3.
"abc"
키 워드 를 사용 하여 String 대상 을 만 들 때 쌓 인 공간 에서 메모리 하 나 를 열 고 쌓 인 상태 에서 s3 를 초기 화 합 니 다.s3 는 쌓 인 메모리 공간의 한 구역 을 가리 키 고 있 습 니 다.4.우리 가 s2 를 수정 할 때 사실은 상수 탱크 에 새로운 대상
new
을 추가 한 것 입 니 다.이때 우 리 는 새로운 대상 s4 를 만 드 는 것 과 s2 를 만 드 는 절차 가 같 습 니 다.s4 는 상수 탱크 에서"abcdef"
을 찾 았 기 때문에 이 대상 을 직접 가리 키 고 있 습 니 다.우리 가 String 형식의 변 수 를 조작 할 때,사실은 매번 변 경 될 때마다 새로운 대상 을 제외 하고 만 듭 니 다.
가 변 문자열
StringBuffer 와 StringBuilder 클래스 에서 문자열 을 추가 삭제 하 는 방법 을 제공 합 니 다.원본 대상 에 새로운 문 자 를 추가 하 는 예 시 를 보 여 줍 니 다.
public class StringTest2 {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb1.hashCode()); // 460141958
System.out.println(sb2.hashCode()); // 1163157884
sb1.append("def");
sb2.append("def");
System.out.println(sb1.hashCode()); // 460141958
System.out.println(sb2.hashCode()); // 1163157884
}
}
이 예 를 통 해 우 리 는 s1 과 s2 가 원 소 를 증가 하 는 전후 에 여전히 같은 대상 임 을 뚜렷하게 볼 수 있다.StringBuffer 와 StringBuilder 는 모두
"abcdef"
류 를 계승 했다.StringBuffer 클래스
StringBuilder 클래스 와 비교 해 보면 StringBuffer 클래스 의 방법 은
AbstractStringBuilder
키 워드 를 사용 하지 않 았 습 니 다.
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBuilder 클래스
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
AbstractString Builder 클래스 의 append 방법확장 방법:ensureCapacity Internal()방법 으로 초기
synchronized
공간 이 충분 한 지 확인 하고 부족 하면 확장 작업 을 합 니 다.
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
//
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code
//
if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value,
newCapacity(minimumCapacity));
}
}
copy Of 방법:새로운 char 배열 을 다시 만 들 고 원래 배열 의 데 이 터 를 새 배열 로 복사 합 니 다.
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
작은 매듭자바 작업 문자열 의 종 류 는 주로 세 가지 가 있 는데 그것 이 바로 String 류,StringBuffer 류 와 StringBuilder 류 입 니 다.이 세 가지 종류의 바 텀 은 모두
char[] value
형식 으로 문자열 대상 을 저장 합 니 다.이들 의 차 이 는 주로 다음 과 같 습 니 다.1.String 형식 을 수정 한 후 재 생 성 대상 에 해당 합 니 다.StringBuffer 와 StringBuilder 가 추가 삭제 작업 을 하 는 것 은 모두 같은 대상 을 대상 으로 합 니 다.
2.StringBuffer 의 대부분 방법 은 synchronized 키 워드 를 사용 하지 않 았 기 때문에 성능 이 더욱 좋 습 니 다(제 가 문 제 를 풀 때 도 이것 을 씁 니 다).단일 스 레 드 의 경우 StringBuffer 류 를 우선 사용 합 니 다.다 중 스 레 드 환경 에서 StringBuilder 류 를 사용 하여 스 레 드 안전 을 확보 해 야 합 니 다.
3.문자열 이 설명 한 후에 변경 할 필요 가 없다 면 String 류 가 가장 좋 은 선택 이 라 고 직접 설명 합 니 다.new 키 워드 를 사용 하지 않 고 String 대상 을 설명 할 때 메모리 에 공간 을 열 지 않 고 String 상수 풀 을 직접 가리 키 는 것 입 니 다.이렇게 하면 재 활용 을 실현 하고 자원 소 모 를 줄 일 수 있 습 니 다.
확장 읽 기
자바 기초 시리즈 1 탄 방법 재 업로드 와 방법 재 작성 의 차이
자바 기초 시리즈 2 탄 의 자바 다 중 멤버 접근 특징
자바 에 대해 어떤 조작 문자열 이 있 습 니까?차이 가 어디 에 있 습 니까?의 글 은 여기까지 소개 되 었 습 니 다.자바 작업 문자열 과 관련 된 더 많은 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.