logo

Řetězce v Javě

V daném příkladu bude vytvořen pouze jeden objekt. Za prvé JVM nenajde žádný objekt typu string s hodnotou Welcome ve fondu konstant string, takže vytvoří nový objekt. Poté najde řetězec s hodnotou Welcome ve fondu, nevytvoří nový objekt, ale vrátí odkaz na stejnou instanci. V tomto článku se seznámíme s Java Strings.

Co jsou řetězce v Javě?

Řetězce jsou typem objektů, které mohou ukládat znak hodnot a v Javě je každý znak uložen v 16 bitech, tj. pomocí 16bitového kódování UTF. Řetězec funguje stejně jako pole znaků v Javě.



Příklad:

String name = 'Geeks';>
Příklad řetězce v Javě

Příklad řetězce v Javě

Níže je uveden příklad řetězce v Javě:



metoda tostring
Jáva
// 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ýstup
example>

Způsoby vytvoření řetězce

Existují dva způsoby, jak vytvořit řetězec v Javě:

  • String Literal
  • Použití nového klíčového slova

Syntax:

 = '';>

1. Řetězcový literál

Aby Java byla efektivnější z hlediska paměti (protože se nevytvářejí žádné nové objekty, pokud již existují ve fondu konstant řetězců).



Příklad:

String demoString = techcodeview.com;>

2. Použití nového klíčového slova

  • String s = new String(Vítejte);
  • V takovém případě JVM vytvoří nový objekt typu řetězec v normální paměti haldy (bez fondu) a doslovné Vítání bude umístěno do fondu konstant řetězců. Proměnná s bude odkazovat na objekt v haldě (non-pool)

Příklad:

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

Rozhraní a třídy v řetězcích v Javě

CharBuffer : Tato třída implementuje rozhraní CharSequence. Tato třída se používá k umožnění použití znakových vyrovnávacích pamětí namísto CharSequences. Příkladem takového použití je balíček s regulárními výrazy java.util.regex.

Tětiva : Je to posloupnost znaků. V Javě jsou objekty String neměnné, což znamená konstantu a nelze je po vytvoření změnit.

Rozhraní CharSequence

CharSequence Interface se používá pro reprezentaci sekvence znaků v Javě.
Třídy, které jsou implementovány pomocí rozhraní CharSequence, jsou uvedeny níže a poskytují mnoho funkcí, jako je podřetězec, poslední výskyt, první výskyt, zřetězení, toupper, tolower atd.

  1. Tětiva
  2. StringBuffer
  3. StringBuilder

1. Řetězec

String je neměnná třída, což znamená konstantu a nelze ji po vytvoření změnit, a pokud ji chceme změnit, musíme vytvořit nový objekt a dokonce i funkce, které poskytuje, jako toupper, tolower atd., všechny tyto vrátí nový objekt, který se nemění původní objekt. Automaticky je bezpečný pro vlákna.

mysql se nerovná

Syntax

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

2. StringBuffer

StringBuffer je vrstevnická třída Tětiva , je svou povahou proměnlivá a je to třída bezpečná pro vlákna, můžeme ji použít, když máme vícevláknové prostředí a sdílený objekt vyrovnávací paměti řetězců, tj. používá jej více vláken. Vzhledem k tomu, že je bezpečný pro vlákna, je zde navíc režie, takže se používá hlavně pro vícevláknové programy.

Syntax:

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

3. StringBuilder

StringBuilder v Javě představuje alternativu k třídě String a StringBuffer, protože vytváří proměnlivou sekvenci znaků a není bezpečná pro vlákna. Používá se pouze v rámci vlákna, takže nevzniká žádná další režie, takže se používá hlavně pro program s jedním vláknem.

Syntax:

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

StringTokenizer

StringTokenizer třída v Javě se používá k rozdělení řetězce na tokeny.

Příklad:

String Tokenizer v Javě

Objekt StringTokenizer interně udržuje aktuální pozici v řetězci, který má být tokenizován. Některé operace posouvají tuto aktuální pozici za zpracované znaky. Token je vrácen převzetím podřetězce řetězce, který byl použit k vytvoření objektu StringTokenizer.

StringJoiner je třída v java.util balíček, který se používá k vytvoření sekvence znaků (řetězců) oddělených oddělovačem a volitelně počínaje dodanou předponou a končící dodanou příponou. I když to lze provést také pomocí třídy StringBuilder pro připojení oddělovače za každý řetězec, StringJoiner poskytuje snadný způsob, jak toho dosáhnout, aniž byste museli psát mnoho kódu.

Syntax:

public StringJoiner(CharSequence delimiter)>

Výše jsme viděli, že můžeme vytvořit řetězec pomocí String Literal.

