Java 11에서 String trim () 및 strip () 메서드의 차이점


104

다른 변경 사항 중에서 JDK 11은 java.lang.String 클래스에 대한 6 개의 새로운 메소드를 도입했습니다.

  • repeat(int)- int매개 변수가 제공하는만큼 문자열을 반복합니다.
  • lines() -Spliterator를 사용하여 소스 문자열에서 줄을 느리게 제공합니다.
  • isBlank() -문자열이 비어 있는지 또는 공백 문자 만 포함하는지 나타냅니다.
  • stripLeading() -처음부터 공백을 제거합니다.
  • stripTrailing() -끝에서 공백을 제거합니다.
  • strip() -문자열의 시작과 끝에서 공백을 제거합니다.

특히 strip()trim(). 에 따라 이 문서의 strip*() 방법을하도록 설계되었습니다 :

String.strip (), String.stripLeading () 및 String.stripTrailing () 메서드는 대상 문자열의 앞, 뒤 또는 앞뒤에서 공백 [Character.isWhiteSpace ()에 의해 결정됨]을 트리밍합니다.

String.trim() JavaDoc은 다음과 같이 말합니다.

/**
  * Returns a string whose value is this string, with any leading and trailing
  * whitespace removed.
  * ...
  */

위의 인용문과 거의 동일합니다.

Java 11 String.trim()String.strip()이후 의 차이점은 무엇입니까 ?

답변:


106

요컨대 .NET의 strip()"유니 코드 인식"진화입니다 trim().

CSR : JDK-8200378

문제

String :: trim은 유니 코드가 오늘날 널리 사용되는 표준으로 완전히 발전하지 않았던 Java 초기부터 존재했습니다.

String :: trim에서 사용하는 공간의 정의는 일반적으로 ASCII 또는 ISO 제어 문자라고하는 공간 코드 포인트 (\ u0020)보다 작거나 같은 코드 포인트입니다.

유니 코드 인식 트리밍 루틴은 Character :: isWhitespace (int)를 사용해야합니다.

또한 개발자는 들여 쓰기 공백을 특별히 제거하거나 후행 공백을 특별히 제거 할 수 없었습니다.

해결책

유니 코드 공백을 인식하고 선행 만 또는 후행 만 추가로 제어 할 수있는 트리밍 방법을 도입하십시오.

이러한 새 메서드의 일반적인 특징은 .NET과 같은 이전 메서드와는 다른 (새로운) "공백"정의를 사용한다는 것 String.trim()입니다. 버그 JDK-8200373 .

String :: trim에 대한 현재 JavaDoc은 코드에서 사용되는 "공백"의 정의를 명확하게하지 않습니다. 공간의 다른 정의를 사용하는 추가 트리밍 방법이 가까운 장래에 제공되므로 명확성이 필수적입니다. String :: trim은 공백 문자 코드 포인트 (\ u0020)보다 작거나 같은 코드 포인트로 공백의 정의를 사용합니다. 최신 트리밍 메서드는 (흰색) 공백의 정의를 Character :: isWhitespace 술어.

이 메소드 isWhitespace(char)CharacterJDK 1.1과 함께 추가 되었지만 JDK 1.5까지 클래스에 isWhitespace(int)도입되지 않았습니다 Character. int보조 문자를 지원하기 위해 후자의 방법 (유형의 매개 변수를 허용하는 방법 )이 추가되었습니다. Character클래스에 대한 Javadoc 주석은 보충 문자 (일반적으로 int 기반 "코드 포인트"로 모델링 됨) 대 BMP 문자 (일반적으로 단일 문자로 모델링 됨)를 정의합니다.

U + 0000에서 U + FFFF까지의 문자 집합을 BMP (Basic Multilingual Plane)라고도합니다. 코드 포인트가 U + FFFF보다 큰 문자를 보충 문자라고합니다. Java 플랫폼은 char 배열과 String 및 StringBuffer 클래스에서 UTF-16 표현을 사용합니다. 이 표현에서 보충 문자는 char 값의 쌍으로 표현됩니다. 따라서 char 값은 대리 코드 포인트 또는 UTF-16 인코딩의 코드 단위를 포함하는 BMP (Basic Multilingual Plane) 코드 포인트를 나타냅니다. int 값은 보충 코드 포인트를 포함하여 모든 유니 코드 코드 포인트를 나타냅니다. ... char 값만 허용하는 메소드는 보충 문자를 지원할 수 없습니다. ... int 값을 허용하는 메소드는 보충 문자를 포함하여 모든 유니 코드 문자를 지원합니다.

OpenJDK 변경 세트 .


벤치 마크 비교 사이 trim()strip()- 왜 5 배 빠른 String.trim ()보다는 빈 문자열을 자바 (11)에서 String.strip ()이다


6
흥미로운 그 기호 '\ u0000'은 스트립에 의해 삭제되지 않고 트림에 의해 삭제됩니다.
CHEM_Eugene

32

다음은 Java 11을 사용하여 @MikhailKholodkov의 답변을 보여주는 단위 테스트입니다.

( \u2000위에 \u0020있으며에서 공백으로 간주되지 않음 trim())

public class StringTestCase {
    @Test
    public void testSame() {
        String s = "\t abc \n";

        assertEquals("abc", s.trim());
        assertEquals("abc", s.strip());
    }

    @Test
    public void testDifferent() {
        Character c = '\u2000';
        String s = c + "abc" + c;

        assertTrue(Character.isWhitespace(c));
        assertEquals(s, s.trim());
        assertEquals("abc", s.strip());
    }
}

0

일반적으로 두 방법 모두 문자열에서 선행 및 후행 공백을 제거합니다. 그러나 유니 코드 문자 나 다국어 기능을 사용할 때 차이가 있습니다.

trim ()은 ASCII 값이 32 ( 'U + 0020'또는 공백) 이하인 모든 선행 및 후행 문자 제거합니다 .

유니 코드 표준에 따라 ASCII 값이 32 ( 'U + 0020') 이상인 다양한 공백 문자가 있습니다. 예 : 8193 (U + 2001).

이러한 공백 문자를 식별하기 위해 Character 클래스의 Java 1.5에서 새 메소드 isWhitespace (int)가 추가되었습니다. 이 방법은 유니 코드를 사용하여 공백 문자를 식별합니다. 여기에서 유니 코드 공백 문자에 대해 자세히 알아볼 수 있습니다 .

Java 11에 추가 된 새로운 메소드 스트립은 이 Character.isWhitespace (int) 메소드를 사용하여 광범위한 공백 문자를 커버 하고 제거합니다.

public class StringTrimVsStripTest {
    public static void main(String[] args) {
        String string = '\u2001'+"String    with    space"+ '\u2001';
        System.out.println("Before: \"" + string+"\"");
        System.out.println("After trim: \"" + string.trim()+"\"");
        System.out.println("After strip: \"" + string.strip()+"\"");
   }
}

산출

Before: "  String    with    space  "
After trim: " String    with    space "
After strip: "String    with    space"

참고 : Windows 시스템에서 실행중인 경우 제한된 유니 코드 세트로 인해 유사한 출력을 보지 못할 수 있습니다. 이 코드를 테스트하기 위해 온라인 컴파일러를 사용해 볼 수 있습니다.

참조 : 트림과 스트립 방법 자바의 차이점

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.