Java String Intervju Spørsmål og svar

1. Introduksjon

De String class er en av de mest brukte klassene i Java, som fikk språkdesignere til å behandle det spesielt. Denne spesielle oppførselen gjør det til et av de hotteste emnene i Java-intervjuer.

I denne opplæringen vil vi gå gjennom noen av de vanligste intervjuspørsmålene om String.

2. String Grunnleggende

Denne delen består av spørsmål som gjelder String intern struktur og minne.

Q1. Hva er en streng i Java?

I Java, a String er representert internt av en rekke byte verdier (eller røye verdier før JDK 9).

I versjoner til og med Java 8, a String var sammensatt av et uforanderlig utvalg av Unicode-tegn. Imidlertid krever de fleste tegn bare 8 bits (1 byte) å representere dem i stedet for 16 biter (char størrelse).

For å forbedre minneforbruk og ytelse introduserte Java 9 kompakte strenger. Dette betyr at hvis en String inneholder bare 1 byte tegn, vil den bli representert ved hjelp av Latin-1 koding. Hvis en String inneholder minst 1 flerbyte-tegn, vil det bli representert som 2 byte per tegn ved bruk av UTF-16-koding.

I C og C ++, String er også en rekke tegn, men i Java er det et eget objekt med sin egen API.

Q2. Hvordan kan vi lage et strengobjekt i Java?

java.lang.Streng definerer 13 forskjellige måter å lage en String. Generelt sett er det imidlertid to:

  • Gjennom en String bokstavelig:
    Streng s = "abc";
  • Gjennom ny nøkkelord:
    Streng s = ny streng ("abc");

Alle strengtekster i Java er forekomster av String klasse.

Q3. Er String en primitiv eller en avledet type?

En streng er en avledet type siden den har tilstand og oppførsel. For eksempel har den metoder som substring (), oversikt over(), og er lik(), som primitiver ikke kan ha.

Men siden vi alle bruker det så ofte, har det noen spesielle egenskaper som gjør at det føles som et primitivt:

  • Mens strengene ikke er lagret på samtalestakken slik som primitiver, er de lagret i et spesielt minneområde som kalles strengbassenget
  • Som primitiver kan vi bruke + operatør på strenger
  • Og igjen, som primitiver, kan vi opprette en forekomst av en String uten ny nøkkelord

Q4. Hva er fordelene med strenger å være uforanderlige?

I følge et intervju av James Gosling er strengene uforanderlige for å forbedre ytelse og sikkerhet.

Og faktisk ser vi flere fordeler med å ha uforanderlige strenger:

  • Strengbassenget er bare mulig hvis strengene, når de først er opprettet, aldri endres, som de skal brukes på nytt
  • Koden kan gi en streng trygt til en annen metode, vel vitende om at det ikke kan endres med den metoden
  • Uforanderlig automatisk gjør denne klassen trådsikker
  • Siden denne klassen er trådsikker, det er ikke nødvendig å synkronisere vanlige data, som igjen forbedrer ytelsen
  • Siden de garantert ikke endrer seg, deres hashcode kan enkelt caches

Q5. Hvordan lagres en streng i minnet?

I følge JVM-spesifikasjonen, String literals lagres i et konstant kjøretidsbasseng, som tildeles fra JVMs metodeområde.

Selv om metodeområdet logisk sett er en del av heapminnet, dikterer ikke spesifikasjonen politikk for plassering, minnestørrelse eller søppeloppsamling. Det kan være implementeringsspesifikt.

Denne kjøretidskonstanten for en klasse eller et grensesnitt konstrueres når klassen eller grensesnittet er opprettet av JVM.

Q6. Er internerte strenger kvalifisert for søppelinnsamling i Java?

Ja, alt Strings i strengbassenget er kvalifisert for søppeloppsamling hvis det ikke er referanser fra programmet.

Q7. Hva er strengkonstantbassenget?

Strengbassenget, også kjent som String konstant basseng eller String intern pool, er en spesiell minnesregion der JVM lagrer String tilfeller.

Det optimaliserer applikasjonsytelsen ved å redusere hvor ofte og hvor mange strenger som er tildelt:

  • JVM lagrer bare ett eksemplar av et bestemt String i bassenget
  • Når du lager en ny String, søker JVM i bassenget etter en String har samme verdi
  • Hvis funnet, returnerer JVM referansen til det String uten å tildele noe ekstra minne
  • Hvis den ikke blir funnet, legger JVM den til bassenget (praktiserer den) og returnerer referansen

Q8. Er streng gjengesikker? Hvordan?

Strenger er faktisk helt trådsikre fordi de er uforanderlige. Enhver klasse som er uforanderlig, kvalifiserer automatisk for trådsikkerhet fordi dens uforanderlighet garanterer at forekomsten ikke blir endret over flere tråder.

For eksempel, hvis en tråd endrer strengens verdi, en ny String blir opprettet i stedet for å endre den eksisterende.

