자바 string.trim()은 도대체 무엇 을 지 웠 습 니까?

5075 단어 Javastring.trim()
String.Trim()방법 은 문자열 양쪽 의 빈 칸 만 제거 하 는 것 입 니까?
  • trim()방법 은 어떤 문 자 를 지 웠 습 니까?
  • trim()/substring()문자열 대상 을 어떻게 되 돌려 줍 니까?
  • 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 string
    i 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 메모리 에 있 습 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기