検索

キーワード


【Java】Stringクラスについての理解と基本的な文字列操作

  • 公開日:2020-07-29 13:05:37
  • 最終更新日:2020-11-21 15:45:57
【Java】Stringクラスについての理解と基本的な文字列操作

こんにちは。新人エンジニアのサトウです。

システムエンジニアとして駆け出したばかりですが、

初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。


プログラム初心者✅にも、プログラムに興味がある人✨も、

短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!

Stringとは

そもそもStringとは何なのでしょうか。

Java言語で文字列のデータ型は「String型」という特殊な型を用います。

今まで学習した基本データ型とは異なるデータ型です。

Stringの疑問を紐解いていきましょう。

- Stringの使い方

String型は今まで学習した基本データ型とは異なる特殊なデータ型です。

ですが、変数を格納するだけなら他のデータ型と同じように扱うことができます。

””(ダブルクォーテーション)で囲まれた文字を表示することができます。

String 変数="文字列"

サンプルコード

public class Test{
    public static void main(String[] args) {
        
        String s="Stringを理解する!!";

        System.out.println(s);
    }
}

出力結果

Stringを理解する!!

- Stringは文字列を扱うクラスである

なぜStringは特殊なのでしょうか。

それはStringが文字列を扱うクラスだからです。

String型はStringクラスで定義されています。String型はクラス型変数なのです。

本来、このようなクラス型変数のオブジェクトを利用する際は、クラスをimportして、インスタンス化しなければいけません。


しかしStringクラスに関しては、

importなしで使うことができるようになっていることに加えて、

new演算子を使ったインスタンス化をしなくても、変数の初期化と代入ができるようになっています!


""(ダブルクォーテーション)で囲われた文字列を「文字列リテラル」と言いますが、

この文字列リテラルとして記述された文字列はStringクラスのオブジェクトとして扱われます。

従って、初期化(インスタンス化)されていないString型の変数に対して、

""(ダブルクォーテーション)で囲われた文字列を直接代入する事が可能となっています。

(文字列リテラルとしてインスタンス化されたStringオブジェクトを新しい変数に代入している)

String s="Stringを理解する!!";


Stringクラスはjava.langパッケージに含まれています。

java.langパッケージはJavaプログラミングにおける必須的なクラスが入っているパッケージです。

なので最初から、パッケージごとimportされており、Stringを使うことができるようになっているようです。

データ型の中で、String型だけが大文字「S」なのも、クラスであるとわかると納得できますね。

また他のクラスと同様にStringクラスにも様々なメソッドが用意されています。文字列を操作するメソッドが含まれています。


- Stringを操作しよう

実際にStringを使って文字列を操作してみましょう。Stringクラスでは様々なメソッドが用意されています。

ここでは基本的な7つの操作を紹介します。


連結 :2つ以上の文字列を繋ぎたい時に使います。

切り出し:文字列内のある部分だけを使用したときに使います。

文字列の長さの表示:文字列の数によって、処理を分岐させたい時などに使います。

分割CSVファイルなど固定の文字で区切られた文字列を分割したい時などに使用します。

変換(大文字・小文字)大文字、小文字を無視して比較したい時などに使用します。

置換:文字列に対して修正したい箇所が多い時などに使うと便利です。

空白削除字列の前後の半角・全角スペースといった空白文字を消し処理をしやすくするのに役立ちます。


比較・判断・検索の操作等、その他のStringについては以下の記事で紹介しています。

参考記事リンク:【Java】Stringクラスの文字列比較・判定・検索

        【Java】StringBufferクラスとStringBuilderクラスの文字列操作

        【Java】MessageFormatクラスでの文字列置換

        【Java】Stringクラスformatメソッドの文字列整形とエスケープシーケンス

        【Java】Java8 以降に追加された文字列結合(StringクラスjoinメソッドとStringjonerクラス)

        【Java】"サロゲートペア"を包含する文字列の操作

        【Java】文字列・正規表現


連結