Q9. For hvilke strengoperasjoner er det viktig å levere lokale språk?

De Lokal klasse lar oss skille mellom kulturelle lokaliteter, samt å formatere innholdet vårt på riktig måte.

Når det gjelder String klasse, trenger vi det når vi gjengir strengene format eller når under- eller overbekledningstrenger.

Hvis vi glemmer å gjøre dette, kan vi faktisk komme i problemer med bærbarhet, sikkerhet og brukervennlighet.

Q10. Hva er den underliggende karakterkodingen for strenger?

I følge String 's Javadocs for versjoner til og med Java 8 lagres strenger internt i UTF-16-format.

De røye datatype og java.lang.Character objekter er også basert på den originale Unicode-spesifikasjonen, som definerte tegn som 16-biters enheter med fast bredde.

Fra og med JDK 9, Strenger som bare inneholder 1-byte tegn Latin-1 koding, mens Strenger med minst 1 flerbyte-tegn bruk UTF-16-koding.

3. Den String API

I denne delen vil vi diskutere noen spørsmål knyttet til String API.

Q11. Hvordan kan vi sammenligne to strenger i Java? Hva er forskjellen mellom str1 == str2 og str1.Equals (str2)?

Vi kan sammenligne strenger på to forskjellige måter: ved å bruke like operator (==) og ved å bruke er lik() metode.

Begge er ganske forskjellige fra hverandre:

  • Operatøren (str1 == str2) sjekker for referanselikhet
  • Metoden (str1.equals (str2)) sjekker for leksikal likhet

Selv om det er sant at hvis to strenger er leksikalt like, da str1.intern () == str2.intern () er også ekte.

Vanligvis for å sammenligne to Strenger for innholdet deres, bør vi alltid bruke String. Like.

Q12. Hvordan kan vi dele en streng i Java?

De String klassen i seg selv gir oss Streng #dele metode, som aksepterer en skilletegn for regulært uttrykk. Det gir oss en Streng [] matrise:

String [] parts = "john, peter, mary" .split (","); assertEquals (ny streng [] {"john", "peter", "mary"}, deler);

En vanskelig ting med dele er det når du deler en tom streng, kan vi få et ikke-tomt utvalg:

assertEquals (ny streng [] {""}, "" .split (","));

Selvfølgelig, dele er bare en av mange måter å dele en Java på String.

Q13. Hva er Stringjoiner?

StringJoiner er en klasse introdusert i Java 8 for å koble separate strenger til en, som tar en liste over farger og returnerer dem som en kommaseparert streng. Vi kan levere en avgrenser i tillegg til et prefiks og suffiks:

StringJoiner snekker = ny StringJoiner (",", "[", "]"); joiner.add ("Red") .add ("Green") .add ("Blue"); assertEquals ("[Red, Green, Blue]", joiner.toString ());

Q14. Forskjellen mellom stryke, strykebuffer og strykebygger?

Strenger er uforanderlige. Dette betyr at hvis vi prøver å endre verdiene, så oppretter Java en helt ny String.

For eksempel hvis vi legger til en streng str1 etter at den er opprettet:

Streng str1 = "abc"; str1 = str1 + "def";

Deretter JVM, i stedet for å endre str1, skaper et helt nytt String.

For de fleste enkle tilfeller bruker kompilatoren imidlertid internt StringBuilder og optimaliserer ovennevnte kode.

Men for mer komplisert kode som sløyfer, det vil skape et helt nytt String, forverret ytelse. Dette er hvor StringBuilder og StringBuffer er nyttige.

Både StringBuilder og StringBuffer i Java oppretter objekter som inneholder en foranderlig sekvens av tegn.StringBuffer er synkronisert og derfor trådsikker mens StringBuilder er ikke.

Siden den ekstra synkroniseringen i StringBuffer er vanligvis unødvendig, kan vi ofte få et ytelsesløft ved å velge StringBuilder.

Q15. Hvorfor er det tryggere å lagre passord i en røye [] -arrangement snarere enn en streng?

Siden strengene er uforanderlige, tillater de ikke endringer. Denne oppførselen hindrer oss i å overskrive, endre eller nullstille innholdet og lage Strenger uegnet for lagring av sensitiv informasjon.

Vi må stole på søppeloppsamleren for å fjerne innholdet i en streng. Videre, i Java versjoner 6 og under, ble strengene lagret i PermGen, noe som betyr at en gang en String ble opprettet, ble det aldri samlet inn søppel.

Ved å bruke en røye [] array, har vi full kontroll over den informasjonen.Vi kan endre det eller tørke det helt uten å stole på søppeloppsamleren.

Ved hjelp av røye [] over String sikrer ikke informasjonen fullstendig; det er bare et ekstra tiltak som reduserer muligheten for den ondsinnede brukeren å få tilgang til sensitiv informasjon.

Q16. Hva gjør String’s intern () Method?

