Java - 文字と文字列

文字と文字列

Java では文字と文字列は明確に区別されます。文字は単一の文字のことです。例えば「あ」などが文字になります。一方で、文字列は複数の連続する文字を表します。例えば「Hello」など複数の文字が連続するものが文字列になります。

文字 (単一の文字) を表す場合は ' (シングルクォーテーション) で囲みます。文字列 (複数の文字) を表す場合は " (ダブルクォーテーション) で囲みます。文字列を ' (シングルクォーテーション) で囲んだ場合、「文字リテラルが閉じられていません」というエラーが発生します。' (シングルクォーテーション) で囲む場合は、必ず文字 (単一の文字) を指定してください。他のプログラミング言語では、'" を区別しない場合がありますが、Java では明確に区別されます。

'あ'    // 文字リテラル
"Hello" // 文字列リテラル
文字と文字列

文字コード

コンピュータの世界では、すべて数値に置き換えて処理が行われています。文字についても同様で、数値に置き換えることができます。文字を数値に置き換えたものを文字コードと呼びます。

'a'  ==  97    (0x0061)
'あ' ==  12354 (0x3042)
文字コード

ある文字の集合に対して (例えば日本語など) どのように文字コードを割り当てるのかを定めたものを文字エンコーディングと呼びます。Shift_JIS や UTF-8 は日本語を含めた文字の集合に対して文字コードを割り当てたものです。そして Java の世界では Unicode を使用しています。

文字コードは \uxxxx の形で指定します。xxxx には 16 進数の文字コードを指定します。例えば、'a'\u0061 となります。

class test{
  public static void main(String args[]){
    System.out.println('a');      // a
    System.out.println('¥u0061'); // a
  }
}
文字コード

エスケープシーケンス

エスケープシーケンスとは、通常の文字列では表せない特殊な文字や機能を、規定された特別な文字の並びにより表したものです。エスケープシーケンスは \ と文字を組み合わせによって表します。例えば、改行は \n のように表します。

class test{
  public static void main(String args[]){
    System.out.println("Hello,¥nWorld!");
    /* Hello,
       World! */
  }
}
エスケープシーケンス

Java ではエスケープシーケンスとして、以下が定義されています。

  • \b : バックスペース
  • \t : 水平タブ
  • \n : 改行
  • \r : 復帰
  • \f : 改ページ
  • \' : シングルクォーテーション
  • \" : ダブルクォーテーション
  • \\ : \ 文字
  • \oxx : 8 進数の文字コードが表す文字
  • \uxxxx: 16進数の文字コードが表す文字

\'\" は、文字、または文字列の中でクォーテーションを使用したい場合にエスケープするために用意されています。以下の例では、' を表す文字のように思えますが、終端の ' であると解釈されるためエラーになります。

System.out.println(''');
エスケープシーケンス

そのため、正しく表すためには以下のように記述する必要があります。

System.out.println('\'');
エスケープシーケンス

String クラス

整数であれば int 型、文字であれば char 型など Java では基本的な値を扱うためのデータ型が用意されています。ただし、文字列を扱うための基本データ型は用意されていません。その代わり、標準クラスとして String クラスが用意されています。String クラスは、文字の集合である文字列を扱うためのクラスです。

クラスからオブジェクトを生成するには、以下のように記述します。

クラス名 変数名;
変数名 = new クラス名(引数1, 引数2, ...);
クラスからオブジェクトを生成する

オブジェクトを生成するには new 演算子を使います。作成されたオブジェクトは変数に代入して使用します。以下のサンプルコードでは、String クラスのオブジェクトを生成し、変数 name に代入しています。

String name;
name = new String();
クラスからオブジェクトを生成する

String クラスのオブジェクトの生成と初期化

文字列は複数の文字が連続したものです。そして文字列は、ダブルクォーテーションで囲んで表現することができます。これらは String クラスのオブジェクトとして実現されています。

String str;

char data[] = {'A', 'B', 'C'};
str = new String(data);
String クラスのオブジェクトの生成と初期化

上記のサンプルコードでは、String クラスのオブジェクトを生成する方法のひとつです。この方法は、以下のように記述した場合と同じです。

String str = "ABC";
String クラスのオブジェクトの生成と初期化

文字列をダブルクォーテーションで囲むだけで String クラスのオブジェクトが生成されます。この記述方法が用意されているおかげで、String クラスのオブジェクトを new 演算子を使って生成しなくてもコードが記述できるようになっています。

クラスのオブジェクトを変数に代入する場合は、参照型の変数となります。そのため String クラスのオブジェクトを生成して変数に代入した場合はオブジェクトの位置が格納され、オブジェクト自体は別の領域に格納されます。

文字列の長さは任意の長さになります。文字数によって必要な領域のサイズは可変になるはずですが、String クラスの変数には領域の位置だけが格納されているため、文字列が何文字であっても同じように扱うことができます。

String str1 = "abc";
String str2 = "1234567890";
String クラスのオブジェクトの生成と初期化

文字列と文字列の比較

変数に格納されている値が等しいかどうかは == 演算子を使用します。

int num = 5;

if (num == 5){
  ...
}
文字列と文字列の比較

ただし、文字列同士の比較を行う場合は注意が必要です。以下のサンプルコードでは、文字列は等しいと判定されます。これは、"abc" という文字列を str1 と str2 が、同じ領域に格納されている位置を共有しているためです。

String str1 = "abc";
String str2 = "abc";

if (str1 == str2){
  ...
}
文字列と文字列の比較

ただし以下のサンプルコードでは、文字列は等しくないと判定されます。どちらも同じ文字列である "abc" を表す String クラスのオブジェクトですが、str2 は後から "c" を付加したときに str1 とは別の領域を確保しています。そのため str1 と str2 は別々の領域を参照しているため、等しくないと判定されます。

String str1 = "abc";
String str2 = "ab";
str2 = str2 + "c";

if (str1 == str2){
  ...
}
文字列と文字列の比較

このような問題を回避するためには equals メソッドを使用します。equals メソッドでは、オブジェクトに格納されている文字列を比較します。以下のサンプルコードでは、str1 と str2 は等しいと判定されます。

String str1 = "abc";
String str2 = "ab";
str2 = str2 + "c";

if (str1.equals(str2)){
  ...
}
文字列と文字列の比較

また、変数を使用せずに以下のような記述も可能です。

String str1 = "abc";

if (str1.equals("abc")){
  ...
}

if ("abc".equals(str1)){
  ...
}
文字列と文字列の比較

指定の位置の文字を取得

文字列は複数の文字が並んだものです。String クラスで用意されている charAt メソッドを使用すると、指定の位置にある 1 文字を取得することができます。

文字列.charAt(インデックス)
指定の位置の文字を取得

インデックスには文字列に含まれる文字毎に割り当てられた番号になります。

0 1 2 3 4 5  // インデックス
------------
A B C D E F  // 文字列
指定の位置の文字を取得

具体的には、以下のように記述します。

String str = "ABCDEF";

System.out.println(str.charAt(0)); // A
System.out.println(str.charAt(1)); // B
System.out.println(str.charAt(2)); // C
System.out.println(str.charAt(3)); // D
System.out.println(str.charAt(4)); // E
System.out.println(str.charAt(5)); // F
指定の位置の文字を取得

文字列の長さを取得

文字列の長さは文字の数になります。文字の数を取得するには String クラスで用意されている length メソッドを使用します。

String str = "ABCDEF";

System.out.println(str.length()); // 6
文字列の長さを取得

関連記事