logo

Reťazce v jazyku Java

V uvedenom príklade sa vytvorí iba jeden objekt. Po prvé, JVM nenájde žiadny objekt typu reťazec s hodnotou Welcome v oblasti konštantných reťazcov, takže vytvorí nový objekt. Potom nájde reťazec s hodnotou Welcome in the pool, nevytvorí nový objekt, ale vráti referenciu na rovnakú inštanciu. V tomto článku sa dozvieme o Java Strings.

Čo sú reťazce v jazyku Java?

Reťazce sú typom objektov, ktoré môžu uchovávať charakter hodnôt av Jave je každý znak uložený v 16 bitoch, tj pomocou 16-bitového kódovania UTF. Reťazec funguje rovnako ako pole znakov v jazyku Java.

Príklad:



String name = 'Geeks';>
Príklad reťazca v jazyku Java

Príklad reťazca v jazyku Java

Nižšie je uvedený príklad reťazca v jazyku Java:

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);  } }>

Výkon
example>

Spôsoby vytvorenia reťazca

Existujú dva spôsoby, ako vytvoriť reťazec v jazyku Java:

  • Strunový doslov
  • Použitie nového kľúčového slova

Syntax:

 = '';>

1. Reťazový doslov

Aby Java bola efektívnejšia s pamäťou (pretože sa nevytvárajú žiadne nové objekty, ak už existujú v oblasti konštantných reťazcov).

Príklad:

String demoString = techcodeview.com;>

2. Použitie nového kľúčového slova

  • String s = new String(Vitajte);
  • V takom prípade JVM vytvorí nový reťazcový objekt v normálnej (non-pool) haldovej pamäti a doslovné Welcome sa umiestni do oblasti reťazcových konštánt. Premenná s bude odkazovať na objekt v halde (bez fondu)

Príklad:

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

Rozhrania a triedy v reťazcoch v Jave

CharBuffer : Táto trieda implementuje rozhranie CharSequence. Táto trieda sa používa na umožnenie použitia vyrovnávacích pamätí znakov namiesto CharSequences. Príkladom takéhoto použitia je balík s regulárnymi výrazmi java.util.regex.

Reťazec : Ide o postupnosť znakov. V Jave sú objekty String nemenné, čo znamená konštantu a po vytvorení sa nedajú zmeniť.

Rozhranie CharSequence

Rozhranie CharSequence Interface sa používa na znázornenie postupnosti znakov v jazyku Java.
Triedy, ktoré sú implementované pomocou rozhrania CharSequence, sú uvedené nižšie a poskytujú veľa funkcií, ako je podreťazec, posledný výskyt, prvý výskyt, zreťazenie, toupper, tolower atď.

  1. Reťazec
  2. StringBuffer
  3. StringBuilder

1. Reťazec

String je nemenná trieda, čo znamená konštantu a po vytvorení ju nemožno zmeniť a ak ju chceme zmeniť, musíme vytvoriť nový objekt a dokonca aj funkcie, ktoré poskytuje, ako toupper, tolower atď., Všetky tieto vrátia nový objekt, ktorý sa nemodifikuje. pôvodný objekt. Je automaticky bezpečný pre vlákna.

Syntax

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

2. StringBuffer

StringBuffer je rovesnícka trieda Reťazec , je svojou povahou meniteľná a je to trieda bezpečná pre vlákna, môžeme ju použiť, keď máme viacvláknové prostredie a zdieľaný objekt reťazcového buffera, t.j. používa ho viac vlákien. Keďže je bezpečný pre vlákna, je tu dodatočná réžia, takže sa používa hlavne pre viacvláknové programy.

Syntax:

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

3. StringBuilder

StringBuilder v jazyku Java predstavuje alternatívu k triede String a StringBuffer, pretože vytvára meniteľnú sekvenciu znakov a nie je bezpečná pre vlákna. Používa sa iba v rámci vlákna, takže nevzniká žiadna dodatočná réžia, takže sa používa hlavne pre program s jedným vláknom.

reťazec a podreťazec

Syntax:

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

StringTokenizer

StringTokenizer trieda v jazyku Java sa používa na rozdelenie reťazca na tokeny.

Príklad:

String Tokenizer v jazyku Java

Objekt StringTokenizer interne udržiava aktuálnu pozíciu v reťazci, ktorý sa má tokenizovať. Niektoré operácie posúvajú túto aktuálnu pozíciu za spracované znaky. Token sa vráti prevzatím podreťazca reťazca, ktorý sa použil na vytvorenie objektu StringTokenizer.

StringJoiner je trieda v java.util balík, ktorý sa používa na vytvorenie postupnosti znakov (reťazcov) oddelených oddeľovačom a voliteľne počínajúc dodanou predponou a končiacou dodanou príponou. Aj keď to možno urobiť aj pomocou triedy StringBuilder na pridanie oddeľovača za každý reťazec, StringJoiner poskytuje jednoduchý spôsob, ako to urobiť bez veľkého množstva kódu na písanie.