Metoden turnuskandidat() lager en eksakt kopi av en String gjenstand i haugen og lagrer den i String konstant basseng, som JVM opprettholder.

Java praktiserer automatisk alle strenger som er opprettet ved hjelp av strenglitteraler, men hvis vi oppretter en String bruker den nye operatøren, for eksempel Strengstr = ny streng (“abc”), så legger Java det til haugen, akkurat som ethvert annet objekt.

Vi kan ringe turnuskandidat() metode for å fortelle JVM å legge den til i strengbassenget hvis den ikke allerede finnes der, og returnere en referanse til den internerte strengen:

String s1 = "Baeldung"; Streng s2 = ny streng ("Baeldung"); Streng s3 = ny streng ("Baeldung"). Intern (); assertThat (s1 == s2) .isFalse (); assertThat (s1 == s3) .isTrue ();

Q17. Hvordan kan vi konvertere streng til heltall og heltall til streng i Java?

Den mest enkle tilnærmingen for å konvertere en String til en Heltall er ved å bruke Heltall #parseInt:

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

For å gjøre det motsatte kan vi bruke Heltall #toString:

String s = Integer.toString (num);

Q18. Hva er String.format () og hvordan kan vi bruke det?

Streng # format returnerer en formatert streng ved hjelp av den angitte formatstrengen og argumentene.

String title = "Baeldung"; String formatted = String.format ("Tittel er% s", tittel); assertEquals ("Tittelen er Baeldung", formatert);

Vi må også huske å spesifisere brukerens Lokal, med mindre det er greit å bare godta operativsystemets standard:

Locale usersLocale = Locale.ITALY; assertEquals ("1.024", String.format (usersLocale, "Det er%, d skjorter å velge mellom. Lykke til.", 1024))

Q19. Hvordan kan vi konvertere en streng til store og små bokstaver?

String implisitt gir Streng # toUpperCase for å endre kabinettet til store bokstaver.

Skjønt, minner Javadocs oss om at vi må spesifisere brukerens Locale for å sikre korrekthet:

String s = "Velkommen til Baeldung!"; assertEquals ("VELKOMMEN TIL BAELDUNG!", s.toUpperCase (Locale.US));

På samme måte har vi for å konvertere til små bokstaver String # toLowerCase:

String s = "Velkommen til Baeldung!"; assertEquals ("velkommen til baeldung!", s.toLowerCase (Locale.UK));

Q20. Hvordan kan vi få en tegneserie fra streng?

String gir toCharArray, som returnerer en kopi av den interne røye array pre-JDK9 (og konverterer String til en ny røye array i JDK9 +):

char [] hallo = "hei" .toCharArray (); assertArrayEquals (ny streng [] {'h', 'e', ​​'l', 'l', 'o'}, hallo);

Q21. Hvordan ville vi konvertere en Java-streng til en byte-serie?

Som standard er metoden Streng # getBytes () koder en streng i en byte-array ved hjelp av plattformens standardtegnsett.

Og mens API ikke krever at vi spesifiserer et tegnsett, bør vi for å sikre sikkerhet og bærbarhet:

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

4. String-Baserte algoritmer

I denne delen vil vi diskutere noen programmeringsspørsmål relatert til Strings.

Q22. Hvordan kan vi sjekke om to strenger er anagrammer i Java?

Et anagram er et ord dannet ved å omorganisere bokstavene til et annet gitt ord, for eksempel "bil" og "bue".

For å begynne, sjekker vi først om begge Strenger er like lange eller ikke.

Så konverterer vi dem til røye [] array, sorter dem, og kontroller deretter om det er likeverd.

Q23. Hvordan kan vi telle antall forekomster av en gitt karakter i en streng?

Java 8 forenkler virkelig aggregeringsoppgaver som disse:

lang telling = "hei". tegn (). filter (ch -> (char) ch == 'l'). count (); assertEquals (2, count);

Og det er flere andre gode måter å telle l, også, inkludert sløyfer, rekursjon, vanlige uttrykk og eksterne biblioteker.

Q24. Hvordan kan vi reversere en streng i Java?

Det kan være mange måter å gjøre dette på, den enkleste tilnærmingen er å bruke omvendt metode fra StringBuilder (eller StringBuffer):

String reversed = new StringBuilder ("baeldung"). Reverse (). ToString (); assertEquals ("gnudleab", omvendt);

Q25. Hvordan kan vi sjekke om en streng er en palindrom eller ikke?

En palindrome er en hvilken som helst sekvens av tegn som leser det samme bakover som fremover, for eksempel "madam", "radar" eller "level".

For å sjekke om en streng er et palindrom, kan vi begynne å itere den gitte strengen fremover og bakover i en enkelt sløyfe, ett tegn om gangen. Sløyfen går ut ved første mismatch.

5. Konklusjon

I denne artikkelen gikk vi gjennom noen av de mest utbredte String intervju spørsmål.

Alle kodeeksemplene som brukes her, er tilgjengelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found