Java >> Java tutorial >  >> Tag >> char

CharSequence vs. String i Java

1. Introduktion

Kort sagt, CharSequence og streng er to forskellige grundlæggende begreber i Java.

I denne hurtige artikel skal vi se på forskellene mellem disse typer, og hvornår vi skal bruge hver enkelt.

2. CharSequence

CharSequence er en grænseflade, der repræsenterer en sekvens af tegn. Foranderlighed håndhæves ikke af denne grænseflade. Derfor implementerer både foranderlige og uforanderlige klasser denne grænseflade.

Selvfølgelig kan en grænseflade ikke instansieres direkte; det kræver en implementering for at instansiere en variabel:

CharSequence charSequence = "baeldung";

Her charSequence instansieres med en streng. Instantiering af andre implementeringer:

CharSequence charSequence = new StringBuffer("baeldung");
CharSequence charSequence = new StringBuilder("baeldung");

3. streng

streng er en sekvens af tegn i Java. Det er en uforanderlig klasse og en af ​​de mest brugte typer i Java. Denne klasse implementerer CharSequence , Serialiserbar , og Sammenlignelig grænseflader.

Under begge forekomster oprettes strenge med samme indhold. De er dog ikke lige hinanden:

@Test
public void givenUsingString_whenInstantiatingString_thenWrong() {
    CharSequence firstString = "baeldung";
    String secondString = "baeldung";

    assertNotEquals(firstString, secondString);
}

4. CharSequence vs. streng

Lad os sammenligne forskellene og fællestræk ved CharSequence og streng . De ligger begge i den samme pakke med navnet java.lang. , men førstnævnte er en grænseflade og sidstnævnte er en konkret klasse. Desuden strengen klasse er uforanderlig.

I det følgende eksempel opretter hver sumoperation en anden forekomst, øger mængden af ​​lagrede data og returnerer den senest oprettede String:

@Test
public void givenString_whenAppended_thenUnmodified() {
    String test = "a";
    int firstAddressOfTest = System.identityHashCode(test);
    test += "b";
    int secondAddressOfTest = System.identityHashCode(test);

    assertNotEquals(firstAddressOfTest, secondAddressOfTest);
}

På den anden side, StringBuilder opdaterer den allerede oprettede streng for at holde den nye værdi:

@Test
public void givenStringBuilder_whenAppended_thenModified() {
    StringBuilder test = new StringBuilder();
    test.append("a");
    int firstAddressOfTest = System.identityHashCode(test);
    test.append("b");
    int secondAddressOfTest = System.identityHashCode(test);        
    
    assertEquals(firstAddressOfTest, secondAddressOfTest);
}

En anden forskel er, at grænsefladen ikke indebærer en indbygget sammenligningsstrategi, hvorimod strengen klasse implementerer Comparable grænseflade.

For at sammenligne to CharSequence s, kan vi caste dem til String s derefter efterfølgende sammenligne dem:

@Test
public void givenIdenticalCharSequences_whenCastToString_thenEqual() {
    CharSequence charSeq1 = "baeldung_1";
    CharSequence charSeq2 = "baeldung_2";
 
    assertTrue(charSeq1.toString().compareTo(charSeq2.toString()) > 0);
}

5. Konklusion

Vi bruger normalt String på de steder, hvor vi ikke er sikre på, hvad vi skal bruge til char-sekvenser. Men i nogle tilfælde StringBuilder og StringBuffer kan være mere passende.

Du kan finde flere oplysninger i JavaDocs om CharSequence og String.

Og som altid kan implementeringen af ​​alle disse eksempler og kodestykker findes på Github.


Java tag