文字列の連結とは、複数の文字列を繋ぎ合わせ、一つの文字列にする処理のことを指します。

①プラス演算子(+)を利用した連結、

concatメソッドを利用した連結、

StringBuilderクラスのappendメソッドを利用した連結、

の3つを紹介します。

- プラス演算子(+)

プラス演算子を使えば文字列同士の連結が簡単にできます。

今回は変数sと変数tを連結しましょう。

public class Test{
    public static void main(String[] args) {
        
        String s="おはようございます。";
        String t="どうぞよろしくお願いします。";
		
        System.out.println(s+t);
    }
}

これを実行すると、

おはようございます。どうぞよろしくお願いいたします。

「おはよう。」と「どうぞよろしくお願いいたします。」が連結されました。


- concatメソッド

String concat(String)

Stringクラスのconcatメソッドを利用すると、文字列の後ろに別の文字列を連結することができます。

内部の処理構造の違いにより、プラス演算子よりconcatメソッドの方が少しだけ処理が速くなります。


今回は変数sの後ろに変数tを連結させ、

変数uという新しいStringオブジェクトを生成します。

public class Test{
    public static void main(String[] args) {
        
        String s="こんにちは。";
        String t="どうぞよろしくお願いいたします。";
		
        String u=s.concat(t);
		
        System.out.println(u);
   } 
}

実行すると、

こんにちは。どうぞよろしくお願いいたします。

「こんにちは。」と「どうぞよろしくお願いします」が連結されました。


◆StringBuilderクラスのappendメソッド

プラス演算子やStringクラスでも文字列連結はできますが、

膨大な数の文字列を結合させると、非常に時間が掛かってしまう場合があります。


そのような時は、StringBuilderクラスのappendメソッドを積極的に使いましょう。

文字列連結を多用した変数への格納や、for文などの繰り返し処理で連結を使用する場合など、

プラス演算子やconcatメソッドよりも高速に処理する事ができます。


StringBuilderクラスについてはリンク先の記事で紹介します。

参考記事リンク:【Java】StringBufferクラスとStringBuilderクラス


切り出し

切り出しとは、文字列の中から指定した部分の文字列を抽出することを指します。

Stringクラスを使って文字列の一部を切り出す場合は、substringメソッド、charAtメソッドを使います。

①開始位置を指定する切り出し/substringメソッド

②範囲を指定する切り出し/substringメソッド

③1つの文字の切り出し/chatAtメソッド

④切り出しの例外

の4つを紹介します。


文字列を切り出す場合はインデックス(文字の位置)を指定する必要があります。

以下の例を見ながらインデックスについて確認しましょう。


  .い .ろ .は .に .ほ .へ .と

 ↑  ↑  ↑  ↑  ↑  ↑  ↑

  0   1   2   3   4   5   6


文字の前に振られている.(ピリオド)がインデックスだと思ってください。

インデックスは「0」から始まるので注意しましょう。

- 開始位置を指定した切り出し/substringメソッド

String substring(int beginIndex)

開始位置を指定する切り出しの場合は引数に開始位置のインデックス(beginIndex)を指定します。

今回は、4番目を開始位置に指定します。


  .い .ろ .は .に .ほ .へ .と

 ↑  ↑  ↑  ↑  ↑  ↑  ↑

  0   1   2   3   4   5   6


4番目の.(ピリオド)以降の文字列が切り出されます。

public class Test{
    public static void main(String[] args){

        String s="いろはにほへと";

        System.out.println(s);
        System.out.println("切り出し:"+s.substring(4));
   }
}

実行すると

いろはにほへと
切り出し:ほへと

4番目に開始位置を指定したので、「ほへと」が切り出されました。


- 範囲を指定した切り出し/substringメソッド

String substring(int beginIndex,int endIndex)

範囲を指定する切り出しの場合は

第一引数に開始位置のインデックス(beginIndex)、

第二引数に終了位置のインデックス(endIndex)を指定します。

