logo

Jouset Javassa

Annetussa esimerkissä luodaan vain yksi objekti. Ensinnäkin JVM ei löydä merkkijonovakiovarannosta mitään merkkijonoobjektia, jonka arvo on Tervetuloa, joten se luo uuden objektin. Sen jälkeen se löytää poolista merkkijonon, jonka arvo on Tervetuloa, se ei luo uutta objektia, vaan palauttaa viittauksen samaan esiintymään. Tässä artikkelissa opimme Java-merkkijonoista.

Mitä merkkijonot ovat Javassa?

Merkkijonot ovat objektityyppejä, jotka voivat tallentaa arvojen merkin, ja Javassa jokainen merkki on tallennettu 16-bittisenä eli 16-bittistä UTF-koodausta käyttäen. Merkkijono toimii samalla tavalla kuin merkkijono Javassa.



Esimerkki:

String name = 'Geeks';>
Merkkijonoesimerkki Javassa

Merkkijonoesimerkki Javassa

Alla on esimerkki merkkijonosta Javassa:



Java
// Java Program to demonstrate // String public class StringExample {  // Main Function  public static void main(String args[])  {  String str = new String('example');  // creating Java string by new keyword  // this statement create two object i.e  // first the object is created in heap  // memory area and second the object is  // created in String constant pool.  System.out.println(str);  } }>

Lähtö
example>

Keinot luoda merkkijono

Javalla on kaksi tapaa luoda merkkijono:

  • String Literal
  • Uuden avainsanan käyttö

Syntaksi:

 = '';>

1. Merkkijono literaali

Javan tehostamiseksi muistia (koska uusia objekteja ei luoda, jos se on jo olemassa merkkijonovakiovarannossa).



Esimerkki:

String demoString = techcodeview.com;>

2. Uuden avainsanan käyttäminen

  • Merkkijono s = uusi merkkijono(Tervetuloa);
  • Tällaisessa tapauksessa JVM luo uuden merkkijonoobjektin normaaliin (ei-pooliin) kasomuistiin ja kirjaimellinen Tervetuloa sijoitetaan merkkijonovakiovaraan. Muuttuja s viittaa kasan objektiin (ei-pooli)

Esimerkki:

String demoString = new String (techcodeview.com);>

Liitännät ja luokat merkkijonoissa Javassa

CharBuffer : Tämä luokka toteuttaa CharSequence-rajapinnan. Tätä luokkaa käytetään sallimaan merkkipuskureiden käyttö CharSequences-sekvenssien sijasta. Esimerkki tällaisesta käytöstä on säännöllinen lausekepaketti java.util.regex.

merkkijono : Se on merkkijono. Javassa merkkijonon objektit ovat muuttumattomia, mikä tarkoittaa vakiota, eikä niitä voi muuttaa luomisen jälkeen.

CharSequence-liitäntä

CharSequence Interfacea käytetään merkkijonojen esittämiseen Javassa.
CharSequence-rajapinnalla toteutetut luokat on mainittu alla ja ne tarjoavat paljon toimintoja, kuten osamerkkijono, lastoccurence, ensimmäinen esiintyminen, ketjutus, toupper, tolower jne.

  1. merkkijono
  2. StringBuffer
  3. StringBuilder

1. merkkijono

Merkkijono on muuttumaton luokka, joka tarkoittaa vakiota, jota ei voi muuttaa luomisen jälkeen. Jos haluat muuttaa, meidän on luotava uusi objekti ja jopa sen tarjoamat toiminnot, kuten toupper, tolower jne. kaikki nämä palauttavat uuden objektin, sitä ei muokata alkuperäinen esine. Se on automaattisesti lankaturvallinen.

Syntaksi

String str= 'geeks';  or String str= new String('geeks')>

2. StringBuffer

StringBuffer on vertaisluokkaa merkkijono , se on luonteeltaan muuttuva ja se on säikeen turvallinen luokka, voimme käyttää sitä, kun meillä on monisäikeinen ympäristö ja jaettu merkkijonopuskurin objekti, eli usean säikeen käyttämä. Koska se on lankaturvallinen, siinä on ylimääräistä ylärajaa, joten sitä käytetään pääasiassa monisäikeisiin ohjelmiin.

Syntaksi:

StringBuffer demoString = new StringBuffer('techcodeview.com');>

3. StringBuilder

