다른 변경 사항 중에서 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()
이후 의 차이점은 무엇입니까 ?
답변
요컨대 .NET의 strip()
“유니 코드 인식”진화입니다 trim()
.
문제
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)
는 Character
JDK 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 ()이다
답변
다음은 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());
}
}
답변
일반적으로 두 방법 모두 문자열에서 선행 및 후행 공백을 제거합니다. 그러나 유니 코드 문자 나 다국어 기능을 사용할 때 차이가 있습니다.
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 시스템에서 실행중인 경우 제한된 유니 코드 세트로 인해 유사한 출력을 보지 못할 수 있습니다. 이 코드를 테스트하기 위해 온라인 컴파일러를 사용해 볼 수 있습니다.
참조 : 트림과 스트립 방법 자바의 차이점