logo

자바의 문자열

주어진 예에서는 하나의 객체만 생성됩니다. 먼저 JVM은 문자열 상수 풀에서 Welcome 값을 가진 문자열 개체를 찾지 못하므로 새 개체를 만듭니다. 그런 다음 풀에서 Welcome 값이 있는 문자열을 찾고 새 개체를 생성하지 않지만 동일한 인스턴스에 대한 참조를 반환합니다. 이번 포스팅에서는 자바 문자열에 대해 알아보겠습니다.

Java의 문자열이란 무엇입니까?

문자열은 값의 문자를 저장할 수 있는 객체 유형이며 Java에서는 모든 문자가 16비트, 즉 UTF 16비트 인코딩을 사용하여 저장됩니다. 문자열은 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의 메모리 효율성을 높이기 위해(문자열 상수 풀에 이미 존재하는 경우 새 객체가 생성되지 않기 때문에)

예:

String demoString = techcodeview.com;>

2. 새 키워드 사용

  • String s = new String(환영합니다);
  • 이러한 경우 JVM은 일반(풀이 아닌) 힙 메모리에 새 문자열 객체를 생성하고 리터럴 Welcome이 문자열 상수 풀에 배치됩니다. 변수 s는 힙(풀이 아닌)의 개체를 참조합니다.

예:

베이스밴드 대 광대역
String demoString = new String (techcodeview.com);>

Java 문자열의 인터페이스 및 클래스

CharBuffer : 이 클래스는 CharSequence 인터페이스를 구현합니다. 이 클래스는 CharSequences 대신 문자 버퍼를 사용할 수 있도록 하는 데 사용됩니다. 이러한 사용법의 예는 정규식 패키지 java.util.regex입니다.

: 일련의 문자입니다. Java에서 String의 객체는 불변입니다. 이는 상수를 의미하며 일단 생성되면 변경할 수 없습니다.

CharSequence 인터페이스

CharSequence 인터페이스는 Java에서 문자 시퀀스를 나타내는 데 사용됩니다.
CharSequence 인터페이스를 사용하여 구현된 클래스는 아래에 언급되어 있으며 이는 하위 문자열, 마지막 발생, 첫 번째 발생, 연결, toupper, tolower 등과 같은 많은 기능을 제공합니다.

  1. 문자열 버퍼
  2. 스트링빌더

1. 문자열

String은 상수를 의미하며 일단 생성되면 변경할 수 없는 불변 클래스입니다. 변경하려면 새 개체를 만들어야 하며 심지어 toupper, tolower 등과 같이 제공되는 기능도 모두 새 개체를 반환하며 수정되지 않습니다. 원래 개체. 자동으로 스레드로부터 안전합니다.

로마 숫자 1 100

통사론

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

2. 스트링버퍼

문자열 버퍼 또래 클래스이다 , 본질적으로 변경 가능하고 스레드 안전 클래스이므로 다중 스레드 환경과 문자열 버퍼의 공유 객체, 즉 다중 스레드에서 사용되는 경우 사용할 수 있습니다. 스레드로부터 안전하므로 추가 오버헤드가 있으므로 주로 멀티스레드 프로그램에 사용됩니다.

통사론:

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

3. 스트링빌더

스트링빌더 Java에서는 변경 가능한 문자 시퀀스를 생성하고 스레드로부터 안전하지 않기 때문에 String 및 StringBuffer 클래스에 대한 대안을 나타냅니다. 스레드 내에서만 사용되므로 추가 오버헤드가 없으므로 주로 싱글 스레드 프로그램에 사용됩니다.

통사론:

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

스트링토크나이저

스트링토크나이저 Java의 클래스는 문자열을 토큰으로 나누는 데 사용됩니다.

예:

Java의 문자열 토크나이저

StringTokenizer 개체는 토큰화할 문자열 내에서 현재 위치를 내부적으로 유지합니다. 일부 작업에서는 처리된 문자를 지나서 이 현재 위치를 앞당깁니다. StringTokenizer 개체를 생성하는 데 사용된 문자열의 하위 문자열을 가져와 토큰을 반환합니다.

스트링조이너 수업이다 ~에 java.util 구분 기호로 구분되고 선택적으로 제공된 접두사로 시작하고 제공된 접미사로 끝나는 일련의 문자(문자열)를 구성하는 데 사용되는 패키지입니다. 각 문자열 뒤에 구분 기호를 추가하는 StringBuilder 클래스를 사용하여 이 작업을 수행할 수도 있지만 StringJoiner는 많은 코드를 작성하지 않고도 이를 수행할 수 있는 쉬운 방법을 제공합니다.