StringBuilder Javassa edustaa vaihtoehtoa String- ja StringBuffer Classille, koska se luo muuttuvan merkkijonon eikä se ole säikeen turvallinen. Sitä käytetään vain säikeen sisällä, joten ylimääräisiä lisäkustannuksia ei ole, joten sitä käytetään pääasiassa yksisäikeisiin ohjelmiin.

Syntaksi:

StringBuilder demoString = new StringBuilder(); demoString.append('GFG');>

StringTokenizer

StringTokenizer luokkaa Javassa käytetään jakamaan merkkijono tokeneiksi.

Esimerkki:

String Tokenizer Javassa

StringTokenizer-objekti säilyttää sisäisesti nykyisen sijainnin merkkijonossa. Jotkut toiminnot siirtävät nykyistä sijaintia käsiteltyjen merkkien ohi. Tunnus palautetaan ottamalla sen merkkijonon osamerkkijono, jota käytettiin StringTokenenizer-objektin luomiseen.

StringJoiner on luokka sisään java.util paketti, jota käytetään luomaan merkkijono (merkkijono), jotka on erotettu erottimella ja joka alkaa valinnaisesti mukana toimitetulla etuliitteellä ja päättyy toimitettuun pääteeseen. Vaikka tämä voidaan tehdä myös StringBuilder-luokan avulla lisäämään erotin jokaisen merkkijonon jälkeen, StringJoiner tarjoaa helpon tavan tehdä se ilman paljon kirjoitettavaa koodia.

Syntaksi:

public StringJoiner(CharSequence delimiter)>

Yllä näimme, että voimme luoda merkkijonon merkkijonokirjaimella.

String demoString =Tervetuloa;

Tässä JVM tarkistaa merkkijonon vakiovaraston. Jos merkkijonoa ei ole olemassa, uusi merkkijono-ilmentymä luodaan ja sijoitetaan pooliin. Jos merkkijono on olemassa, se ei luo uutta objektia. Sen sijaan se palauttaa viittauksen samaan esiintymään. Välimuisti, joka tallentaa nämä merkkijonot, tunnetaan nimellä String Constant pool tai String Pool. Aiemmissa Java-versioissa JDK 6 asti String pool sijaitsi PermGen (Permanent Generation) -tilassa. Mutta JDK 7:ssä se siirretään pääkasan alueelle.

Muuttumaton merkkijono Javassa

Javassa merkkijonoobjektit ovat muuttumattomia. Muuttumaton tarkoittaa yksinkertaisesti muuttumatonta tai muuttumatonta. Kun merkkijonoobjekti on luotu, sen tietoja tai tilaa ei voi muuttaa, mutta uusi merkkijonoobjekti luodaan.

Alla aiheen toteutus:

Java
// Java Program to demonstrate Immutable String in Java import java.io.*; class GFG {  public static void main(String[] args)  {  String s = 'Sachin';    // concat() method appends  // the string at the end  s.concat(' Tendulkar');    // This will print Sachin  // because strings are  // immutable objects  System.out.println(s);  } }>

Lähtö
Sachin>

Tässä Sachinia ei muuteta, vaan uusi objekti luodaan Sachin Tendulkarilla. Tästä syystä merkkijono tunnetaan muuttumattomana.

Kuten annetusta kuvasta näkyy, että kaksi objektia luodaan, mutta sen viitemuuttuja viittaa silti Sachiniin eikä Sachin Tendulkariin. Mutta jos määritämme sen nimenomaisesti viitemuuttujaan, se viittaa Sachin Tendulkar -objektiin.

Esimerkiksi:

Java
// Java Program to demonstrate Explicitly assigned strings import java.io.*; class GFG {  public static void main(String[] args)  {  String name = 'Sachin';  name = name.concat(' Tendulkar');  System.out.println(name);  } }>

Lähtö
Sachin Tendulkar>

Merkkijonon muistin jako

Aina kun merkkijonoobjekti luodaan literaalina, objekti luodaan merkkijonovakiovarannossa. Tämä antaa JVM:lle mahdollisuuden optimoida String literaalin alustuksen.

kuinka muuntaa merkkijono kokonaisluvuksi javassa

Esimerkki:

String demoString = 'Geeks';>

Merkkijono voidaan ilmoittaa myös komennolla a Uusi operaattori eli dynaamisesti allokoitu. Jos merkkijono on allokoitu dynaamisesti, niille määrätään uusi muistipaikka kasassa. Tätä merkkijonoa ei lisätä merkkijonovakiovarantoon.

