Pitanja i odgovori za Java String Intervju

1. Uvod

The Niz class je jedna od najčešće korištenih klasa u Javi, što je ponukalo jezične dizajnere da je posebno tretiraju. Ovo posebno ponašanje čini je jednom od najzanimljivijih tema u Java intervjuima.

U ovom uputstvu proći ćemo kroz neka od najčešćih pitanja o Niz.

2. Niz Osnove

Ovaj se odjeljak sastoji od pitanja koja se tiču Niz unutarnja struktura i pamćenje.

Q1. Što je niz u Javi?

U Javi, a Niz predstavlja interno nizom bajt vrijednosti (ili ugljen vrijednosti prije JDK 9).

U verzijama do Java 8, uključujući a Niz bio je sastavljen od nepromjenjivog niza Unicode znakova. Međutim, većina znakova zahtijeva samo 8 bitova (1 bajt) da ih predstavljaju umjesto 16 bitova (char veličina).

Kako bi poboljšala potrošnju memorije i performanse, Java 9 predstavila je kompaktne žice. To znači da ako a Niz sadrži samo 1-bajtne znakove, bit će predstavljeni pomoću Latinski-1 kodiranje. Ako je a Niz sadrži najmanje 1 višebajtni znak, predstavljat će se kao 2 bajta po znaku pomoću UTF-16 kodiranja.

U C i C ++, Niz je također niz znakova, ali u Javi je to zaseban objekt sa svojim API-jem.

Q2. Kako možemo stvoriti niz objekt u Java?

java.lang.String definira 13 različitih načina za stvaranje a Niz. Općenito, međutim, postoje dva:

  • Kroz a Niz doslovno:
    Niz s = "abc";
  • Kroz novi ključna riječ:
    Niz s = novi niz ("abc");

Svi String literali u Javi su primjerci Niz razred.

Q3. Je Niz primitivan ili izveden tip?

Žica je izvedeni tip budući da ima stanje i ponašanje. Na primjer, ima metode poput podniz (), indexOf (), i jednako (), koje primitivci ne mogu imati.

No, budući da ga svi koristimo tako često, ima neke posebne karakteristike zbog kojih se osjeća primitivno:

  • Iako se nizovi ne pohranjuju u hrpu poziva kao primitivi, oni jesu pohranjeni u posebnu memorijsku regiju koja se naziva spremište nizova
  • Poput primitiva, možemo koristiti + operator na žicama
  • I opet, poput primitiva, možemo stvoriti instancu a Niz bez toga novi ključna riječ

Q4. Koje su prednosti nepromjenjivih gudača?

Prema intervjuu Jamesa Goslinga, žice su nepromjenjive kako bi se poboljšale performanse i sigurnost.

I zapravo, vidimo nekoliko prednosti postojanja nepromjenjivih nizova:

  • Spremište nizova moguće je samo ako se nizovi, jednom stvoreni, nikada ne mijenjaju, jer bi se trebali ponovno upotrijebiti
  • Kod može sigurno proslijedite niz drugoj metodi, znajući da se to ne može promijeniti tom metodom
  • Nepromjenjivo automatski ovu klasu čini nitima sigurnom
  • Budući da je ova klasa zaštićena nitima, nema potrebe za sinkronizacijom uobičajenih podataka, što zauzvrat poboljšava performanse
  • Budući da se zajamčeno neće mijenjati, njihov hashcode se može lako predmemorirati

P5. Kako se niz čuva u sjećanju?

Prema JVM specifikaciji, Niz literali su pohranjeni u spremištu konstante izvođenja, koje se dodjeljuje iz područja metode JVM-a.

Iako je područje metode logično dio hrpe memorije, specifikacija ne diktira mjesto, veličinu memorije ili politike prikupljanja smeća. Može biti specifično za provedbu.

Ovo spremište konstante vremena izvođenja za klasu ili sučelje konstruira se kada klasu ili sučelje kreira JVM.

