У наведеному прикладі буде створено лише один об'єкт. По-перше, JVM не знайде жодного рядкового об’єкта зі значенням Welcome в пулі рядкових констант, тому буде створено новий об’єкт. Після цього він знайде рядок із значенням Welcome в пулі, він не створить новий об’єкт, але поверне посилання на той самий екземпляр. У цій статті ми дізнаємося про рядки Java.
Що таке рядки в Java?
Рядки — це тип об’єктів, які можуть зберігати символи значень, і в Java кожен символ зберігається в 16 бітах, тобто з використанням 16-бітного кодування UTF. Рядок діє так само, як масив символів у Java.
приклад:
String name = 'Geeks';>

Приклад рядка в Java
Нижче наведено приклад рядка в 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); } }> Вихід
example>
Способи створення рядка
Існує два способи створення рядка в Java:
- Рядковий літерал
- Використання нового ключового слова
Синтаксис:
= '';>
1. Рядковий літерал
Щоб зробити Java більш ефективною пам’яттю (оскільки нові об’єкти не створюються, якщо вони вже існують у пулі констант рядків).
100 км/год до миль/год
приклад:
String demoString = techcodeview.com;>
2. Використання нового ключового слова
- Рядок s = новий рядок (вітаємо);
- У такому випадку JVM створить новий рядковий об’єкт у звичайній (не пуловій) купі пам’яті, а літерал Welcome буде розміщено в пулі рядкових констант. Змінна s посилатиметься на об’єкт у купі (не пул)
приклад:
String demoString = new String (techcodeview.com);>
Інтерфейси та класи в рядках у Java
CharBuffer : Цей клас реалізує інтерфейс CharSequence. Цей клас використовується, щоб дозволити використовувати символьні буфери замість CharSequences. Прикладом такого використання є пакет регулярних виразів java.util.regex.
Рядок : це послідовність символів. У Java об’єкти String є незмінними, що означає константу, і їх неможливо змінити після створення.
Інтерфейс CharSequence
Інтерфейс CharSequence використовується для представлення послідовності символів у Java.
Класи, реалізовані за допомогою інтерфейсу CharSequence, згадані нижче, і вони забезпечують велику кількість функціональних можливостей, таких як підрядок, останнє повторення, перше входження, конкатенація, toupper, tolower тощо.
- Рядок
- StringBuffer
- StringBuilder
1. Рядок
Рядок — це незмінний клас, який означає константу, і його не можна змінити після створення. Якщо ми хочемо змінити, нам потрібно створити новий об’єкт і навіть функції, які він надає, як-от toupper, tolower тощо, усі вони повертають новий об’єкт, його не змінюють. оригінальний об'єкт. Це автоматично потокобезпечно.
Синтаксис
String str= 'geeks'; or String str= new String('geeks')>2. StringBuffer
StringBuffer є рівним класом Рядок , він змінний за своєю природою і є потокобезпечним класом, ми можемо використовувати його, коли у нас є багатопотокове середовище та спільний об’єкт рядкового буфера, тобто використовується кількома потоками. Оскільки він є потоково безпечним, тому є додаткові витрати, тому він в основному використовується для багатопоточних програм.
Синтаксис:
StringBuffer demoString = new StringBuffer('techcodeview.com');>3. StringBuilder
StringBuilder у Java представляє альтернативу String і StringBuffer Class, оскільки створює змінну послідовність символів і не є потоково безпечним. Він використовується лише в межах потоку, тому немає додаткових витрат, тому він в основному використовується для однопотокової програми.
Синтаксис:
StringBuilder demoString = new StringBuilder(); demoString.append('GFG');>StringTokenizer
StringTokenizer клас у Java використовується для розбиття рядка на токени.
приклад:

