Java String Interview Spørgsmål og svar

1. Introduktion

Det Snor klasse er en af ​​de mest anvendte klasser i Java, hvilket fik sprogdesignere til at behandle det specielt. Denne specielle adfærd gør det til et af de hotteste emner i Java-interviews.

I denne vejledning gennemgår vi nogle af de mest almindelige interviewspørgsmål om Snor.

2. Snor Grundlæggende

Dette afsnit består af spørgsmål, der vedrører Snor intern struktur og hukommelse.

Q1. Hvad er en streng i Java?

I Java er en Snor repræsenteres internt af en række af byte værdier (eller char værdier før JDK 9).

I versioner op til og med Java 8, a Snor var sammensat af et uforanderligt udvalg af Unicode-tegn. De fleste tegn kræver dog kun 8 bit (1 byte) at repræsentere dem i stedet for 16 bits (char størrelse).

For at forbedre hukommelsesforbruget og ydeevnen introducerede Java 9 kompakte strenge. Dette betyder, at hvis en Snor indeholder kun 1-byte tegn, vil det blive repræsenteret ved hjælp af Latin-1 indkodning. Hvis en Snor indeholder mindst 1 multi-byte-tegn, vil det blive repræsenteret som 2 bytes pr. tegn ved hjælp af UTF-16-kodning.

I C og C ++, Snor er også en række tegn, men i Java er det et separat objekt med sin egen API.

Q2. Hvordan kan vi oprette et strengobjekt i Java?

java.lang.Streng definerer 13 forskellige måder at oprette en Snor. Generelt er der dog to:

  • Gennem en Snor bogstavelig:
    Streng s = "abc";
  • Gennem ny nøgleord:
    Streng s = ny streng ("abc");

Alle strengbogstaver i Java er eksempler på Snor klasse.

Q3. Er Snor en primitiv eller en afledt type?

En streng er en afledt type, da den har tilstand og adfærd. For eksempel har det metoder som understreng (), indeks af()og lige med(), hvilke primitiver ikke kan have.

Men da vi alle bruger det så ofte, har det nogle specielle egenskaber, der får det til at føles som et primitivt:

  • Mens strenge ikke er gemt på opkaldstakken som primitiver, er de gemt i en særlig hukommelsesregion kaldet strengpoolen
  • Som primitiver kan vi bruge + operatør på strenge
  • Og igen, som primitiver, kan vi oprette en forekomst af en Snor uden ny nøgleord

Q4. Hvad er fordelene ved at strenge er uforanderlige?

Ifølge et interview af James Gosling er strenge uforanderlige for at forbedre ydeevne og sikkerhed.

Og faktisk ser vi flere fordele ved at have uforanderlige strenge:

  • Strengepuljen er kun mulig, hvis strengene, når de først er oprettet, aldrig ændres, som de formodes at blive genbrugt
  • Koden kan videregive en streng sikkert til en anden metode, vel vidende at det ikke kan ændres ved denne metode
  • Uforanderligt gør automatisk denne klasse trådsikker
  • Da denne klasse er trådsikker, der er ikke behov for at synkronisere almindelige data, hvilket igen forbedrer ydeevnen
  • Da de garanteret ikke ændrer sig, deres hashcode kan let cachelagres

Q5. Hvordan opbevares en streng i hukommelsen?

I henhold til JVM-specifikationen, Snor bogstaver opbevares i en konstant pool, der tildeles fra JVM's metodeområde.

Selvom metodeområdet logisk set er en del af bunkehukommelsen, dikterer specifikationen ikke placeringen, hukommelsesstørrelsen eller politik for affaldsindsamling. Det kan være implementeringsspecifikt.

Denne runtime konstante pool for en klasse eller grænseflade konstrueres, når klassen eller grænsefladen oprettes af JVM.

Q6. Er internede strenge kvalificerede til affaldsindsamling i Java?

Ja alt sammen Snors i strengpuljen er kvalificeret til affaldsindsamling, hvis der ikke er nogen referencer fra programmet.

Q7. Hvad er den strenge konstante pool?

Strengepuljen, også kendt som Snor konstant pool eller Snor intern pool, er en særlig hukommelsesregion, hvor JVM gemmer Snor tilfælde.

Det optimerer applikationsydelsen ved at reducere hvor ofte og hvor mange strenge der tildeles:

  • JVM gemmer kun en kopi af en bestemt Snor i poolen
  • Når du opretter en ny Snor, søger JVM i puljen efter en Snor med samme værdi
  • Hvis fundet, returnerer JVM referencen til det Snor uden at tildele yderligere hukommelse
  • Hvis den ikke findes, tilføjer JVM den til puljen (praktiserer den) og returnerer sin reference