P6. Ispunjavaju li internirani nizovi odvoz smeća na Javi?

Da, svi Nizs u spremištu nizova ispunjavaju uvjete za odvoz smeća ako nema referenci iz programa.

P7. Što je niz konstantnih nizova?

Niz žica, poznat i kao Niz stalni bazen ili Niz intern pool, posebna je memorijska regija u kojoj JVM pohranjuje Niz instance.

Optimizira izvedbu aplikacije smanjenjem koliko često i koliko se nizova dodjeljuje:

  • JVM pohranjuje samo jednu kopiju određenog Niz u bazenu
  • Prilikom stvaranja novog Niz, JVM u bazenu traži a Niz imaju istu vrijednost
  • Ako se pronađe, JVM vraća referencu na to Niz bez izdvajanja bilo kakve dodatne memorije
  • Ako nije pronađen, tada ga JVM dodaje u spremište (internira) i vraća njegovu referencu

P8. Je li nit zaštićen niti? Kako?

Žice su doista potpuno zaštićene od niti jer su nepromjenjive. Bilo koja klasa koja je nepromjenjiva automatski se kvalificira za sigurnost niti, jer njena nepromjenjivost jamči da se njezini primjerci neće mijenjati u više niti.

Na primjer, ako nit promijeni vrijednost niza, nova Niz stvara se umjesto da modificira postojeću.

P9. Za koje je gudačke operacije važno navesti lokalitet?

The Lokalno klasa omogućuje nam razlikovanje kulturnih područja kao i pravilno oblikovanje sadržaja.

Kad je riječ o Niz klase, potreban nam je prilikom generiranja nizova u format ili kada niže donje ili gornje kućište.

Zapravo, ako to zaboravimo, možemo naići na probleme s prenosivošću, sigurnošću i upotrebljivošću.

Q10. Što je osnovno kodiranje znakova za žice?

Prema Niz's Javadocs za verzije do Java 8, uključujući, stringovi se interno pohranjuju u formatu UTF-16.

The ugljen tip podataka i java.lang.Lik objekti se također temelje na izvornoj specifikaciji Unicode, koja je znakove definirala kao 16-bitne entitete fiksne širine.

Počevši od JDK 9, Žice koji sadrže samo jednobajtne znakove Latinski-1 kodiranje, dok Žice s najmanje 1 višebajtnim znakom koristi UTF-16 kodiranje.

3. The Niz API

U ovom ćemo odjeljku razgovarati o nekim pitanjima vezanim za Niz API.

Q11. Kako možemo usporediti dvije žice u Javi? Koja je razlika između str1 == str2 i str1.Equals (str2)?

Nizove možemo usporediti na dva različita načina: korištenjem jednakog operatora (==) i korištenjem jednako () metoda.

Oboje se međusobno prilično razlikuju:

  • Operator (str1 == str2) provjerava referentnu jednakost
  • Metoda (str1.equals (str2)) provjerava leksičku jednakost

Iako je istina da su, ako su dvije žice leksički jednake, onda str1.intern () == str2.intern () Također pravi.

Tipično, za usporedbu dva Žice za njihov sadržaj, uvijek bismo trebali koristiti Niz.jednak.

Q12. Kako možemo podijeliti niz na Javi?

The Niz klasa nam sama pruža Niz#podjela metoda koja prihvaća graničnik regularnog izraza. Vraća nas a Niz[] niz:

String [] dijelovi = "john, peter, mary" .split (","); assertEquals (novi String [] {"john", "peter", "mary"}, dijelovi);

Jedna zeznuta stvar podjela je li kod dijeljenja praznog niza, možemo dobiti neprazan niz:

assertEquals (novi String [] {""}, "" .split (","));

Naravno, podjela samo je jedan od mnogih načina za razdvajanje Jave Niz.

Q13. Što je Stringjoiner?