今回は2番目から5番目までの範囲を指定します。


  .い .ろ .は .に .ほ .へ .と

 ↑  ↑  ↑  ↑  ↑  ↑  ↑

  0   1   2   3   4   5   6


範囲を指定するとき際に注意するのはインデックスの範囲の取り方です。

文字ではなく、文字の前にある.(ピリオド)の範囲を取るので覚えておきましょう!( endIndex-1 までが範囲になるということ!)

public class Test{ 
    public static void main(String[] args) {

        String s="いろはにほへと";

        System.out.println(s);
        System.out.println("切り出し:"+s.substring(2,5));
    }
}

実行すると

いろはにほへと
切り出し:はにほ

範囲を指定した「はにほ」が切り出されました。


- 1つの文字の切り出し/chatAtメソッド

String charAt(int Index)

1つの文字を取得したいといった場合は、charAtメソッドを使います。

指定したインデックスの一文字を切り出すことができます。

今回は、3番目を切り抜きます。


  .い .ろ .は .に .ほ .へ .と

 ↑  ↑  ↑  ↑  ↑  ↑  ↑

  0   1   2   3   4   5   6


public class Test{
    public static void main(String[] args) {

        String s="いろはにほへと";

        System.out.println(s);
        System.out.println("切り出し:"+s.charAt(3));
    }
}

実行すると

いろはにほへと
切り出し:に

3番目の一文字だけを切り出すことができました。


- 切り出しの例外

substringメソッド、charAtメソッドを使用して、文字列の切り出しを行う場合、

文字数以上のインデックスを指定すると例外が発生するので注意しましょう!

サンプルコード

public class Test {
    public static void main(String[] args) {

        String s="いろはにほへと";

        System.out.println("substring:"+s.substring(2,8));
		System.out.println("charAt:"+s.charAt(9));
    }
}

「いろはにほへと」の文字数は7文字なので、インデックスを「8」以上指定すると出力結果は以下のようになります。

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 2, end 8, length 7

例外が確認できました。

StringIndexOutOfBoundsException は、インデックスが負または文字列のサイズより大きい場合に発生するExceptionです。



文字列の長さの表示

文字列の長さはバイト数ではなく文字数のことを指しています。

- lengthメソッド

int length()

文字数(文字列の長さ)を取得するには、Stringクラスのlengthメソッドを使います。

Stringの変数にlengthメソッドを以下のように使いましょう。

public class Test{
    public static void main(String[] args) {

        String s="あいうえお";
        String t="abcdefghijk";
        String u="0300000000";

        System.out.println("文字数:"+s.length());
        System.out.println("文字数:"+t.length());
        System.out.println("文字数:"+u.length());
    }
}

実行すると

文字数:5
文字数:11
文字数:10

文字数をそれぞれ取得することができました。

ちなみにバイト数は以下の書き方で表示できます。

"文字列".getBytes().length

覚えておくと便利です!



分割

Stringクラスを使って文字列を分割するにはsplitメソッドを使います。

①第一引数のみを指定する方法

②第二引数までを指定する方法

の二つを紹介します。


そもそも分割とは具体的にどのような操作なのでしょうか。以下の例を見てイメージをつかみましょう。


例えば、以下のようなStringオブジェクトでは

String city= "札幌、仙台、名古屋、福岡";

変数city(”札幌、仙台、名古屋、福岡”)は、まとまった一つの文字列です。

そのため、このままでは「仙台」や「福岡」などそれぞれの要素を分けて扱うことができない状態です。


それを解消し、「札幌」、「仙台」など一つのデータとして運用できるようにすることが、「分割」という操作になります。


- 第一引数のみを指定する分割/splitメソッド

String[] split(String regex)

第一引数のみを指定する場合は、

引数に「文字列」あるいは「正規表現」を使うことができます。

引数名regexとは、regular expression[正規表現]の省略語です。

String文字列を引数の指定ごとに分割し、String配列に格納します。戻り値はString配列型になるので注意しましょう。


