En el ejemplo dado, solo se creará un objeto. En primer lugar, JVM no encontrará ningún objeto de cadena con el valor Bienvenido en el grupo constante de cadenas, por lo que creará un nuevo objeto. Después de eso, encontrará la cadena con el valor Bienvenido en el grupo, no creará un nuevo objeto pero devolverá la referencia a la misma instancia. En este artículo, aprenderemos sobre las cadenas de Java.
¿Qué son las cadenas en Java?
Las cadenas son el tipo de objetos que pueden almacenar el carácter de los valores y en Java, cada carácter se almacena en 16 bits, es decir, utilizando codificación UTF de 16 bits. Una cadena actúa igual que una matriz de caracteres en Java.
colecciones java java
Ejemplo:
String name = 'Geeks';>

Ejemplo de cadena en Java
A continuación se muestra un ejemplo de una cadena en 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); } }> Producción
example>
Formas de crear una cadena
Hay dos formas de crear una cadena en Java:
- Literal de cadena
- Usando nueva palabra clave
Sintaxis:
= '';>
1. Literal de cadena
Para hacer que Java sea más eficiente en memoria (porque no se crean nuevos objetos si ya existe en el grupo de constantes de cadena).
Ejemplo:
String demoString = techcodeview.com;>
2. Usar una nueva palabra clave
- Cadena s = nueva cadena (Bienvenido);
- En tal caso, JVM creará un nuevo objeto de cadena en la memoria del montón normal (sin grupo) y la Bienvenida literal se colocará en el grupo constante de cadenas. La variable s se referirá al objeto en el montón (no grupo)
Ejemplo:
String demoString = new String (techcodeview.com);>
Interfaces y clases en cadenas en Java
CharBuffer : Esta clase implementa la interfaz CharSequence. Esta clase se utiliza para permitir el uso de buffers de caracteres en lugar de CharSequences. Un ejemplo de este uso es el paquete de expresiones regulares java.util.regex.
Cadena : Es una secuencia de caracteres. En Java, los objetos de String son inmutables, lo que significa que son constantes y no se pueden cambiar una vez creados.
Interfaz de secuencia de caracteres
La interfaz CharSequence se utiliza para representar la secuencia de caracteres en Java.
Las clases que se implementan utilizando la interfaz CharSequence se mencionan a continuación y proporcionan gran parte de la funcionalidad como subcadena, última aparición, primera aparición, concatenar, toupper, tolower, etc.
- Cadena
- búfer de cadena
- Constructor de cadenas
1. cuerda
String es una clase inmutable, lo que significa una constante y no se puede cambiar una vez creada y si deseamos cambiar, necesitamos crear un nuevo objeto e incluso la funcionalidad que proporciona como toupper, tolower, etc., todo esto devuelve un nuevo objeto, no se modifica. el objeto original. Es automáticamente seguro para subprocesos.
Sintaxis
String str= 'geeks'; or String str= new String('geeks')>2. búfer de cadena
búfer de cadena es una clase de pares de Cadena , es de naturaleza mutable y es una clase segura para subprocesos, podemos usarlo cuando tenemos un entorno de subprocesos múltiples y un objeto compartido de búfer de cadena, es decir, utilizado por múltiples subprocesos. Como es seguro para subprocesos, hay una sobrecarga adicional, por lo que se utiliza principalmente para programas multiproceso.
Sintaxis:
StringBuffer demoString = new StringBuffer('techcodeview.com');>3. Constructor de cadenas
Constructor de cadenas en Java representa una alternativa a las clases String y StringBuffer, ya que crea una secuencia mutable de caracteres y no es segura para subprocesos. Se usa solo dentro del subproceso, por lo que no hay gastos generales adicionales, por lo que se usa principalmente para programas de un solo subproceso.
Sintaxis:
StringBuilder demoString = new StringBuilder(); demoString.append('GFG');>Tokenizador de cadena
Tokenizador de cadena La clase en Java se usa para dividir una cadena en tokens.
Ejemplo:

