Java 11에서 String trim () 및 strip () 메서드의 차이점
다른 변경 사항 중에서 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)는 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 ()이다
다음은 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());
}
}
'Program Club' 카테고리의 다른 글
| PDF 형식의 C89 / C90 표준은 어디에서 찾을 수 있습니까? (0) | 2020.10.24 |
|---|---|
| 알 수없는 오류 : Chrome 시작 실패 : 비정상적으로 종료 됨 (드라이버 정보 : chromedriver = 2.9 (0) | 2020.10.24 |
| NxN 이진 행렬에서 0 만 포함 된 가장 큰 직사각형 찾기 (0) | 2020.10.24 |
| WebSocket에 대한 동일 출처 정책이없는 이유는 무엇입니까? (0) | 2020.10.24 |
| 루비 : 콜론 전후 (0) | 2020.10.24 |