logo

Javaの文字列

この例では、オブジェクトが 1 つだけ作成されます。まず、JVM は文字列定数プール内で値 Welcome を持つ文字列オブジェクトを見つけられないため、新しいオブジェクトを作成します。その後、値 Welcome を持つ文字列をプール内で見つけます。新しいオブジェクトは作成されませんが、同じインスタンスへの参照が返されます。この記事では、Java String について学びます。

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 で文字列を作成するには 2 つの方法があります。

  • 文字列リテラル
  • 新しいキーワードを使用する

構文:

 = '';>

1. 文字列リテラル

Java のメモリ効率を高めるため (文字列定数プールにすでに存在する場合、新しいオブジェクトは作成されないため)。



例:

String demoString = techcodeview.com;>

2. 新しいキーワードを使用する

  • 文字列 s = 新しい文字列(ようこそ);
  • このような場合、JVM は通常の (非プール) ヒープ メモリに新しい文字列オブジェクトを作成し、リテラルの Welcome が文字列定数プールに配置されます。変数 s はヒープ (非プール) 内のオブジェクトを参照します。

例:

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

Java の文字列のインターフェイスとクラス

文字バッファ : このクラスは CharSequence インターフェイスを実装します。このクラスは、CharSequence の代わりに文字バッファーを使用できるようにするために使用されます。このような使用例は、正規表現パッケージ java.util.regex です。

:文字列です。 Java では、String のオブジェクトは不変、つまり定数であり、一度作成すると変更することはできません。

CharSequence インターフェイス

CharSequence インターフェイスは、Java で文字のシーケンスを表すために使用されます。
CharSequence インターフェースを使用して実装されるクラスについては以下で説明します。これらは、部分文字列、最終出現、最初の出現、連結、 toupper、to lower などの多くの機能を提供します。

  1. 文字列バッファ
  2. 文字列ビルダー

1. 文字列

String は不変クラスであり、定数を意味し、一度作成すると変更することはできません。変更したい場合は、新しいオブジェクトを作成する必要があり、toupper、to lower などのそれが提供する機能も作成する必要があります。これらはすべて新しいオブジェクトを返し、変更はされません。元のオブジェクト。自動的にスレッドセーフになります。

構文

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

2.文字列バッファ

文字列バッファ のピアクラスです 本質的に変更可能であり、スレッドセーフなクラスです。マルチスレッド環境と文字列バッファの共有オブジェクトがある場合、つまり複数のスレッドで使用される場合に使用できます。スレッドセーフであるため余分なオーバーヘッドがあるため、主にマルチスレッドプログラムに使用されます。

構文:

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

3. 文字列ビルダー

文字列ビルダー Java では、可変の文字シーケンスを作成し、スレッドセーフではないため、String および StringBuffer クラスの代替を表します。スレッド内でのみ使用されるため、余分なオーバーヘッドがなく、主にシングルスレッドプログラムで使用されます。

arp - コマンド

構文:

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

StringTokenizer

StringTokenizer Java の class は、文字列をトークンに分割するために使用されます。

例:

Java の文字列トークナイザー

StringTokenizer オブジェクトは、トークン化される文字列内の現在の位置を内部的に維持します。一部の操作では、処理された文字を超えてこの現在位置を進めます。トークンは、StringTokenizer オブジェクトの作成に使用された文字列の部分文字列を取得することによって返されます。

文字列結合者 クラスです java.util デリミタで区切られ、オプションで指定されたプレフィックスで始まり、指定されたサフィックスで終わる一連の文字 (文字列) を構築するために使用されるパッケージ。これは、StringBuilder クラスを使用して各文字列の後に区切り文字を追加することもできますが、StringJoiner を使用すると、多くのコードを記述せずにそれを行う簡単な方法が提供されます。

構文:

public StringJoiner(CharSequence delimiter)>

上記では、String Literal によって文字列を作成できることがわかりました。

文字列デモString =ようこそ;

ここで、JVM は文字列定数プールをチェックします。文字列が存在しない場合は、新しい文字列インスタンスが作成され、プールに配置されます。文字列が存在する場合、新しいオブジェクトは作成されません。むしろ、同じインスタンスへの参照を返します。これらの文字列インスタンスを格納するキャッシュは、文字列定数プールまたは文字列プールと呼ばれます。 JDK 6 までの Java の以前のバージョンでは、文字列プールは PermGen (永続生成) 空間内に配置されていました。しかし、JDK 7 では、メイン ヒープ領域に移動されます。

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 を使用して新しいオブジェクトが作成されます。これが、文字列が不変として知られる理由です。

指定された図からわかるように、2 つのオブジェクトが作成されていますが、参照変数は依然として Sachin Tendulkar ではなく Sachin を参照しています。しかし、これを参照変数に明示的に割り当てると、Sachin Tendulkar オブジェクトを参照することになります。

例えば:

ジャワ
// 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 demoString = 'Geeks';>

文字列は、 新しい 演算子、つまり動的に割り当てられます。 String が動的に割り当てられる場合、ヒープ内の新しいメモリ位置が割り当てられます。この文字列は文字列定数プールに追加されません。

例:

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

この文字列を定数プールに保存したい場合は、それをインターンする必要があります。

例:

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

JVM がメモリ割り当てを最適化できるため、文字列リテラルを使用することをお勧めします。

String を宣言する方法を示す例

ジャワ
// 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 に移動したのはなぜですか 通常のヒープ領域?

PermGen のスペースは限られており、デフォルトのサイズはわずか 64 MB です。それは、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 つの参照変数があり、すべてが 1 つのオブジェクト Sachin を参照しているとします。 1 つの参照変数がオブジェクトの値を変更すると、すべての参照変数の影響を受けます。 Java では文字列オブジェクトが不変であるのはこのためです。

3. なぜ Java は文字列リテラルの概念を使用するのですか?

Java のメモリ効率を高めるため (文字列定数プールにすでに存在する場合、新しいオブジェクトは作成されないため)。