Q8. Er strengstrådssikker? Hvordan?

Strenge er faktisk helt trådsikre, fordi de er uforanderlige. Enhver klasse, der er uforanderlig, kvalificerer automatisk til trådsikkerhed, fordi dens uforanderlighed garanterer, at dens forekomster ikke ændres på tværs af flere tråde.

For eksempel, hvis en tråd ændrer en strengs værdi, en ny Snor bliver oprettet i stedet for at ændre den eksisterende.

Q9. For hvilke strengoperationer er det vigtigt at levere en lokal?

Det Lokal klasse giver os mulighed for at skelne mellem kulturelle lokaliteter og at formatere vores indhold korrekt.

Når det kommer til Snor klasse, har vi brug for det, når vi gengiver strengene format eller når under- eller overbeklædningsstrenge.

Faktisk, hvis vi glemmer at gøre dette, kan vi løbe ind i problemer med bærbarhed, sikkerhed og brugervenlighed.

Q10. Hvad er den underliggende karakter, der koder for strenge?

Ifølge Snor's Javadocs til versioner op til og med Java 8 lagres strengene internt i UTF-16-formatet.

Det char datatype og java.lang.Character objekter er også baseret på den originale Unicode-specifikation, som definerede tegn som 16-bit enheder med fast bredde.

Begyndende med JDK 9, Strenge der kun indeholder 1-byte tegn Latin-1 kodning, mens Strenge med mindst 1 multi-byte tegn brug UTF-16 kodning.

3. Den Snor API

I dette afsnit vil vi diskutere nogle spørgsmål relateret til Snor API.

Q11. Hvordan kan vi sammenligne to strenge i Java? Hvad er forskellen mellem str1 == str2 og str1.Lige (str2)?

Vi kan sammenligne strenge på to forskellige måder: ved at bruge lig med operator (==) og ved at bruge lige med() metode.

Begge er meget forskellige fra hinanden:

  • Operatøren (str1 == str2) kontrollerer for henvisning til lighed
  • Metoden (str1.equals (str2)) kontrollerer for leksikal lighed

Skønt det er sandt, at hvis to strenge er leksikalt ens, så str1.intern () == str2.intern () er også rigtigt.

Typisk til sammenligning af to Strenge for deres indhold, skal vi altid bruge String. Ligestilling.

Q12. Hvordan kan vi dele en streng i Java?

Det Snor klassen selv giver os den Snor#dele metode, som accepterer en regulær udtryksafgrænser. Det returnerer os en Snor[] matrix:

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

En vanskelig ting ved dele er, at når man deler en tom streng, vi kan få et ikke-tomt array:

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

Selvfølgelig, dele er blot en af ​​mange måder at opdele en Java på Snor.

Q13. Hvad er Stringjoiner?

StringJoiner er en klasse, der er introduceret i Java 8 til sammenføjning af separate strenge til en, ligesom tager en liste over farver og returnerer dem som en kommasepareret streng. Vi kan levere en afgrænser såvel som et præfiks og suffiks:

StringJoiner-snedker = ny StringJoiner (",", "[", "]"); joiner.add ("Red") .add ("Green") .add ("Blue"); assertEquals ("[Rød, grøn, blå]", joiner.toString ());

Q14. Forskellen mellem streng, strengbuffer og strengbygger?

Strenge er uforanderlige. Det betyder at hvis vi prøver at ændre eller ændre dens værdier, så opretter Java en helt ny Snor.

For eksempel, hvis vi føjer til en streng str1 efter at den er oprettet:

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

Derefter JVM, i stedet for at ændre str1, skaber et helt nyt Snor.

I de fleste af de enkle tilfælde bruger compileren dog internt StringBuilder og optimerer ovenstående kode.

Men for mere kompleks kode som sløjfer, det vil skabe et helt nyt Snor, forringet ydeevne. Det er her StringBuilder og StringBuffer er nyttige.

Begge StringBuilder og StringBuffer i Java oprette objekter, der indeholder en ændret sekvens af tegn.StringBuffer er synkroniseret og derfor trådsikker, mens StringBuilder er ikke.

Siden den ekstra synkronisering i StringBuffer er typisk unødvendig, kan vi ofte få et præstationsforøg ved at vælge StringBuilder.