正規表現について下記のリンク先記事で紹介しています。

参考記事リンク【Java】文字列・正規表現

今回は引数に文字列の読点(、)を指定して使用しています。

public class Test{
    pubic static void main(String[] args) {
        
        String city = "札幌、仙台、名古屋、福岡";
        
        String[] cities = city.split("、");
System.out.println("配列の中身"+Arrays.toString(cities)); System.out.println(cities[2]); } }

実行すると

配列の中身[札幌, 仙台, 名古屋, 福岡]
名古屋

String文字列が四つに分割されてString配列になっています。

また配列[2]を取り出すと、分割された”名古屋”をきちんと取り出すことができますね。


- 第二引数まで指定する分割/splitメソッド

String[] split(String regex,int limit)

第二引数までを指定する方法は、分割の数を意図的に制限することができます。

int型で分割する数を指定します。


今回は上の例に習って、第二引数を「3」に指定して、分割を制限してみましょう。

public class Test{
    pubic static void main(String[] args) {
        
        String city = "札幌、仙台、名古屋、福岡";
        
        String[] cities = city.split("、",3);
System.out.println("配列の中身"+Arrays.toString(cities)); System.out.println(cities[2]); } }

実行すると、

配列の中身[札幌, 仙台, 名古屋、福岡]
名古屋、福岡

カンマ(,)と訓点(、)が混在してわかりにくいかもしれませんが、

配列の中身は ①札幌 ②仙台 ③名古屋、福岡 という様に3つに分割されて配列に格納されています。

また、配列の要素[2]を取り出すと、「名古屋、福岡」の分割されていないひとまとまりの文字列が取り出されます。


変換(大文字・小文字)

- toUpperCaseメソッド/toLowerCaseメソッド

String toUpperCase()
String toLowerCase()

Stringクラスには、文字列の大文字または小文字に変換するためのメソッドがあります。

大文字への変換は「toUpperCaseメソッド」・小文字への変換は「toLowerCaseメソッド」を使います。


このメソッドは「半角文字」の変換をします。「全角文字」は適用できないので注意しましょう!

今回は同じ変数sを使って、それぞれのメソッドを使用してみましょう。

public class Test{
    public static void main(String[] args) {

        String s = "TokyoITCollege";

        System.out.println("通常:"+s);
        System.out.println("toUpper:"+s.toUpperCase());
        System.out.println("toLower:"+s.toLowerCase());
    } 
}

実行すると

通常:TokyoITCollege
toUpper:TOKYOITCOLLEGE
toLower:tokyoitcollege

toUpperCaseメソッドはすべて大文字に、toLowerCaseメソッドはすべて小文字になりました。


置換

Stringクラスには、文字列を置き換えるメソッドが3つあります。

①replaceメソッドの利用

②replaceAllメソッドの利用

③replaceFirstメソッドの利用

- replaceメソッド

String replace(置換される文字列, 置換する文字列)

replaceメソッドは第一引数で指定した文字列を第二引数で指定した文字列に置き換えることができます。

指定された第一引数に合致するもの全てが置き換わるので覚えておきましょう。


今回は、「福岡」を『京都』に置き換えます。

文字列に「福岡」が2個含まれていますが、どちらも『京都』に置き換わりますよ。

public class Test{
    public static void main(String[] args) {

        String city = "札幌、仙台、名古屋、福岡、福岡";

        System.out.println(city.replace("福岡", "京都"));
    }
}

実行すると

札幌、仙台、名古屋、京都、京都

「福岡」が『京都』へ置き換わったことがわかると思います。


- replaceAllメソッド

String replaceAll(置換される文字列, 置換する文字列)

replaceAllメソッドもreplaceメソッド同様に

第一引数で指定した文字列を第二引数で指定した文字列に置き換えることができます。

replaceAllメソッドは第一引数に正規表現を使用することができる点で、replaceメソッドと差別化できます。


replaceメソッドのサンプルコードは正規表現についての記事で紹介しています。