통사론:

public StringJoiner(CharSequence delimiter)>

위에서 우리는 String Literal로 문자열을 생성할 수 있다는 것을 보았습니다.

문자열 데모String =환영합니다;

여기서 JVM은 문자열 상수 풀을 확인합니다. 문자열이 없으면 새 문자열 인스턴스가 생성되어 풀에 배치됩니다. 문자열이 존재하면 새 객체가 생성되지 않습니다. 오히려 동일한 인스턴스에 대한 참조를 반환합니다. 이러한 문자열 인스턴스를 저장하는 캐시를 문자열 상수 풀 또는 문자열 풀이라고 합니다. 이전 버전의 Java에서는 JDK 6까지의 문자열 풀이 PermGen(Permanent Generation) 공간 내에 있었습니다. 그러나 JDK 7에서는 기본 힙 영역으로 이동되었습니다.

Java의 불변 문자열

Java에서 문자열 객체는 변경할 수 없습니다. 불변(Immutable)은 단순히 수정 불가능하거나 변경할 수 없음을 의미합니다. 문자열 개체가 생성되면 해당 데이터나 상태는 변경할 수 없지만 새 문자열 개체가 생성됩니다.

알파벳에 번호를 매기다

다음은 주제의 구현입니다.

자바
// 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를 사용하여 새 객체가 생성되었습니다. 이것이 바로 문자열을 불변(immutable)이라고 부르는 이유입니다.

주어진 그림에서 볼 수 있듯이 두 개의 개체가 생성되었지만 참조 변수는 여전히 Sachin Tendulkar가 아닌 Sachin을 참조합니다. 그러나 이를 참조 변수에 명시적으로 할당하면 Sachin Tendulkar 개체를 참조하게 됩니다.

문자열을 jsonobject 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>

문자열의 메모리 할당

문자열 개체가 리터럴로 생성될 때마다 해당 개체는 문자열 상수 풀에 생성됩니다. 이를 통해 JVM은 문자열 리터럴의 초기화를 최적화할 수 있습니다.

예:

String demoString = 'Geeks';>

문자열은 다음을 사용하여 선언할 수도 있습니다. 새로운 연산자, 즉 동적으로 할당됩니다. 문자열이 동적으로 할당되는 경우 힙에 새 메모리 위치가 할당됩니다. 이 문자열은 문자열 상수 풀에 추가되지 않습니다.

예:

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

이 문자열을 상수 풀에 저장하려면 해당 문자열을 인턴해야 합니다.

예:

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

JVM이 메모리 할당을 최적화할 수 있도록 문자열 리터럴을 사용하는 것이 좋습니다.

문자열을 선언하는 방법을 보여주는 예

자바
// 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>


메모: 문자열 개체는 힙 영역에 생성되고 리터럴은 문자열 상수 풀이라는 특수 메모리 영역에 저장됩니다.

문자열 풀이 PermGen에서 PermGen으로 이동한 이유는 무엇입니까? 그만큼 정상적인 힙 영역?

PermGen 공간은 제한되어 있으며 기본 크기는 64MB에 불과합니다. PermGen 공간에 너무 많은 문자열 객체를 생성하고 저장하는 데 문제가 있었습니다. 이것이 문자열 풀이 더 큰 힙 영역으로 이동된 이유입니다. Java의 메모리 효율성을 높이기 위해 문자열 리터럴 개념이 사용됩니다. 'new' 키워드를 사용하면 JVM은 문자열 풀에 동일한 문자열 개체가 있더라도 일반 힙 영역에 새 문자열 개체를 생성합니다.

호스트 리눅스

예를 들어:

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

Java 프로그램으로 개념을 살펴보고 실제 JVM 메모리 구조를 시각화해 보겠습니다.

다음은 위의 접근 방식을 구현한 것입니다.

자바
// 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의 문자열 풀

메모: Java의 모든 객체는 힙에 저장됩니다. 참조 변수는 스택 영역에 저장된 개체에 대한 것이며, 힙 영역에도 저장되는 다른 개체에 포함될 수 있습니다.

예시 1:

자바
// 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:

자바
// 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의 메모리 효율성을 높이기 위해(문자열 상수 풀에 이미 존재하는 경우 새 객체가 생성되지 않기 때문에)