1. ホーム
  2. java

[解決済み] Java 11におけるString trim()メソッドとstrip()メソッドの違いについて

2022-04-25 22:23:40

質問

JDK 11 では、他の変更点の中で、java.lang.String クラスに 6 つの新しいメソッドが導入されています。

  • repeat(int) - で指定された回数だけ文字列を繰り返します。 int パラメータ
  • lines() - Spliterator を使って、ソース文字列から遅延的に行を提供します。
  • isBlank() - Stringが空であるか、空白文字のみを含むかどうかを示す
  • 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.
  * ...
  */

というのは、上の引用とほとんど同じです。

とは、具体的にどのような違いがあるのでしょうか? String.trim()String.strip() Java 11以降?

解決方法を教えてください。

要するに strip() は、ユニコードに対応した trim() . 意味 trim() は文字 <= U+0020 (スペース) のみを削除します。 strip() は、Unicode の空白文字をすべて削除します (ただし、制御文字 (\0 など) はすべて削除されません)。

csr : jdk-8200378

<ブロッククオート

問題点

String::trimは、Javaの初期にUnicodeが登場したときから存在していた。

<ブロッククオート

は、今日広く使われている標準まで完全には進化していませんでした。

String::trimが使用するスペースの定義は、以下のコードポイントです。 一般にスペースコードポイント( \u0020 )と呼ばれるものです。 をASCIIまたはISO制御文字と呼びます。

ユニコードを意識したトリミングルーチンは Character::isWhitespace(int) です。

さらに、開発者は、具体的に インデントの空白や末尾の空白を特別に削除することはできません。 を使用します。

解決方法

Unicodeの空白を意識したトリミング方法を導入する。 を追加し、先頭のみ、または末尾のみの制御を提供する。

これらの新しいメソッドの共通の特徴は、以下のような古いメソッドとは異なる(新しい)ホワイトスペースの定義を使っていることです。 String.trim() . バグ JDK-8200373 .

現在のString::trimのJavaDocでは、どの の定義が使用されています。コード内で使用されている 近い将来、別のトリミングメソッドが登場する予定です。 スペースの定義を明確にすることが必要です。String::trim は と等しいかそれ以下のコードポイントをスペースと定義しています。 新しいトリミング方式では、スペース文字のコードポイント( \u0020 )が使用されます。 を返すコードポイントを(空白)の定義として使用します。 に渡されたとき、Character::isWhitespace述語を使用します。

メソッド isWhitespace(char) に追加されました。 Character は、JDK 1.1ではメソッド isWhitespace(int) は導入されませんでした。 Character クラスは、JDK 1.5までは 後者のメソッド (型のパラメータを受け入れるもの) は int ) が追加され、補助文字に対応した。のJavadocコメントでは Character クラスは、BMP文字(通常、1文字でモデル化)と補足文字(通常、intベースの"コードポイント"でモデル化)を定義しています。

<ブロッククオート

U+0000からU+FFFFまでの文字の集合を「U+0000」と呼ぶことがあります。 を基本多言語面(BMP)と呼びます。コードポイント を超えるものを補助文字と呼びます。Java プラットフォームは、UTF-16 表現を文字配列と StringおよびStringBufferクラス。この表現では、補足的な は一対の文字値として表現されます。char値です。 したがって、BMP(Basic Multilingual Plane)コードポイントを表します。 サロゲートコードポイントを含む、UTF-16のコードユニット。 エンコーディングになります。int 値は、すべての Unicode コードポイント(以下を含む)を表します。 補足コードポイント ... charしか受け付けないメソッドは の値は,補助文字に対応できない。... を使用するメソッドは int 値を受け取る場合、Unicode のすべての文字がサポートされ、その中には 補助文字

OpenJDK 変更点 .


のベンチマーク比較 trim()strip() - Java 11では、空白文字列に対してString.strip()はString.trim()よりも5倍速い理由