String demoString =Vítejte;

Zde JVM zkontroluje String Constant Pool. Pokud řetězec neexistuje, vytvoří se nová instance řetězce a umístí se do fondu. Pokud řetězec existuje, nevytvoří nový objekt. Místo toho vrátí odkaz na stejnou instanci. Mezipaměť, která ukládá tyto instance řetězců, je známá jako fond konstant řetězců nebo fond řetězců. V dřívějších verzích Javy až do JDK 6 String pool byl umístěn v prostoru PermGen (Permanent Generation). Ale v JDK 7 je přesunuta do oblasti hlavní haldy.

Neměnný řetězec v Javě

V Javě jsou řetězcové objekty neměnné. Immutable jednoduše znamená nemodifikovatelný nebo neměnný. Jakmile je objekt typu string vytvořen, nelze jeho data nebo stav změnit, ale vytvoří se nový objekt typu string.

podřetězec java

Níže je implementace tématu:

Jáva
// 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ýstup
Sachin>

Zde se Sachin nezmění, ale vytvoří se nový objekt pomocí Sachin Tendulkar. Proto je řetězec známý jako neměnný.

Jak můžete vidět na daném obrázku, jsou vytvořeny dva objekty, ale referenční proměnná stále odkazuje na Sachin a nikoli na Sachin Tendulkar. Ale pokud ji explicitně přiřadíme k referenční proměnné, bude odkazovat na objekt Sachin Tendulkar.

mini panel nástrojů excel

Například:

Jáva
// 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ýstup
Sachin Tendulkar>

Přidělení paměti řetězce

Kdykoli je objekt typu String vytvořen jako literál, bude tento objekt vytvořen ve fondu konstant String. To umožňuje JVM optimalizovat inicializaci řetězcového literálu.

Příklad:

String demoString = 'Geeks';>

Řetězec lze také deklarovat pomocí a Nový operátor, tj. dynamicky přidělované. V případě, že jsou String dynamicky alokovány, je jim přiděleno nové paměťové místo v haldě. Tento řetězec nebude přidán do fondu konstant String.

Příklad:

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

Pokud chcete tento řetězec uložit do konstantního fondu, budete jej muset vložit.

Příklad:

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

Dává se přednost použití řetězcových literálů, protože umožňuje JVM optimalizovat alokaci paměti.

Příklad, který ukazuje, jak deklarovat řetězec

Jáva
// 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ýstup
String name = techcodeview.com String newString = techcodeview.com>


Poznámka: String Object je vytvořen v oblasti haldy a literály jsou uloženy ve speciální paměťové oblasti známé jako řetězec konstant.

Proč se fond String přesunul z PermGen na a normální oblast haldy?

Prostor PermGen je omezený, výchozí velikost je pouhých 64 MB. byl to problém s vytvářením a ukládáním příliš mnoha řetězcových objektů v prostoru PermGen. Proto byl bazén String přesunut do větší haldy. Aby Java byla efektivnější z hlediska paměti, používá se koncept řetězcového literálu. Pomocí klíčového slova „new“ vytvoří JVM nový objekt řetězce v oblasti normální haldy, i když je stejný objekt řetězce přítomen ve fondu řetězců.

Například:

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

Pojďme se podívat na koncept s Java programem a vizualizovat skutečnou strukturu paměti JVM:

Níže je uvedena implementace výše uvedeného přístupu:

Jáva
// 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ýstup
TAT TAT TAT TAT>
String Pool v Javě

String Pool v Javě

Poznámka: Všechny objekty v Javě jsou uloženy na hromadě. Referenční proměnná je pro objekt uložený v oblasti zásobníku nebo může být obsažena v jiných objektech, což je také umístí do oblasti haldy.

řetězec v metodách Java

Příklad 1:

Jáva
// 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ýstup
GFG FG>

Příklad 2:

Jáva
// 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ýstup
Gfg Gfg>

Často kladené otázky

1. Co jsou řetězce v Javě?

Řetězce jsou typy objektů, které mohou ukládat znaky jako prvky.

2. Proč jsou řetězcové objekty v Javě neměnné?

Protože java používá koncept řetězcového literálu. Předpokládejme, že existuje 5 referenčních proměnných, všechny odkazují na jeden objekt Sachin. Pokud jedna referenční proměnná změní hodnotu objektu, bude ovlivněna všemi referenčními proměnnými. To je důvod, proč jsou řetězcové objekty v Javě neměnné.

3. Proč Java používá koncept řetězcového literálu?

Aby Java byla efektivnější z hlediska paměti (protože se nevytvářejí žádné nové objekty, pokud již existují ve fondu konstant řetězců).