자바 string.trim()은 도대체 무엇 을 지 웠 습 니까?
5075 단어 Javastring.trim()
Stack Overflow 에서 질문 을 보 았 습 니 다이것 괜찮아요?:
I am receiving a string from server trailing one or two lines of spaces like below given string.
String str = "abc*******
********";
Consider * as spaces after my stringi have tried a few methods like
str = str.trim();
str = str.replace(String.valueOf((char) 160), " ").trim();
str = str.replaceAll("\u00A0", "");
but none is working. Why i am not able to remove the space?이 를 위해 trim()방법의 소스 코드 를 보 니 재 미 있 었 다.
먼저 아래 코드 를 보십시오.
public static void main(String[] args) {
String str = "abc";
System.out.println(str.length());
str = str.trim();
System.out.println(str.length());
}
저 는 여러분 이 자바 를 처음 배 웠 을 때 선생님(또는 책 에서)이 어떻게 말씀 하 셨 는 지 잘 모 르 겠 습 니 다.저 는 입문 할 때 필 향 동 선생님 의 동 영상 을 보 았 습 니 다.그 당시 필 향 동 선생님 께 서 는 trim()방법 으로 문자열 양쪽 의 빈 칸 을 없 앨 것 이 라 고 말씀 하 셨 습 니 다.나중에'자바 핵심 기술'을 봤 을 때 책 에서 말 했 을 때'새로운 문자열 을 되 돌려 줍 니 다."이 문자열 은 원본 문자열 의 머리 와 끝의 빈 칸 을 삭제 합 니 다."(9 판 중국어 판 은 권 51 페이지 20 줄 에 있 습 니 다.)그래서 저 는 당연히 trim()방법 이 문자열 양쪽 의'빈 칸'을 떨 어 뜨 릴 것 이 라 고 생각 했 습 니 다.바로 그 렇 기 때문에 저 는 소스 코드 를 볼 때 재 미 있 었 습 니 다.다른 것 은 말 할 것 도 없 이 위의 코드 가 출력 한 것 은 9,3,즉 문자열 의 끝 부분 입 니 다."trim()에 의 해 떨 어 졌 습 니 다.
더 재 미 있 는 것 은 위의 코드 를 Notepad+에 복사 하면 이렇게 생 긴 다 는 것 이다.
Eclipse 에 서 는 이렇게 생 겼 습 니 다.
맞 아,이 특수 한 기 호 는 Eclipse 에서 볼 수 없고 그 어떠한'공간'도 차지 하지 않 아.만약 에 우리 가 코드 에 이런 문 자 를 섞 으 면 잘못 배열 하 는 것 이 매우 고 통 스 러 울 거 야.
다시 본론 으로 들 어가 자.이제 우 리 는 trim()방법 이 trim 에서 빈 칸 을 떨 어 뜨리 는 것 만 이 아니 라 는 것 을 알 게 되 었 다.그러면 그것 은 도대체 trim 에서 무엇 을 떨 어 뜨 렸 을 까?우리 한번 보아 도 무방 하 다.
/**
* @return A string whose value is this string, with any leading and trailing white
* space removed, or this string if it has no leading or
* trailing white space.
*/
public String trim() {
int len = value.length;
int st = 0;
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[st] <= ' ')) {
st++;
}
while ((st < len) && (val[len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}
원문의'white space'는 중국어 로'여백'또는'공백'으로 직역 되 지만 흔히 볼 수 있 는 문 서 는'빈 칸'으로 번역 되 고 빈 칸 의 영 어 는'blank'또는'space'로 번역 되 어야 하기 때문에 저 는 이곳 의 번역 이 정확 하지 않다 고 생각 합 니 다.또한 잘못된 의 미 를 일 으 킬 수 있 습 니 다.trim()방법 은 실제 trim 에서 문자열 양쪽 유 니 코드 인 코딩 이 32(\u0020)보다 작은 모든 문 자 를 떨 어 뜨 렸 습 니 다.
System.out.println("' ' Unicode :" + (int)' '); // ' ' Unicode :32
trim()/substring()문자열 대상 을 어떻게 되 돌려 줍 니까?또 다른 문 제 를 보 자.
public static void main(String[] args) {
String str1 = "abc ";
String str2 = "abc";
String str3 = "abc";
str1 = str1.trim();
System.out.println(str1 == str2); // false
System.out.println(str3 == str2); // true
}
str1.trim()이 되 돌려 주 는 문자열 은'abc'이 고 상수 탱크 에 이'abc'라 는 String 대상 이 존재 하 는 것 이 확인 되 었 습 니 다.그런데 왜 str1=str 2 가 성립 되 지 않 습 니까?우 리 는 trim()방법의 마지막 줄 을 본다.
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
즉,trim()방법의 실제 행 위 는'양쪽 의 공백 문 자 를 없 애 는 것'이 아니 라'중간의 비 공백 문 자 를 자 르 는 것'이다.substring()방법 다시 보기:
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}
실제'캡 처'동작 이 발생 했 을 때,substring()이 우리 가 String str='abc'를 쓰 는 것 처럼 상수 풀 에 대상 을 직접 만 들 수 없 기 때문에,이 대상 은 new 에서 나 온 대상 으로 되 돌아 갑 니 다.이 대상 은 Heap 메모리 에 있 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.