Esimerkki:

String demoString = new String('Geeks');>

Jos haluat tallentaa tämän merkkijonon vakiovarastoon, sinun on internoitava se.

Esimerkki:

String internedString = demoString.intern();  // this will add the string to string constant pool.>

On suositeltavaa käyttää merkkijono-literaaleja, koska sen avulla JVM voi optimoida muistin varauksen.

Esimerkki, joka näyttää kuinka merkkijono määritellään

Java
// Java code to illustrate String import java.io.*; import java.lang.*; class Test {  public static void main(String[] args)  {  // Declare String without using new operator  String name = 'techcodeview.com';  // Prints the String.  System.out.println('String name = ' + name);  // Declare String using new operator  String newString = new String('techcodeview.com');  // Prints the String.  System.out.println('String newString = ' + newString);  } }>

Lähtö
String name = techcodeview.com String newString = techcodeview.com>


Huomautus: String Object luodaan Heap-alueelle ja Literaalit tallennetaan erityiselle muistialueelle, joka tunnetaan nimellä merkkijonovakiopooli.

Miksi String pool muutti PermGenistä the normaali kasa-alue?

PermGen-tilaa on rajoitetusti, oletuskoko on vain 64 Mt. ongelma oli liian monen merkkijonoobjektin luomisessa ja tallentamisessa PermGen-tilaan. Siksi String-allas siirrettiin isommalle kasa-alueelle. Javan muistin tehostamiseksi käytetään merkkijonoliteraalin käsitettä. Käyttämällä 'uusi'-avainsanaa JVM luo uuden merkkijonoobjektin normaalille kasa-alueelle, vaikka sama merkkijonoobjekti olisikin merkkijonovarannossa.

Esimerkiksi:

String demoString = new String('Bhubaneswar');>

Katsotaanpa konseptia Java-ohjelmalla ja visualisoidaan todellinen JVM-muistirakenne:

Alla on yllä olevan lähestymistavan toteutus:

Java
// Java program and visualize the // actual JVM memory structure // mentioned in image class StringStorage {  public static void main(String args[])  {  // Declaring Strings  String s1 = 'TAT';  String s2 = 'TAT';  String s3 = new String('TAT');  String s4 = new String('TAT');  // Printing all the Strings  System.out.println(s1);  System.out.println(s2);  System.out.println(s3);  System.out.println(s4);  } }>

Lähtö
TAT TAT TAT TAT>
String Pool Javassa

String Pool Javassa

Huomautus: Kaikki Java-objektit on tallennettu kasaan. Viitemuuttuja on pinoalueelle tallennettuun objektiin tai ne voivat sisältyä muihin objekteihin, jolloin ne myös asetetaan pinoalueelle.

Esimerkki 1:

Java
// Construct String from subset of char array // Driver Class class GFG {  // main function  public static void main(String args[])  {  byte ascii[] = { 71, 70, 71 };  String firstString = new String(ascii);  System.out.println(firstString);  String secondString = new String(ascii, 1, 2);  System.out.println(secondString);  } }>

Lähtö
GFG FG>

Esimerkki 2:

Java
// Construct one string from another class GFG {  public static void main(String args[])  {  char characters[] = { 'G', 'f', 'g' };  String firstString = new String(characters);  String secondString = new String(firstString);  System.out.println(firstString);  System.out.println(secondString);  } }>

Lähtö
Gfg Gfg>

Usein Kysytyt Kysymykset

1. Mitä merkkijonot ovat Javassa?

Merkkijonot ovat objektityyppejä, jotka voivat tallentaa merkkejä elementteinä.

2. Miksi merkkijonoobjektit ovat muuttumattomia Javassa?

Koska java käyttää merkkijonoliteraalin käsitettä. Oletetaan, että viitemuuttujia on viisi, kaikki viittaavat yhteen Sachin-objektiin. Jos yksi viitemuuttuja muuttaa kohteen arvoa, kaikki viitemuuttujat vaikuttavat siihen. Tästä syystä merkkijonoobjektit ovat muuttumattomia Javassa.

3. Miksi Java käyttää merkkijonoliteraalin käsitettä?

Javan tehostamiseksi muistia (koska uusia objekteja ei luoda, jos se on jo olemassa merkkijonovakiovarannossa).