Об’єкт StringTokenizer внутрішньо підтримує поточну позицію в рядку, який потрібно токенізувати. Деякі операції просувають цю поточну позицію за оброблені символи. Маркер повертається шляхом взяття підрядка рядка, який використовувався для створення об’єкта StringTokenizer.
StringJoiner це клас в java.util пакет, який використовується для побудови послідовності символів (рядків), розділених роздільником і необов’язково починаючи з наданого префікса та закінчуючи наданим суфіксом. Хоча це також можна зробити за допомогою класу StringBuilder, щоб додати роздільник після кожного рядка, StringJoiner надає простий спосіб зробити це без зайвого написання коду.
Синтаксис:
дата машинопису
public StringJoiner(CharSequence delimiter)>
Вище ми побачили, що ми можемо створити рядок за допомогою String Literal.
String demoString =Ласкаво просимо;
Тут JVM перевіряє пул констант рядків. Якщо рядка не існує, створюється новий екземпляр рядка, який поміщається в пул. Якщо рядок існує, він не створить новий об’єкт. Навпаки, він поверне посилання на той самий екземпляр. Кеш, який зберігає ці екземпляри рядків, відомий як пул постійних рядків або пул рядків. У попередніх версіях Java до JDK 6 пул рядків розташовувався всередині простору PermGen (Permanent Generation). Але в JDK 7 він переміщений до основної області купи.
Незмінний рядок у Java
У Java рядкові об’єкти є незмінними. Незмінний просто означає незмінний або незмінний. Після створення рядкового об’єкта його дані або стан не можна змінити, але створюється новий рядковий об’єкт.
Нижче представлена реалізація теми:
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); } }> Вихід
Sachin>
Тут Sachin не змінюється, але створюється новий об’єкт із Sachin Tendulkar. Ось чому рядок відомий як незмінний.
Як ви можете бачити на наведеному малюнку, створено два об’єкти, але посилальна змінна все ще посилається на Sachin, а не на Sachin Tendulkar. Але якщо ми явно призначимо його до посилальної змінної, він посилатиметься на об’єкт Sachin Tendulkar.
Наприклад:
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); } }> Вихід
Sachin Tendulkar>
Розподіл пам'яті рядка
Кожного разу, коли об’єкт String створюється як літерал, об’єкт буде створено в пулі констант String. Це дозволяє JVM оптимізувати ініціалізацію літералу String.
приклад:
String demoString = 'Geeks';>
Рядок також можна оголосити за допомогою a новий оператор, тобто динамічно розподілений. Якщо String динамічно розподіляється, їм призначається нове місце пам’яті в купі. Цей рядок не буде додано до пулу констант String.
приклад:
String demoString = new String('Geeks');>Якщо ви хочете зберегти цей рядок у постійному пулі, вам потрібно буде інтернувати його.
приклад:
String internedString = demoString.intern(); // this will add the string to string constant pool.>
Бажано використовувати рядкові літерали, оскільки це дозволяє JVM оптимізувати розподіл пам’яті.
види мережі
Приклад, який показує, як оголосити рядок
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); } }> Вихід
String name = techcodeview.com String newString = techcodeview.com>
Примітка: Рядковий об’єкт створюється в області купи, а літерали зберігаються в спеціальній області пам’яті, відомої як пул рядкових констант.
Чому пул String переміщено з PermGen на в нормальна площа купи?
Обсяг PermGen обмежений, розмір за замовчуванням становить лише 64 МБ. це була проблема зі створенням і зберіганням занадто великої кількості рядкових об’єктів у просторі PermGen. Ось чому пул String було перенесено до більшої області купи. Щоб зробити Java більш ефективною пам'яттю, використовується концепція рядкового літералу. Використовуючи ключове слово new, JVM створить новий рядковий об’єкт у звичайній області купи, навіть якщо той самий рядковий об’єкт присутній у пулі рядків.
Наприклад:
String demoString = new String('Bhubaneswar');>Давайте подивимося на концепцію з програмою на Java та візуалізуємо фактичну структуру пам’яті JVM:
Нижче наведено реалізацію вищезазначеного підходу:
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); } }> Вихід
TAT TAT TAT TAT>

Пул рядків у Java
Примітка: Усі об’єкти в Java зберігаються у купі. Змінна посилання на об’єкт, що зберігається в області стеку, або вони можуть міститися в інших об’єктах, що також поміщає їх у область купи.
Приклад 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); } }> Вихід
GFG FG>
приклад 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); } }> Вихід
Gfg Gfg>
Питання що часто задаються
1. Що таке рядки в Java?
Рядки — це типи об’єктів, які можуть зберігати символи як елементи.
2. Чому рядкові об’єкти незмінні в Java?
Оскільки Java використовує концепцію рядкового літералу. Припустимо, що є 5 посилальних змінних, усі посилаються на один об’єкт Sachin. Якщо одна довідкова змінна змінює значення об’єкта, на неї вплинуть усі довідкові змінні. Ось чому рядкові об’єкти незмінні в Java.
3. Чому Java використовує концепцію рядкового літералу?
Щоб зробити Java більш ефективною пам’яттю (оскільки нові об’єкти не створюються, якщо вони вже існують у пулі констант рядків).