Java karakterlánc-interjú kérdések és válaszok

1. Bemutatkozás

A Húr osztály az egyik legszélesebb körben használt Java osztály, amely arra késztette a nyelvi tervezőket, hogy kezeljék speciálisan. Ez a különleges viselkedés a Java-interjúk egyik legforróbb témája.

Ebben az oktatóanyagban áttekintjük az interjúval kapcsolatos leggyakoribb kérdéseket Húr.

2. Húr Alapismeretek

Ez a szakasz a következőt érintő kérdésekből áll: Húr belső felépítése és memóriája.

Q1. Mi a karakterlánc a Java-ban?

Java-ban a Húr belsőleg egy byte értékek (vagy char értékek a JDK 9 előtt).

A Java 8-ig terjedő verziókban a Húr Unicode karakterek változhatatlan tömbjéből állt. A legtöbb karakterhez azonban csak 8 bit szükséges (1 byte) hogy 16 bit helyett képviselje őket (char méret).

A memóriafogyasztás és a teljesítmény javítása érdekében a Java 9 kompakt karakterláncokat vezetett be. Ez azt jelenti, hogy ha a Húr csak 1 bájtos karaktereket tartalmaz, a következővel lesz ábrázolva Latin-1 kódolás. Ha egy Húr legalább 1 többbájtos karaktert tartalmaz, karakterenként 2 bájtként jelenik meg UTF-16 kódolással.

C és C ++ esetén Húr szintén egy tömb karakter, de a Java-ban külön objektum, saját API-val.

Q2. Hogyan hozhatunk létre karakterlánc objektumot a Java-ban?

java.lang.String 13 különböző módot határoz meg az a létrehozására Húr. Általában azonban kettő van:

  • Keresztül a Húr szó szerinti:
    Karakterlánc s = "abc";
  • Keresztül új kulcsszó:
    String s = új karakterlánc ("abc");

A Java összes karakterlánc-példánya a Húr osztály.

Q3. Is Húr primitív vagy levezetett típus?

Húr származtatott típus, mivel állapota és viselkedése van. Például vannak olyan módszerei, mint szubsztring (), indexe(), és egyenlő (), mely primitíveknek nem lehet.

De mivel mindannyian olyan gyakran használjuk, van néhány különleges jellemzője, amelyek primitívnek érzik:

  • Bár a karakterláncok nincsenek a hívásveremben tárolva, mint a primitívek, azok vannak egy speciális memóriaterületen tárolva, amelyet string karakterkészletnek hívnak
  • A primitívekhez hasonlóan használhatjuk a + operátor a húrokon
  • És ismét, a primitívekhez hasonlóan, létrehozhatunk egy példányt a Húr a nélkül új kulcsszó

Q4. Milyen előnyei vannak annak, ha a húrok megváltoztathatatlanok?

James Gosling interjúja szerint a húrok megváltoztathatatlanok a teljesítmény és a biztonság javítása érdekében.

Valójában számos előnyét látjuk annak, ha megváltoztathatatlan húrok vannak:

  • A karakterkészlet csak akkor lehetséges, ha a létrehozott karakterláncok soha nem változnak, mivel állítólag újra felhasználják őket
  • A kód lehet húrokat biztonságosan átadni egy másik módszernek, tudva, hogy ezen a módszeren nem lehet változtatni
  • Megváltozhatatlanul automatikusan szálbiztonságossá teszi ezt az osztályt
  • Mivel ez az osztály menetbiztos, nincs szükség a közös adatok szinkronizálására, ami viszont javítja a teljesítményt
  • Mivel garantáltan nem változnak, hashkódjuk könnyen tárolható

Q5. Hogyan tároljuk a húrokat az emlékezetben?

A JVM specifikáció szerint Húr literálokat egy futásidejű állandó készletben tárolják, amelyet a JVM módszer területéről osztanak ki.

Bár a módszer területe logikailag része a kupac memóriának, a specifikáció nem szabja meg a helyet, a memória méretét vagy a szemétgyűjtési házirendeket. Lehet megvalósítás-specifikus.

Ez az osztály vagy interfész futásidejű állandó készlet akkor jön létre, amikor az osztályt vagy interfészt a JVM hozza létre.

Q6. Az internált húrok alkalmasak a Java szemétgyűjtésére?