Syntax:

public StringJoiner(CharSequence delimiter)>

Vyššie sme videli, že reťazec môžeme vytvoriť pomocou String Literal.

String demoString =Vitajte;

Tu JVM skontroluje zásobu konštantných reťazcov. Ak reťazec neexistuje, vytvorí sa nová inštancia reťazca a umiestni sa do oblasti. Ak reťazec existuje, nevytvorí nový objekt. Namiesto toho vráti odkaz na rovnakú inštanciu. Vyrovnávacia pamäť, ktorá ukladá tieto inštancie reťazcov, je známa ako fond reťazcov alebo reťazcov. V starších verziách Java až po JDK 6 String pool bol umiestnený v priestore PermGen (Permanent Generation). Ale v JDK 7 je presunutý do oblasti hlavnej haldy.

Immutable String v Jave

V Jave sú reťazcové objekty nemenné. Immutable jednoducho znamená nemeniteľné alebo nemenné. Po vytvorení objektu reťazca nemožno zmeniť jeho údaje alebo stav, ale vytvorí sa nový objekt reťazca.

Nižšie je uvedená implementácia témy:

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);  } }>

Výkon
Sachin>

Tu sa Sachin nemení, ale pomocou Sachin Tendulkar sa vytvorí nový objekt. Preto je reťazec známy ako nemenný.

triedenie java arraylist

Ako môžete vidieť na danom obrázku, sú vytvorené dva objekty, ale referenčná premenná sa stále vzťahuje na Sachin a nie na Sachin Tendulkar. Ale ak ju explicitne priradíme k referenčnej premennej, bude odkazovať na objekt Sachin Tendulkar.

Napríklad:

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);  } }>

Výkon
Sachin Tendulkar>

Pamäťové pridelenie reťazca

Kedykoľvek je objekt typu String vytvorený ako doslovný, objekt sa vytvorí v oblasti konštantných reťazcov. To umožňuje JVM optimalizovať inicializáciu literálu String.

Príklad:

String demoString = 'Geeks';>

Reťazec možno deklarovať aj pomocou a Nový operátor, t.j. dynamicky prideľovaný. V prípade, že sú reťazce dynamicky prideľované, je im priradené nové pamäťové miesto v halde. Tento reťazec nebude pridaný do fondu konštantných reťazcov.

Príklad:

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

Ak chcete tento reťazec uložiť do konštantného fondu, budete ho musieť internovať.

Príklad:

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

Uprednostňuje sa používať reťazcové literály, pretože to umožňuje JVM optimalizovať alokáciu pamäte.

Príklad, ktorý ukazuje, ako deklarovať reťazec

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);  } }>

Výkon
String name = techcodeview.com String newString = techcodeview.com>


Poznámka: String Object je vytvorený v oblasti haldy a literály sú uložené v špeciálnej pamäťovej oblasti známej ako reťazec konštanty.

Prečo sa fond String presťahoval z PermGen na a normálna plocha haldy?

Priestor PermGen je obmedzený, predvolená veľkosť je len 64 MB. bol to problém s vytváraním a ukladaním príliš veľa objektov typu string v priestore PermGen. Preto bol bazén String presunutý do väčšej haldy. Na zefektívnenie pamäte Java sa používa koncept reťazcového literálu. Použitím kľúčového slova „new“ vytvorí JVM nový objekt reťazca v normálnej oblasti haldy, aj keď sa rovnaký objekt reťazca nachádza v oblasti reťazcov.

Napríklad:

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

Pozrime sa na koncept s programom Java a vizualizujme si skutočnú štruktúru pamäte JVM:

Nižšie je uvedená implementácia vyššie uvedeného prístupu:

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);  } }>

Výkon
TAT TAT TAT TAT>
String Pool v Jave

String Pool v Jave

Poznámka: Všetky objekty v Jave sú uložené v halde. Referenčná premenná je na objekt uložený v oblasti zásobníka alebo môže byť obsiahnutá v iných objektoch, čo ich tiež umiestni do oblasti haldy.

Príklad 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);  } }>

Výkon
GFG FG>

Príklad 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);  } }>

Výkon
Gfg Gfg>

často kladené otázky

1. Čo sú reťazce v Jave?

Reťazce sú typy objektov, ktoré môžu ukladať znaky ako prvky.

2. Prečo sú reťazcové objekty v Jave nemenné?

Pretože java používa koncept reťazcového literálu. Predpokladajme, že existuje 5 referenčných premenných, pričom všetky sa vzťahujú na jeden objekt Sachin. Ak jedna referenčná premenná zmení hodnotu objektu, bude ovplyvnená všetkými referenčnými premennými. Preto sú reťazcové objekty v Jave nemenné.

3. Prečo Java používa koncept reťazcového literálu?

Aby Java bola efektívnejšia s pamäťou (pretože sa nevytvárajú žiadne nové objekty, ak už existujú v oblasti konštantných reťazcov).