Java 11'de String trim () ve strip () yöntemleri arasındaki fark


107

Diğer değişikliklerin yanı sıra, JDK 11, java.lang.String sınıfı için 6 yeni yöntem sunar:

  • repeat(int)- Dize'yi intparametre tarafından sağlandığı kadar tekrarlar
  • lines() - Kaynak dizeden tembel olarak satırlar sağlamak için Spliterator kullanır
  • isBlank() - Dizenin boş olup olmadığını veya yalnızca beyaz boşluk karakterleri içerip içermediğini gösterir
  • stripLeading() - Beyaz boşluğu baştan kaldırır
  • stripTrailing() - Beyaz boşluğu sondan kaldırır
  • strip() - Dizenin başından ve sonundan beyaz boşluğu kaldırır

Özellikle strip()çok benziyor trim(). Gereğince bu maddeye strip*() yöntemleri için tasarlanmıştır:

String.

String.trim() JavaDoc belirtir:

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

Bu, yukarıdaki alıntıyla neredeyse aynıdır.

Tam olarak ne arasındaki fark String.trim()ve String.strip()Java 11 beri?

Yanıtlar:


106

Kısacası: strip()"Unicode farkında" bir evrimdir trim().

CSR: JDK-8200378

Sorun

String :: trim, Unicode'un bugün yaygın olarak kullandığımız standarda tam olarak gelişmediği Java'nın ilk günlerinden beri var olmuştur.

String :: trim tarafından kullanılan boşluğun tanımı, genellikle ASCII veya ISO kontrol karakterleri olarak adlandırılan, alan kodu noktasına (\ u0020) eşit veya ondan küçük herhangi bir kod noktasıdır.

Unicode duyarlı kırpma rutinleri Character :: isWhitespace (int) kullanmalıdır.

Ek olarak, geliştiriciler girintili beyaz boşluğu özel olarak kaldıramadılar veya özellikle sondaki beyaz boşluğu kaldıramadılar.

Çözüm

Unicode beyaz boşluk farkında olan ve yalnızca satır aralığı veya yalnızca sonda ek denetim sağlayan kırpma yöntemlerini tanıtın.

Bu yeni yöntemlerin ortak bir özelliği, gibi eski yöntemlerden farklı (daha yeni) bir "boşluk" tanımı kullanmalarıdır String.trim(). Hata JDK-8200373 .

String :: trim için mevcut JavaDoc, kodda hangi "boşluk" tanımının kullanıldığını netleştirmez. Yakın gelecekte farklı bir alan tanımı kullanan ek kırpma yöntemleri ile, açıklık getirmek zorunludur. String :: trim, boşluk karakter kod noktasından (\ u0020) küçük veya ona eşit olan herhangi bir kod noktası olarak boşluk tanımını kullanır. Daha yeni kırpma yöntemleri, (beyaz) boşluk tanımını, Character :: isWhitespace yüklemi.

Yönteme JDK 1.1 ile isWhitespace(char)eklendi Character, ancak yöntem JDK 1.5'e kadar sınıfa isWhitespace(int)tanıtılmadı Character. İkinci yöntem (bir tür parametresini kabul eden int) ek karakterleri desteklemek için eklenmiştir. CharacterSınıf için Javadoc yorumları, tamamlayıcı karakterleri (tipik olarak int tabanlı "kod noktası" ile modellenmiş) ve BMP karakterlerini (genellikle tek karakterle modellenmiş) tanımlar:

U + 0000 ile U + FFFF arasındaki karakter kümesine bazen Temel Çok Dilli Düzlem (BMP) adı verilir. Kod noktaları U + FFFF'den büyük olan karakterlere tamamlayıcı karakterler denir. Java platformu, char dizilerinde ve String ve StringBuffer sınıflarında UTF-16 temsilini kullanır. Bu gösterimde, tamamlayıcı karakterler bir çift karakter değeri olarak temsil edilir ... Bu nedenle, bir char değeri, yedek kod noktaları veya UTF-16 kodlamasının kod birimleri dahil olmak üzere Temel Çok Dilli Düzlem (BMP) kod noktalarını temsil eder. Bir int değeri, tamamlayıcı kod noktaları dahil tüm Unicode kod noktalarını temsil eder. ... Yalnızca bir char değerini kabul eden yöntemler, ek karakterleri destekleyemez. ... int değerini kabul eden yöntemler, tamamlayıcı karakterler dahil tüm Unicode karakterlerini destekler.

OpenJDK Değişiklik Kümesi .


Benchmark karşılaştırma arasındaki trim()ve strip()- Neden 5 kat daha hızlı String.trim () den boş dize için Java 11 yılında String.strip () 'dir


7
İlginç olan, '\ u0000' sembolünün şeritle değil, kırpılarak silinmesidir.
CHEM_Eugene

32

İşte Java 11 kullanarak @MikhailKholodkov'un cevabını gösteren bir birim testi.

( \u2000Yukarıda \u0020ve boşluk olarak kabul edilmediğini unutmayın 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

Genel olarak her iki yöntem de dizeden baştaki ve sondaki boşlukları kaldırır. Ancak, unicode karakterleri veya çok dilli özelliklerle çalışırken fark ortaya çıkıyor.

trim () ASCII değeri 32'den küçük veya 32'ye eşit olan tüm baştaki ve sondaki karakterleri kaldırır ('U + 0020' veya boşluk) .

Unicode standartlarına göre ASCII değeri 32'den ('U + 0020') fazla olan çeşitli boşluk karakterleri vardır. Ör: 8193 (U + 2001).

Bu boşluk karakterlerini tanımlamak için, Character sınıfında Java 1.5'ten yeni bir yöntem olan isWhitespace (int) eklenmiştir. Bu yöntem, boşluk karakterlerini tanımlamak için unicode kullanır. Sen unicode uzay karakterler hakkında daha fazla bilgi bulabilirsiniz burada .

Java 11'e eklenen yeni yöntem şeridi, çok çeşitli beyaz boşluk karakterlerini kapsamak için bu Character.isWhitespace (int) yöntemini kullanır ve bunları kaldırmak için .

misal

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

Çıktı

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

Not: Windows makinesinde çalışıyorsanız, sınırlı unicode kümesi nedeniyle benzer çıktıyı göremeyebilirsiniz. bu kodu test etmek için bazı çevrimiçi derleyicileri deneyebilirsiniz.

referans: Döşeme ve şerit yöntemi java arasındaki fark

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.