logo

Strenge i Java

I det givne eksempel vil der kun blive oprettet ét objekt. For det første vil JVM ikke finde noget strengobjekt med værdien Welcome i strengkonstantpuljen, så det vil oprette et nyt objekt. Derefter vil den finde strengen med værdien Velkommen i puljen, den vil ikke oprette et nyt objekt, men returnere referencen til den samme instans. I denne artikel lærer vi om Java Strings.

Hvad er strenge i Java?

Strenge er den type objekter, der kan gemme karakteren af ​​værdier, og i Java lagres hvert tegn i 16 bit, dvs. ved hjælp af UTF 16-bit-kodning. En streng fungerer på samme måde som en række tegn i Java.



Eksempel:

String name = 'Geeks';>
Strengeksempel i Java

Strengeksempel i Java

Nedenfor er et eksempel på en streng i 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);  } }>

Produktion
example>

Måder at skabe en streng på

Der er to måder at oprette en streng i Java:

  • Streng bogstavelig
  • Brug af nyt søgeord

Syntaks:

 = '';>

1. Streng bogstavelig

For at gøre Java mere hukommelseseffektiv (fordi der ikke oprettes nye objekter, hvis det allerede findes i strengkonstantpuljen).



Eksempel:

String demoString = techcodeview.com;>

2. Brug af nyt søgeord

  • String s = new String(Velkommen);
  • I et sådant tilfælde vil JVM oprette et nyt strengobjekt i normal (ikke-pool) heap-hukommelse, og den bogstavelige Welcome vil blive placeret i strengkonstantpuljen. Variablen s vil referere til objektet i heapen (ikke-puljen)

Eksempel:

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

Grænseflader og klasser i strenge i Java

CharBuffer : Denne klasse implementerer CharSequence-grænsefladen. Denne klasse bruges til at tillade, at tegnbuffere bruges i stedet for CharSequences. Et eksempel på sådan brug er pakken med regulært udtryk java.util.regex.

Snor : Det er en sekvens af tegn. I Java er objekter af String uforanderlige, hvilket betyder en konstant og kan ikke ændres, når de først er oprettet.

CharSequence Interface

CharSequence Interface bruges til at repræsentere sekvensen af ​​tegn i Java.
Klasser, der er implementeret ved hjælp af CharSequence-grænsefladen, er nævnt nedenfor, og disse giver meget af funktionalitet som understreng, lastoccurence, første forekomst, concatenate, top, tolower osv.

  1. Snor
  2. StringBuffer
  3. StringBuilder

1. Snor

String er en uforanderlig klasse, hvilket betyder en konstant og kan ikke ændres, når den først er oprettet, og hvis vi ønsker at ændre, er vi nødt til at oprette et nyt objekt og endda den funktionalitet, det giver som toupper, tolower, osv. alle disse returnerer et nyt objekt, det ændrer ikke den oprindelige genstand. Den er automatisk trådsikker.

Syntaks

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

2. StringBuffer

StringBuffer er en jævnaldrende klasse af Snor , det er mutable i naturen, og det er trådsikker klasse, vi kan bruge det, når vi har multi-threaded miljø og delt objekt af strengbuffer, dvs. brugt af multiple tråde. Da den er trådsikker, så der er ekstra overhead, så den bruges hovedsageligt til flertrådede programmer.

Syntaks:

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

3. StringBuilder

StringBuilder i Java repræsenterer et alternativ til String og StringBuffer Class, da den skaber en foranderlig sekvens af tegn, og den er ikke trådsikker. Det bruges kun inden for gevindet, så der er ingen ekstra overhead, så det bruges hovedsageligt til program med enkelt gevind.

Syntaks:

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

StringTokenizer

StringTokenizer klasse i Java bruges til at opdele en streng i tokens.

Eksempel:

String Tokenizer i Java

Et StringTokenizer-objekt bevarer internt en aktuel position i den streng, der skal tokeniseres. Nogle operationer flytter denne aktuelle position forbi de behandlede tegn. Et token returneres ved at tage en understreng af strengen, der blev brugt til at oprette StringTokenizer-objektet.

StringJoiner er en klasse i java.util pakke, som bruges til at konstruere en sekvens af tegn(strenge) adskilt af et afgrænsningstegn og eventuelt starter med et angivet præfiks og slutter med et medfølgende suffiks. Selvom dette også kan gøres ved hjælp af StringBuilder-klassen for at tilføje et skilletegn efter hver streng, giver StringJoiner en nem måde at gøre det på uden meget kode at skrive.

Syntaks:

public StringJoiner(CharSequence delimiter)>

Ovenfor så vi, at vi kan oprette en streng ved String Literal.

hvor mange uger er der på en måned

String demoString =Velkommen;

Her tjekker JVM String Constant Pool. Hvis strengen ikke eksisterer, oprettes en ny strenginstans og placeres i en pulje. Hvis strengen eksisterer, vil den ikke oprette et nyt objekt. Det vil snarere returnere referencen til den samme instans. Cachen, der gemmer disse strengforekomster, er kendt som String Constant pool eller String Pool. I tidligere versioner af Java var op til JDK 6 String pool placeret i PermGen (Permanent Generation) plads. Men i JDK 7 flyttes den til hovedbunkeområdet.

Uforanderlig streng i Java

I Java er strengobjekter uforanderlige. Uforanderlig betyder simpelthen uforanderlig eller uforanderlig. Når et strengobjekt er oprettet, kan dets data eller tilstand ikke ændres, men et nyt strengobjekt oprettes.

Nedenfor er implementeringen af ​​emnet:

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

Produktion
Sachin>

Her er Sachin ikke ændret, men et nyt objekt er skabt med Sachin Tendulkar. Det er derfor, en streng er kendt som uforanderlig.

Som du kan se i den givne figur, er der oprettet to objekter, men referencevariablen refererer stadig til Sachin og ikke til Sachin Tendulkar. Men hvis vi eksplicit tildeler den til referencevariablen, vil den referere til Sachin Tendulkar-objektet.

For eksempel:

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

Produktion
Sachin Tendulkar>

Hukommelsestildeling af streng

Når et strengobjekt oprettes som et bogstav, vil objektet blive oprettet i strengkonstantpuljen. Dette giver JVM mulighed for at optimere initialiseringen af ​​String literal.

Eksempel:

String demoString = 'Geeks';>

Strengen kan også erklæres ved hjælp af en ny operatør, dvs. dynamisk allokeret. I tilfælde af at String er dynamisk allokeret, tildeles de en ny hukommelsesplacering i heapen. Denne streng vil ikke blive tilføjet til strengkonstantpuljen.

supw

Eksempel:

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

Hvis du vil gemme denne streng i den konstante pool, bliver du nødt til at internere den.

Eksempel:

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

Det foretrækkes at bruge String literals, da det giver JVM mulighed for at optimere hukommelsesallokering.

Et eksempel, der viser, hvordan man erklærer en streng

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

Produktion
String name = techcodeview.com String newString = techcodeview.com>


Bemærk: Strengobjekt oprettes i Heap-området, og bogstaver gemmes i et særligt hukommelsesområde kendt som strengkonstantpulje.

Hvorfor flyttede String-puljen fra PermGen til det normalt bunkeområde?

PermGen-pladsen er begrænset, standardstørrelsen er kun 64 MB. det var et problem med at oprette og gemme for mange strengobjekter i PermGen-rummet. Derfor blev String-bassinet flyttet til et større dyngeområde. For at gøre Java mere hukommelseseffektiv bruges begrebet string literal. Ved at bruge det 'nye' nøgleord vil JVM oprette et nyt strengobjekt i det normale heap-område, selvom det samme strengobjekt er til stede i strengpuljen.

For eksempel:

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

Lad os se på konceptet med et Java-program og visualisere den faktiske JVM-hukommelsesstruktur:

Nedenfor er implementeringen af ​​ovenstående tilgang:

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

Produktion
TAT TAT TAT TAT>
String Pool i Java

String Pool i Java

Bemærk: Alle objekter i Java er gemt i en heap. Referencevariablen er til objektet, der er gemt i stakområdet, eller de kan være indeholdt i andre objekter, hvilket også placerer dem i heap-området.

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

Produktion
GFG FG>

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

Produktion
Gfg Gfg>

Ofte stillede spørgsmål

1. Hvad er strenge i Java?

Strenge er de typer objekter, der kan gemme tegn som elementer.

2. Hvorfor strengobjekter er uforanderlige i Java?

Fordi java bruger begrebet streng bogstavelig. Antag, at der er 5 referencevariable, alle refererer til ét objekt Sachin. Hvis en referencevariabel ændrer værdien af ​​objektet, vil den blive påvirket af alle referencevariablerne. Det er grunden til, at strengobjekter er uforanderlige i Java.

3. Hvorfor Java bruger begrebet streng bogstavelig?

For at gøre Java mere hukommelseseffektiv (fordi der ikke oprettes nye objekter, hvis det allerede findes i strengkonstantpuljen).