Igen mind HúrA karakterlánc-készletben található s szemétgyűjtésre jogosultak, ha nincsenek hivatkozások a programból.

Q7. Mi a String Constant Pool?

A vonós medence, más néven Húr állandó medence vagy a Húr intern pool, egy speciális memória régió, ahol a JVM tárolja Húr példányok.

Optimalizálja az alkalmazás teljesítményét csökkentve, hogy milyen gyakran és hány karakterláncot osztanak ki:

  • A JVM az adatlapnak csak egy példányát tárolja Húr a medencében
  • Új létrehozásakor Húr, a JVM a készletben keresi a Húr amelynek értéke azonos
  • Ha megtalálta, a JVM visszaadja erre a hivatkozást Húr további memória lefoglalása nélkül
  • Ha nem található, akkor a JVM hozzáadja a készlethez (internálja), és visszaadja a referenciát

Q8. A húr biztonságos-e? Hogyan?

A húrok valóban teljesen menetesek, mert megváltoztathatatlanok. Bármely megváltoztathatatlan osztály automatikusan jogosult a szálbiztonságra, mert változatlansága garantálja, hogy példányai nem változnak meg több szálon.

Például, ha egy szál megváltoztatja a karakterlánc értékét, akkor egy új Húr a meglévő módosítása helyett létrejön.

Q9. Melyik karakterlánc-művelethez fontos a területi beállítás megadása?

A Területi beállítás osztály lehetővé teszi számunkra a kulturális helyek megkülönböztetését, valamint tartalmunk megfelelő formázását.

Amikor a Húr osztályban, szükségünk van rá a karakterláncok megjelenítésekor formátum vagy amikor alsó vagy felső burkolatú húrok.

Valójában, ha ezt elfelejtjük megtenni, problémákat okozhat a hordozhatóság, a biztonság és a használhatóság.

Q10. Mi a karakterláncok mögöttes karakterkódolása?

Alapján Húr's Javadocs a Java 8-ig terjedő verziókig, a karakterláncokat belső UTF-16 formátumban tárolják.

A char adattípus és java.lang.Karakter az objektumok az eredeti Unicode specifikáción is alapulnak, amely a karaktereket rögzített szélességű, 16 bites entitásokként határozta meg.

A JDK 9-vel kezdődően Húrok amelyek csak 1 bájtos karaktereket tartalmaznak Latin-1 kódolás, míg Húrok legalább 1 többbájtos karakterrel használja az UTF-16 kódolást.

3. Az Húr API

Ebben a szakaszban megvitatunk néhány, a Húr API.

Q11. Hogyan lehet összehasonlítani a Java két karakterláncát? Mi a különbség az str1 == str2 és az str1 között. Egyenlő (str2)?

Két különböző módon hasonlíthatjuk össze a húrokat: az egyenlő az operátorral (==) és az a használatával egyenlő () módszer.

Mindkettő meglehetősen különbözik egymástól:

  • Az irányító (str1 == str2) ellenőrzi a referenciális egyenlőséget
  • A módszer, a metódus (str1.egyenlő (str2)) ellenőrzi a lexikális egyenlőséget

Bár igaz, ha két húr lexikailag egyenlő, akkor str1.intern () == str2.intern () is igaz.

Jellemzően kettő összehasonlítására Húrok tartalmuk szempontjából mindig használnunk kell Karakterlánc.egyenlő.

Q12. Hogyan bonthatunk sztringet Java-ban?

A Húr osztály maga biztosítja számunkra a Húr#hasított módszer, amely elfogad egy reguláris kifejezéshatárolót. Visszaad minket a Húr[] sor:

Karakterlánc [] részek = "john, peter, mary" .split (","); assertEquals (új karakterlánc [] {"john", "peter", "mary"}, részek);

Egy trükkös dolog hasított az, hogy egy üres húr felosztásakor, kaphatunk egy nem üres tömböt:

assertEquals (új karakterlánc [] {""}, "" .split (","));

Természetesen, hasított csak egyike a Java felosztásának számos módjáról Húr.

Q13. Mi az a Stringjoiner?

StringJoiner egy olyan osztály, amelyet a Java 8-ban vezettek be, külön karaktersorozatok egyesítéséhez a színek listájának felvétele és vesszővel elválasztott karakterláncként való visszaadása. Megadhatunk elválasztót, valamint előtagot és utótagot:

