Perbedaan antara metode String trim () dan strip () di Java 11

104

Di antara perubahan lainnya, JDK 11 memperkenalkan 6 metode baru untuk kelas java.lang.String:

  • repeat(int)- Mengulangi String sebanyak yang disediakan oleh intparameter
  • lines() - Menggunakan Spliterator untuk menyediakan baris dari string sumber dengan malas
  • isBlank() - Menunjukkan jika String kosong atau hanya berisi karakter spasi
  • stripLeading() - Menghapus ruang putih dari awal
  • stripTrailing() - Menghapus ruang putih dari ujung
  • strip() - Menghapus spasi dari awal dan akhir string

Secara khusus, strip()terlihat sangat mirip dengan trim(). Sesuai artikel ini, strip*() metode dirancang untuk:

Metode String.strip (), String.stripLeading (), dan String.stripTrailing () memangkas spasi putih [seperti yang ditentukan oleh Character.isWhiteSpace ()] di depan, belakang, atau depan dan belakang String yang ditargetkan.

String.trim() JavaDoc menyatakan:

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

Yang hampir identik dengan kutipan di atas.

Apa sebenarnya perbedaan antara String.trim()dan String.strip()sejak Java 11?

Mikhail Kholodkov
sumber

Jawaban:

106

Singkatnya: strip()adalah evolusi "Unicode-aware" trim().

CSR: JDK-8200378

Masalah

String :: trim telah ada sejak awal Java ketika Unicode belum sepenuhnya berevolusi ke standar yang banyak kita gunakan saat ini.

Definisi spasi yang digunakan oleh String :: trim adalah setiap titik kode yang kurang dari atau sama dengan titik kode spasi (\ u0020), biasanya disebut sebagai karakter kontrol ASCII atau ISO.

Rutinitas pemangkasan yang sadar-unicode harus menggunakan Character :: isWhitespace (int).

Selain itu, pengembang belum dapat secara khusus menghapus spasi kosong indentasi atau secara khusus menghapus spasi kosong yang tertinggal.

Larutan

Memperkenalkan metode pemangkasan yang memperhatikan ruang kosong Unicode dan memberikan kontrol tambahan untuk hanya memimpin atau hanya mengikuti.

Karakteristik umum dari metode baru ini adalah bahwa metode tersebut menggunakan definisi "spasi" yang berbeda (lebih baru) daripada metode lama seperti String.trim(). Bug JDK-8200373 .

JavaDoc untuk String :: trim saat ini tidak menjelaskan definisi "spasi" mana yang digunakan di dalam kode. Dengan metode pemangkasan tambahan yang akan datang dalam waktu dekat yang menggunakan definisi ruang yang berbeda, klarifikasi sangat penting. String :: trim menggunakan definisi spasi karena titik kode apa pun yang kurang dari atau sama dengan titik kode karakter spasi (\ u0020.) Metode pemangkasan yang lebih baru akan menggunakan definisi spasi (putih) sebagai titik kode yang mengembalikan nilai true saat diteruskan ke Karakter :: predikat isWhitespace.

Metode isWhitespace(char)tersebut ditambahkan ke Characterdengan JDK 1.1, tetapi metode isWhitespace(int)tersebut tidak diperkenalkan ke Characterkelas hingga JDK 1.5. Metode terakhir (yang menerima parameter tipe int) ditambahkan untuk mendukung karakter tambahan. Komentar Javadoc untuk Characterkelas mendefinisikan karakter tambahan (biasanya dimodelkan dengan "titik kode" berbasis int) versus karakter BMP (biasanya dimodelkan dengan karakter tunggal):

Kumpulan karakter dari U + 0000 hingga U + FFFF kadang-kadang disebut sebagai Basic Multilingual Plane (BMP). Karakter yang poin kodenya lebih besar dari U + FFFF disebut karakter tambahan. Platform Java menggunakan representasi UTF-16 dalam array karakter dan dalam kelas String dan StringBuffer. Dalam representasi ini, karakter tambahan direpresentasikan sebagai sepasang nilai char ... Oleh karena itu, nilai char mewakili poin kode Basic Multilingual Plane (BMP), termasuk poin kode pengganti, atau unit kode pengkodean UTF-16. Nilai int mewakili semua poin kode Unicode, termasuk poin kode tambahan. ... Metode yang hanya menerima nilai karakter tidak dapat mendukung karakter tambahan. ... Metode yang menerima nilai int mendukung semua karakter Unicode, termasuk karakter tambahan.

OpenJDK Changeset .


Perbandingan patokan antara trim()dan strip()- Mengapa String.strip () 5 kali lebih cepat daripada String.trim () untuk string kosong di Java 11

Mikhail Kholodkov
sumber
6
Menarik bahwa simbol '\ u0000' tidak dihapus dengan strip, tetapi dihapus oleh trim.
CHEM_Eugene
32

Berikut adalah unit-test yang menggambarkan jawaban oleh @MikhailKholodkov, menggunakan Java 11.

(Perhatikan bahwa di \u2000atas \u0020dan tidak dianggap spasi oleh 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());
    }
}
Michael Easter
sumber
0

Secara umum kedua metode menghilangkan spasi di depan dan di belakang dari string. Namun perbedaannya muncul ketika kita bekerja dengan karakter unicode atau fitur multibahasa.

trim () menghapus semua karakter di depan dan di belakang yang nilai ASCII-nya kurang dari atau sama dengan 32 ('U + 0020' atau spasi).

Menurut standar Unicode ada berbagai karakter spasi yang memiliki nilai ASCII lebih dari 32 ('U + 0020'). Contoh: 8193 (U + 2001).

Untuk mengidentifikasi karakter spasi ini, metode baru isWhitespace (int) telah ditambahkan dari Java 1.5 di kelas Character. Metode ini menggunakan unicode untuk mengidentifikasi karakter spasi. Anda dapat membaca lebih lanjut tentang karakter spasi unicode di sini .

Strip metode baru yang ditambahkan di java 11 menggunakan metode Character.isWhitespace (int) ini untuk mencakup berbagai karakter spasi putih dan menghapusnya.

contoh

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()+"\"");
   }
}

Keluaran

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

Catatan: Jika Anda menjalankan pada mesin windows, Anda mungkin tidak dapat melihat output yang sama karena set unicode terbatas. Anda dapat mencoba beberapa kompiler online untuk menguji kode ini.

referensi: Perbedaan antara metode trim dan strip java

Rupesh Agrawal
sumber