Un objeto StringTokenizer mantiene internamente una posición actual dentro de la cadena que se va a tokenizar. Algunas operaciones avanzan esta posición actual más allá de los caracteres procesados. Se devuelve un token tomando una subcadena de la cadena que se usó para crear el objeto StringTokenizer.
Carpintero de cuerdas es una clase en java.util paquete que se utiliza para construir una secuencia de caracteres (cadenas) separados por un delimitador y, opcionalmente, comenzando con un prefijo proporcionado y terminando con un sufijo proporcionado. Aunque esto también se puede hacer con la ayuda de la clase StringBuilder para agregar un delimitador después de cada cadena, StringJoiner proporciona una manera fácil de hacerlo sin mucho código que escribir.
Sintaxis:
public StringJoiner(CharSequence delimiter)>
Arriba vimos que podemos crear una cadena mediante String Literal.
Cadena demoCadena =Bienvenido;
Aquí la JVM comprueba el grupo de constantes de cadenas. Si la cadena no existe, se crea una nueva instancia de cadena y se coloca en un grupo. Si la cadena existe, no creará un nuevo objeto. Más bien, devolverá la referencia a la misma instancia. El caché que almacena estas instancias de cadenas se conoce como grupo de constantes de cadenas o grupo de cadenas. En versiones anteriores de Java hasta JDK 6, el grupo de cadenas estaba ubicado dentro del espacio PermGen (generación permanente). Pero en JDK 7 se mueve al área del montón principal.
Cadena inmutable en Java
En Java, los objetos de cadena son inmutables. Inmutable simplemente significa inmodificable o inmutable. Una vez que se crea un objeto de cadena, sus datos o estado no se pueden cambiar, pero se crea un nuevo objeto de cadena.
A continuación se muestra la implementación del tema:
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); } }> Producción
Sachin>
Aquí Sachin no se cambia pero se crea un nuevo objeto con Sachin Tendulkar. Por eso una cadena se conoce como inmutable.
Como puede ver en la figura dada, se crean dos objetos, pero la variable de referencia aún se refiere a Sachin y no a Sachin Tendulkar. Pero si lo asignamos explícitamente a la variable de referencia, se referirá al objeto Sachin Tendulkar.
Por ejemplo:
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); } }> Producción
Sachin Tendulkar>
Asignación de memoria de cadena
Siempre que se crea un objeto String como literal, el objeto se creará en el grupo constante de String. Esto permite a JVM optimizar la inicialización del literal de cadena.
Ejemplo:
String demoString = 'Geeks';>
La cadena también se puede declarar usando un nuevo operador, es decir, asignado dinámicamente. En el caso de que las cadenas se asignen dinámicamente, se les asigna una nueva ubicación de memoria en el montón. Esta cadena no se agregará al grupo de constantes de cadenas.
Ejemplo:
String demoString = new String('Geeks');>Si desea almacenar esta cadena en el grupo constante, deberá internarla.
Ejemplo:
String internedString = demoString.intern(); // this will add the string to string constant pool.>
Se prefiere utilizar literales de cadena, ya que permite a JVM optimizar la asignación de memoria.
Un ejemplo que muestra cómo declarar una cadena.
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); } }> Producción
String name = techcodeview.com String newString = techcodeview.com>
Nota: El objeto de cadena se crea en el área del montón y los literales se almacenan en un área de memoria especial conocida como grupo constante de cadenas.
¿Por qué el grupo String pasó de PermGen a el área de montón normal?
El espacio de PermGen es limitado, el tamaño predeterminado es sólo 64 MB. fue un problema al crear y almacenar demasiados objetos de cadena en el espacio PermGen. Es por eso que el grupo de cadenas se trasladó a un área de almacenamiento dinámico más grande. Para hacer que Java sea más eficiente en cuanto a memoria, se utiliza el concepto de literal de cadena. Mediante el uso de la palabra clave 'nueva', la JVM creará un nuevo objeto de cadena en el área del montón normal incluso si el mismo objeto de cadena está presente en el grupo de cadenas.
Por ejemplo:
String demoString = new String('Bhubaneswar');>Echemos un vistazo al concepto con un programa Java y visualicemos la estructura de memoria JVM real:
A continuación se muestra la implementación del enfoque anterior:
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); } }> Producción
TAT TAT TAT TAT>

Grupo de cadenas en Java
Nota: Todos los objetos en Java se almacenan en un montón. La variable de referencia es el objeto almacenado en el área de la pila o puede estar contenida en otros objetos, lo que también los coloca en el área del montón.
Ejemplo 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); } }> Producción
GFG FG>
Ejemplo 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); } }> Producción
Gfg Gfg>
Preguntas frecuentes
1. ¿Qué son las cadenas en Java?
Las cadenas son los tipos de objetos que pueden almacenar caracteres como elementos.
2. ¿Por qué los objetos de cadena son inmutables en Java?
Porque Java usa el concepto de cadena literal. Supongamos que hay 5 variables de referencia, todas se refieren a un objeto Sachin. Si una variable de referencia cambia el valor del objeto, se verá afectado por todas las variables de referencia. Por eso los objetos de cadena son inmutables en Java.
3. ¿Por qué Java utiliza el concepto de cadena literal?
Para hacer que Java sea más eficiente en memoria (porque no se crean nuevos objetos si ya existe en el grupo de constantes de cadena).