参考記事リンク:【Java】文字列・正規表現


- replaceFirstメソッド

String replaceFirst(置換される文字列, 置換する文字列)

最後はreplaceFirstメソッドです。第一引数を第二引数の文字列に置き換えることは同じです。

上記2つのメソッドと異なる点は、最初に合致した文字列に置換を適用する点です。

また、replaceAllメソッドと同じ様に、第一引数に正規表現を使用することができます。


replaceメソッドと同じ例を使って、replaceFirstメソッドを使ってみましょう。

「福岡」が文字列内に2つありますが、今回は最初の「福岡」だけが『京都』に置き換わります。

public class Test{
    public static void main(String[] args) {

        String city = "札幌、仙台、名古屋、福岡、福岡";

        System.out.println(city.replaceFirst("福岡", "京都"));
    }
}

実行すると

札幌、仙台、名古屋、京都、福岡

となります。

最初の「福岡」のみが、『京都』へ置き換えられました。

今回の都市データの例は、replaceFirstメソッドを使用した方が適切です。



空白除去

文字列から空白を削除する方法を紹介します。

Stringクラスのtrimメソッドを使う方法と、先に紹介したreplaceメソッドを使って空白削除できる方法の

合わせて2つ紹介します。

- trimメソッド

String trim()

文字列の前後から空白を削除するにはtrimメソッドを使います。

このメソッドを使うことで、文字列の先頭と末尾の空白と制御文字をすべて削除できます。

文字と文字の間の空白は削除できないので注意しましょう。


Stringで取得されている変数sの前後には空白があります。


    Tokyo IT College          

 ↑削除する    ↑削除不可  ↑削除する


今回は、これをtrimメソッドで削除します。

public class Test{
	public static void main(String[] args) {
		String s = "       Tokyo IT College      ";
        
		System.out.println("通常:"+s);
        System.out.println("削除後:"+s.trim());
    }
}

実行すると

通常:       Tokyo IT College      
削除後:Tokyo IT College

「通常」の場合だと文字列の前後に空白がありますが、

trimメソッドを使用した後は空白を消すことができています。


- replaceメソッド(空白削除)

String replace(置換される文字列, 置換する文字列)

replaceメソッドの引数に空欄を指定することで、空白削除を行う方法もあります。

replace(" ","")

第一引数には”  ”(空白)を指定し、第二引数は””ダブルクォーテーションのみにします。


public class Test{
	public static void main(String[] args) {
		String s = "       Tokyo IT College      ";

		System.out.println("通常:"+s);
        System.out.println("削除後:"+s.replace(" ",""));
    } 
}

実行すると

通常:       Tokyo IT College      
削除後:TokyoITCollege

replaceメソッドは、trimメソッドとは異なり、文字間の間の空白もすべて削除してくれます。


【著者】

新人IT勉強家:Sato(サトウ)

読者を始め私自身も知りたい!と思うような知って得するプログラミング知識やIT情報を日々発信しております。
憧れの人物は、コリンファースに渡部篤郎、そして仮面ライダー!( のようなカッコいい人物で在りたい! )
かような方々に負けない大人で在れる様、プログラミングを始め興味関心を持ったことを毎日勉強中デス !!

よく読まれている記事

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラスformatメソッドの文字列整形とエスケープシーケンス

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】StringBufferクラスとStringBuilderクラスの文字列操作

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】データ型(プリミティブ型と参照型)についての紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様

【Java】日付時刻のまとめ

こんにちは、駆け出しエンジニアの伊藤です。東京ITカレッジのJava研修で学んだ内容を復習も兼ねて記事にしたいと思います。今回は、日付時刻のまとめとして、日付時刻に関する基本的なクラスやメソッド等の概要を紹介していきます。より詳しく知りたい!という方は、リンク先の関連記事をご参考にしてください。Javaやプログラムについて勉強し始めた方の参考になれば幸いです!(eclipseを使用して計算を行って