StringJoiner asztalos = new StringJoiner (",", "[", "]"); asztalos.add ("piros") .add ("zöld") .add ("kék"); assertEquals ("[Piros, Zöld, Kék]", asztalos.String ());

Q14. Különbség a karakterlánc, a Stringbuffer és a Stringbuilder között?

A húrok megváltoztathatatlanok. Ez azt jelenti ha megpróbáljuk megváltoztatni vagy megváltoztatni az értékeit, akkor a Java egy teljesen újat hoz létre Húr.

Például, ha hozzáadunk egy karakterlánchoz str1 létrehozása után:

String str1 = "abc"; str1 = str1 + "def";

Ezután a JVM, ahelyett, hogy módosítaná str1, létrehoz egy teljesen új Húr.

Az egyszerű esetek többségében azonban a fordító belsőleg használja StringBuilder és optimalizálja a fenti kódot.

De egy olyan bonyolultabb kódhoz, mint a hurkok, egy teljesen újat fog létrehozni Húr, romló teljesítmény. Ez az, ahol StringBuilder és StringBuffer hasznosak.

Mindkét StringBuilder és StringBuffer Java-ban hozzon létre olyan objektumokat, amelyek mutábilis karaktersorozatot tartalmaznak.StringBuffer szinkronizált és ezért szálbiztos, míg StringBuilder nem.

Az extra szinkronizálás óta StringBuffer jellemzően felesleges, a kiválasztással gyakran teljesítménynövekedést érhetünk el StringBuilder.

Q15. Miért biztonságosabb a jelszavakat egy karakterláncban tárolni?

Mivel a karakterláncok megváltoztathatatlanok, nem engedélyezik a módosítást. Ez a viselkedés megakadályoz bennünket abban, hogy felülírjuk, módosítsuk vagy nullázzuk a tartalmát, készítsünk Húrok nem alkalmas érzékeny információk tárolására.

A karakterlánc tartalmának eltávolításához a szemétszedőre kell hagyatkoznunk. Sőt, a Java 6-os és újabb verzióiban a karakterláncokat a PermGen tárolta, ami azt jelenti, hogy egyszer a Húr létrejött, soha nem volt szemét.

Az a használatával char [] tömb, mi teljes mértékben ellenőrizhetjük ezeket az információkat.Módosíthatjuk, vagy teljesen kitörölhetjük, anélkül, hogy a szemétszedőre hagyatkoznánk.

Használata char [] felett Húr nem biztonságosan védi az információkat; ez csak egy extra intézkedés, amely csökkenti a rosszindulatú felhasználó számára a bizalmas információkhoz való hozzáférés lehetőségét.

Q16. Mit csinál a String gyakornok () módszere?

A módszer, a metódus gyakornok() létrehoz egy pontos másolatát a Húr objektumot a kupacban, és tárolja a Húr állandó készlet, amelyet a JVM fenntart.

A Java automatikusan internálja az összes karakterlánc használatával létrehozott húrokat, de ha létrehozunk egy Húr például az új operátor használatával, String str = új karakterlánc („abc”), akkor a Java hozzáadja a kupachoz, csakúgy, mint bármely más objektumot.

Felhívhatjuk a gyakornok() metódus a JVM megadására, hogy adja hozzá a karakterlánc készlethez, ha még nem létezik ott, és adja vissza az internált karakterlánc hivatkozását:

Húr s1 = "Baeldung"; String s2 = új karakterlánc ("Baeldung"); String s3 = új karakterlánc ("Baeldung"). Intern (); assertThat (s1 == s2) .isFalse (); assertThat (s1 == s3) .isTrue ();

Q17. Hogyan konvertálhatjuk a karakterláncot egészre és egészet karakterláncra a Java-ban?

A legegyszerűbb megközelítés a Húr egy Egész szám használatával Egész szám#parseInt:

int szám = Integer.parseInt ("22");

Ennek megfordításához használhatjuk Egész szám#Sztring:

String s = Integer.toString (szám);

Q18. Mi az a String.format () és hogyan tudjuk használni?

String # formátum formázott karakterláncot ad vissza a megadott formátum-karakterlánc és argumentumok felhasználásával.

Karakterlánc címe = "Baeldung"; Karakterlánc formázva = String.format ("A cím% s", cím); assertEquals ("A cím Baeldung", formázva);