Q15. Hvorfor er det sikrere at gemme adgangskoder i en [[array] snarere end en streng?

Da strenge er uforanderlige, tillader de ikke ændringer. Denne adfærd forhindrer os i at overskrive, ændre eller nulstille dets indhold og oprette Strenge uegnet til lagring af følsomme oplysninger.

Vi er afhængige af affaldssamleren for at fjerne en strengs indhold. Desuden blev strenge i Java-version 6 og derunder gemt i PermGen, hvilket betyder, at når en Snor blev oprettet, blev det aldrig indsamlet skrald.

Ved at bruge en char [] array, vi har fuld kontrol over disse oplysninger.Vi kan ændre det eller tørre det helt uden engang at stole på affaldssamleren.

Ved brug af char [] over Snor beskytter ikke oplysningerne fuldstændigt; det er bare en ekstra foranstaltning, der reducerer den ondsindede brugeres mulighed for at få adgang til følsomme oplysninger.

Q16. Hvad gør String's praktikant () -metode?

Metoden praktikant () opretter en nøjagtig kopi af en Snor objekt i bunken og gemmer det i Snor konstant pool, som JVM opretholder.

Java praktiserer automatisk alle strenge oprettet ved hjælp af strenglitteraler, men hvis vi opretter en Snor ved hjælp af den nye operatør, f.eks. Streng str = ny streng (“abc”), så tilføjer Java det til bunken, ligesom ethvert andet objekt.

Vi kan ringe til praktikant () metode til at fortælle JVM at tilføje den til strengpoolen, hvis den ikke allerede findes der, og returnere en reference til den internede streng:

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

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

Den mest ligefremme tilgang til at konvertere en Snor til en Heltal er ved hjælp af Heltal#parseInt:

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

For at gøre det omvendte kan vi bruge Heltal#toString:

String s = Integer.toString (num);

Q18. Hvad er String.format () og hvordan kan vi bruge det?

Streng # format returnerer en formateret streng ved hjælp af den angivne formatstreng og argumenter.

String title = "Baeldung"; String formatted = String.format ("Titel er% s", titel); assertEquals ("Titlen er Baeldung", formateret);

Vi skal også huske at angive brugerens Lokalitet, medmindre vi er okay med blot at acceptere operativsystemets standard:

Locale usersLocale = Locale.ITALY; assertEquals ("1.024", String.format (usersLocale, "Der er%, d skjorter at vælge imellem. Held og lykke.", 1024))

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

Snor implicit giver Streng nr. ToUpperCase for at ændre kabinettet til store bogstaver.

Skønt Javadocs minder os om, at vi skal specificere brugerens Locale for at sikre korrekthed:

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

På samme måde har vi det for at konvertere til små bogstaver String # toLowerCase:

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

Q20. Hvordan kan vi få et tegnarrangement fra streng?

Snor giver toCharArray, som returnerer en kopi af dens interne char array pre-JDK9 (og konverterer Snor til en ny char array i JDK9 +):

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

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

Som standard er metoden Streng # getBytes () koder en streng i et byte-array ved hjælp af platformens standardtegn.

Og selvom API'en ikke kræver, at vi angiver et tegnsæt, skal vi for at sikre sikkerhed og bærbarhed:

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

4. Snor-Baserede algoritmer

I dette afsnit diskuterer vi nogle programmeringsspørgsmål relateret til Snors.

Q22. Hvordan kan vi kontrollere, om der er to strenge i diagrammer?

Et anagram er et ord dannet ved at omarrangere bogstaverne i et andet givet ord, for eksempel "bil" og "bue".

For at begynde med skal vi først kontrollere, om begge Strenge er af samme længde eller ej.

Så konverterer vi dem til char [] array, sorter dem og kontroller derefter for lighed.

Q23. Hvordan kan vi tælle antallet af forekomster af en given karakter i en streng?

Java 8 forenkler virkelig aggregeringsopgaver som disse:

lang optælling = "hej". tegn (). filter (ch -> (char) ch == 'l'). count (); assertEquals (2, count);

Og der er også flere andre gode måder at tælle l'erne på, inklusive sløjfer, rekursion, regulære udtryk og eksterne biblioteker.

Q24. Hvordan kan vi vende en streng i Java?

Der kan være mange måder at gøre dette på, den mest enkle tilgang er at bruge baglæns metode fra StringBuilder (eller StringBuffer):

Omvendt streng = ny StringBuilder ("baeldung"). Omvendt (). Til String (); assertEquals ("gnudleab", omvendt);

Q25. Hvordan kan vi kontrollere, om en streng er en palindrom eller ej?

En palindrom er en hvilken som helst sekvens af tegn, der læser det samme bagud som fremad, såsom "fru", "radar" eller "niveau".

For at kontrollere, om en streng er en palindrom, kan vi begynde at gentage den givne streng frem og tilbage i en enkelt løkke, et tegn ad gangen. Sløjfen afsluttes ved første mismatch.

5. Konklusion

I denne artikel gennemgik vi nogle af de mest udbredte Snor interview spørgsmål.

Alle kodeeksempler, der bruges her, er tilgængelige på GitHub.