StringJoiner je klasa uvedena u Javi 8 za spajanje zasebnih nizova u jednu, poput uzimajući popis boja i vraćajući ih kao niz razdvojen zarezom. Možemo isporučiti graničnik, kao i prefiks i sufiks:

StringJoiner pridruživač = novi StringJoiner (",", "[", "]"); stolar.add ("Crvena") .add ("Zelena") .add ("Plava"); assertEquals ("[Crvena, Zelena, Plava]", joiner.toString ());

P14. Razlika između String, Stringbuffer i Stringbuilder?

Žice su nepromjenjive. Ovo znači to ako pokušamo promijeniti ili izmijeniti njegove vrijednosti, tada Java stvara apsolutno novo Niz.

Na primjer, ako dodamo u niz str1 nakon što je stvoren:

Niz str1 = "abc"; str1 = str1 + "def";

Zatim JVM, umjesto da mijenja str1, stvara potpuno novu Niz.

Međutim, za većinu jednostavnih slučajeva kompajler interno koristi StringBuilder i optimizira gornji kod.

Ali, za složeniji kod poput petlji, stvorit će posve novu Niz, pogoršanje performansi. Ovo je gdje StringBuilder i StringBuffer su korisni.

Oba StringBuilder i StringBuffer u Javi stvoriti objekte koji sadrže promjenjivi niz znakova.StringBuffer je sinkroniziran i stoga siguran u nit dok StringBuilder nije.

Budući da je dodatna sinkronizacija u StringBuffer je obično nepotrebno, odabirom često možemo poboljšati performanse StringBuilder.

P15. Zašto je sigurnije pohranjivanje lozinki u niz Char [] umjesto u niz?

Budući da su nizovi nepromjenjivi, ne dopuštaju izmjene. Ovakvo ponašanje nas sprječava da prepisujemo, modificiramo ili nuliramo njegov sadržaj Žice neprikladan za pohranu osjetljivih podataka.

Moramo se osloniti na sakupljač smeća da ukloni sadržaj niza. Štoviše, u Javinoj verziji 6 i starijim, nizovi su bili pohranjeni u PermGenu, što znači da su nekad a Niz je stvoreno, nikad se nije sakupljalo smeće.

Korištenjem a char [] niz, imamo potpunu kontrolu nad tim informacijama.Možemo ga izmijeniti ili potpuno obrisati, a da se ne oslanjamo ni na sakupljač smeća.

Koristeći char [] nad Niz ne osigurava potpuno informacije; to je samo dodatna mjera koja zlonamjernom korisniku smanjuje priliku za pristup osjetljivim informacijama.

Q16. Što radi Stringova metoda pripravnika ()?

Metoda pripravnik () stvara točnu kopiju a Niz objekt u hrpi i sprema ga u Niz stalni bazen, koji JVM održava.

Java automatski internira sve nizove stvorene pomoću literalnih znakova, ali ako stvorimo Niz pomoću novog operatora, na primjer, Niz str = novi niz (“abc”), zatim ga Java dodaje u hrpu, baš kao i bilo koji drugi objekt.

Možemo nazvati pripravnik () metoda koja kaže JVM-u da ga doda u spremište nizova ako tamo već ne postoji i vrati referencu tog interniranog niza:

Niz s1 = "Baeldung"; Niz s2 = novi niz ("Baeldung"); Niz s3 = novi niz ("Baeldung"). Intern (); assertThat (s1 == s2) .isFalse (); assertThat (s1 == s3) .isTrue ();

Q17. Kako možemo pretvoriti niz u cijeli broj, a cijeli broj u niz u Javi?

Najjednostavniji pristup pretvaranju a Niz do an Cijeli broj je pomoću Cijeli brojraščlaniti:

int num = Integer.parseInt ("22");

Da bismo napravili obrnuto, možemo koristiti Cijeli brojtoString:

Niz s = Integer.toString (num);

Q18. Što je String.format () i kako ga možemo koristiti?