Emlékeznünk kell a felhasználó megadására is Területi beállítás, hacsak nem vagyunk jól, ha egyszerűen elfogadjuk az operációs rendszer alapértelmezett beállításait:

Locale usersLocale = Locale.ITALY; assertEquals ("1.024", String.format (usersLocale, "%, d ing közül választhatunk. Sok szerencsét.", 1024))

Q19. Hogyan alakíthatjuk át a karakterláncot nagy- és kisbetűvé?

Húr implicit módon biztosítja String # toUpperCase hogy a burkolat nagybetűvé váljon.

Bár a Javadocs emlékeztet bennünket arra, hogy meg kell adnunk a felhasználóét Locale a helyesség biztosítása érdekében:

String s = "Üdvözöljük a Baeldungban!"; assertEquals ("ÜDVÖZÖLJÜK A BAELDUNGON!", s.toUpperCase (Locale.US));

Hasonlóképpen, a kisbetűvé való átalakításhoz meg is van Karakterlánc # toLowerCase:

String s = "Üdvözöljük a Baeldungban!"; assertEquals ("üdvözlöm a baeldungban!", s.toLowerCase (Locale.UK));

Q20. Hogyan kaphatunk Karaktertömböt a Stringből?

Húr biztosítja toCharArray, amely visszaküldi a belső másolatát char tömb a JDK9 előtti (és átalakítja a Húr egy új char tömb JDK9 + -ban):

char [] hello = "hello" .toCharArray (); assertArrayEquals (új karakterlánc [] {'h', 'e', ​​'l', 'l', 'o'}, hello);

Q21. Hogyan alakíthatnánk át egy Java karakterláncot bájt tömbgé?

Alapértelmezés szerint a módszer Karakterlánc # getBytes () egy Stringet bájttömbbe kódol a platform alapértelmezett karakterkészletével.

És bár az API nem követeli meg a karakterkészlet megadását, a biztonság és a hordozhatóság biztosítása érdekében meg kell tennünk:

byte [] byteArray2 = "efgh" .getBytes (StandardCharsets.US_ASCII); byte [] byteArray3 = "ijkl" .getBytes ("UTF-8");

4. Húr-Alapú algoritmusok

Ebben a részben a programmal kapcsolatos néhány programozási kérdést tárgyalunk Húrs.

Q22. Hogyan ellenőrizhetjük, hogy két karakterlánc van-e Java-ban?

Az anagramma egy szó, amelyet egy másik adott szó betűinek átrendezésével hoznak létre, például „autó” és „ív”.

Először először ellenőrizzük, hogy mind a Húrok azonos hosszúságúak vagy sem.

Aztán átalakítjuk őket char [] tömb, válogassa őket, majd ellenőrizze az egyenlőséget.

Q23. Hogyan számolhatjuk egy adott karakter előfordulásának számát egy húrban?

A Java 8 valóban leegyszerűsíti az ilyen összesítési feladatokat:

long count = "hello" .cars (). filter (ch -> (char) ch == 'l'). count (); assertEquals (2, számít);

És számos más nagyszerű módja van az l-ek számlálásának, beleértve a ciklusokat, a rekurziót, a reguláris kifejezéseket és a külső könyvtárakat.

Q24. Hogyan változtathatunk meg egy karakterláncot a Java-ban?

Ennek sokféle módja lehet, a legegyszerűbb megközelítés a fordított módszer től StringBuilder (vagy StringBuffer):

String fordítva = new StringBuilder ("baeldung"). Reverse (). ToString (); assertEquals ("gnudleab", megfordítva);

Q25. Hogyan ellenőrizhetjük, hogy egy húr Palindrome-e vagy sem?

A palindrom minden olyan karaktersorozat, amely ugyanolyan hátra olvasható, mint előre, például „asszonyom”, „radar” vagy „szintje”.

Annak ellenőrzésére, hogy egy karakterlánc palindróma-e, megkezdhetjük az adott karakterlánc előre és hátra történő ismétlését egyetlen hurokban, egy-egy karakterrel. A hurok az első eltéréskor lép ki.

5. Következtetés

Ebben a cikkben a legelterjedtebbeket néztük át Húr interjú kérdések.

Az itt használt összes kódminta elérhető a GitHub oldalon.