String # format vraća formatirani niz pomoću navedenog niza formata i argumenata.

Naslov niza = "Baeldung"; String formatiran = String.format ("Naslov je% s", naslov); assertEquals ("Naslov je Baeldung", formatirano);

Također moramo imati na umu da navedemo korisnikovu Lokalno, osim ako nismo u redu s jednostavnim prihvaćanjem zadanog operativnog sustava:

Locale usersLocale = Locale.ITALY; assertEquals ("1.024", String.format (usersLocale, "Postoji%, d košulje na izbor. Sretno.", 1024))

Q19. Kako možemo pretvoriti niz u velika i mala slova?

Niz implicitno pruža Niz # zaUpperCase za promjenu kućišta u velika slova.

Iako nas Javadocs podsjećaju da moramo navesti korisničke Locale kako bi se osigurala ispravnost:

String s = "Dobrodošli u Baeldung!"; assertEquals ("DOBRO DOŠLI U BAELDUNG!", s.toUpperCase (Locale.US));

Slično tome, za pretvaranje u mala slova imamo Niz # doLowerCase:

String s = "Dobrodošli u Baeldung!"; assertEquals ("dobrodošli u baeldung!", s.toLowerCase (Locale.UK));

Q20. Kako iz niza možemo dobiti niz znakova?

Niz pruža toCharArray, koji vraća kopiju svog internog ugljen niz pre-JDK9 (i pretvara Niz na novu ugljen niz u JDK9 +):

char [] pozdrav = "zdravo" .toCharArray (); assertArrayEquals (novi String [] {'h', 'e', ​​'l', 'l', 'o'}, pozdrav);

Q21. Kako bismo pretvorili Java niz u bajtni niz?

Prema zadanim postavkama metoda Niz # getBytes () kodira String u bajtni niz koristeći zadani skup znakova platforme.

I dok API ne zahtijeva da odredimo skup znakova, trebali bismo kako bismo osigurali sigurnost i prenosivost:

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

4. Niz-Na temelju algoritama

U ovom ćemo odjeljku razmotriti neka programska pitanja u vezi s Nizs.

Q22. Kako možemo provjeriti jesu li dva niza anagrami u Javi?

Anagram je riječ nastala preslagivanjem slova druge zadane riječi, na primjer, "automobil" i "luk".

Za početak prvo provjeravamo jesu li oba Žice su jednake duljine ili ne.

Zatim ih pretvaramo u char [] niz, sortirajte ih, a zatim provjerite jednakost.

Q23. Kako možemo računati broj pojavljivanja određenog lika u nizu?

Java 8 stvarno pojednostavljuje zadatke agregiranja poput ovih:

long count = "bok" .chars (). filter (ch -> (char) ch == 'l'). count (); assertEquals (2, count);

Postoji i nekoliko drugih izvrsnih načina za brojanje l-ova, uključujući petlje, rekurziju, regularne izraze i vanjske knjižnice.

Q24. Kako možemo obrnuti niz u Javi?

To može biti mnogo načina, najočitiji pristup je korištenje obrnuti metoda iz StringBuilder (ili StringBuffer):

Obrnuti niz = novi StringBuilder ("baeldung"). Reverse (). ToString (); assertEquals ("gnudleab", obrnuto);

Q25. Kako možemo provjeriti je li žica palindrom ili nije?

Palindrom je bilo koji slijed znakova koji se čita unatrag kao i naprijed, kao što su "gospođa", "radar" ili "nivo".

Da bismo provjerili je li niz palindrom, možemo započeti ponavljanje zadanog niza naprijed i natrag u jednoj petlji, jedan po jedan znak. Petlja izlazi pri prvom neusklađivanju.

5. Zaključak

U ovom smo članku prošli neke od najzastupljenijih Niz pitanja za intervju.

Svi ovdje korišteni uzorci koda dostupni su na GitHubu.