JavaのStringクラスとは?基本的な利用方法について紹介

エンジニア
マネージャー
javaでのstringクラスの利用方法について
stringクラスとは、文字列操作に便利な機能を沢山保有しているクラスのこと。javaで文字列を扱う場合は、このstringクラスの機能を利用することになります。今回はそんなstringクラスについての解説と、基本的な利用方法をご紹介していきます。
Stringクラスとは?
stringクラスとは、文字列を扱うために実装されているクラスです。java.lang内に実装されているクラスのため、importをすることなく利用可能となっています。Javaプログラム上のリテラル文字列は全てstringクラスのインスタンスとして実行されることになります。リテラル文字列とは、ダブルクォーテーションで囲まれた、プログラムを実行する際に機械語に変換されない文字列のことであり、プログラム上で利用される””abc””や””あいう””のことを指します。そのため、stringクラスはnew演算子を使わなくてもオブジェクトを生成することが可能になっています。例えば、以下のようなコードはエラーになりません。String str = “”abc””;通常、クラスからオブジェクトを作る場合はnew演算子を利用しなければなりません。しかしダブルクォーテーションで囲まれた文字列は、コンパイラによって文字列オブジェクトとして自動で認識されるため、new演算子を利用しなくても生成することが可能なのです。もちろん、new演算子を利用して下記のようにstringクラスのオブジェクトを生成することもできます。
1 |
String str = new String(""abc""); |
Stringクラスの利用方法
stringクラスには、多くの便利なメソッドが用意されています。その中でも基本的なメソッドを4つご紹介します。基本的に利用されているのは、以下の機能をもったメソッドです。・2つの文字列が同一かどうかを比較する・文字列の長さを取得する・文字列の中に指定する文字列がどの位置にあるかを検索する・文字列が空かどうかを調べるこれらのメソッドについて、コードを交えながらご紹介していきます。
2つの文字列が同一かどうかを比較する
javaで2つの文字列を比較する際に利用されるのが「equals」というメソッドになります。このメソッドを利用すると、同一の場合はtrue、異なる場合はfalseが返されます。つまり==と同様の機能を持っているのですが、javaで文字列を比較する際に==は利用してはいけないことになっています。なぜ利用してはいけないのかについては後ほど解説します。では、2つの文字列を比較するコードを確認していきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Main { public static void main(String[] args) { String test1 = "あいうえお"; String test2 = "あいうえお"; String test3 = "かきくけこ"; // test1とtest2の比較 if (test1.equals(test2)) { System.out.println("test1とtest2に格納されている文字列は同じです。"); } else { System.out.println("test1とtest2に格納されている文字列は異なります。"); } // test1とtest3の比較 if (test1.equals(test3)) { System.out.println("test1とtest3に格納されている文字列は同じです。"); }else{ System.out.println("test1とtest3に格納されている文字列は異なります。"); } } } |
実行結果
1 2 |
test1とtest2に格納されている文字列は同じです。 test1とtest3に格納されている文字列は異なります。 |
このように、文字列の内容が同一の場合はtrue、異なる場合はfalseが返ってきます。
==とequalsの違いについて
文字列の比較をする場合、javaでは==は正しく機能しない場合があります。そのため、==を利用することは推奨されていません。これは実際にコードを実行してみると確認することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class Main { public static void main(String[] args) { String test1 = "あいうえお"; String test2 = new String("あいうえお"); // ==で比較を行った場合 if (test1 == test2) { System.out.println("test1とtest2に格納されている文字列は同じです。"); } else { System.out.println("test1とtest2に格納されている文字列は異なります。"); } // equalsで比較を行った場合 if (test1.equals(test2)) { System.out.println("test1とtest2に格納されている文字列は同じです。"); } else { System.out.println("test1とtest2に格納されている文字列は異なります。"); } } } |
実行結果
1 2 |
test1とtest2に格納されている文字列は異なります。 test1とtest2に格納されている文字列は同じです。 |
同じ文字列を比較しているのに、結果が異なってしまっています。なぜこのようなことが起こるのかというと、最初の変数の宣言部分がポイントになってきます。これはJavaでのstringが、プリミティブ型ではなくクラスだということが関係してきます。プリミティブ型変数では、変数の中には値が直接格納されます。しかしながら、クラスを利用した変数は参照型変数と呼ばれるものになり、変数の中には値が格納されるのではなく、その値を保存している場所の住所が格納されているのです。==は変数の中身を直接比較します。違う宣言方法をした変数の中にはそれぞれ違う住所が格納されている為、異なっているという結果になってしまうのです。このような事態を防ぐためにも、文字列同士の比較をする場合はequalsメソッドを利用して比較するようにしましょう。
文字列の長さを取得する
文字列の長さを取得したい場合は、javaではlengthメソッドを利用します。lengthメソッドを利用すると、int型で文字数が返されます。実際のコードを見ながら確認してみましょう。
1 2 3 4 5 6 7 8 |
public class Main { public static void main(String[] args) { String test1 = "abc"; String test2 = "あいうえお"; System.out.println("test1の文字数:" + test1.length()); System.out.println("test2の文字数:" + test2.length()); } } |
実行結果
1 2 |
test1の文字数:3 test2の文字数:5 |
このように、半角でも全角でも同様に文字数がカウントされます。
指定する文字列がどの位置にあるかを検索する
文字列の中に、指定する文字列がどの位置にあるかを検索したい場合はindexOfメソッドを利用します。これは、例えば文字列””あいうえお””の中に、””う””がどの位置にあるのかを検索してくれるメソッドとなります。見つかった場合は、先頭を0とした場合の番号が返ってきます。見つからなかった場合は「-1」が返ってきます。つまり、””あいうえお””の中から””う””を探した場合は、「2」が返ってきます。以下のコードで確認してみましょう。
1 2 3 4 5 6 7 8 |
public class Main { public static void main(String[] args) { String test1 = "あいうえお"; String test2 = "aiueo"; System.out.println("test1の「う」の位置を検索する:" + test1.indexOf("う")); System.out.println("test2の「う」の位置を検索する:" + test2.indexOf("う")); } } |
実行結果
1 2 |
test1の「う」の位置を検索する:2 test2の「う」の位置を検索する:-1 |
文字列が空かどうかを調べる
文字列が空かどうかを確認したい場合は、isEmptyメソッドを利用します。空の場合はtrue、空ではない場合はfalseが返ってきます。それでは、実際にどのように利用するのか、以下のコードで確認しましょう。
1 2 3 4 5 6 7 8 |
public class Main { public static void main(String[] args) { String test1 = ""; String test2 = "abc"; System.out.println("test1が空かどうか:" + test1.isEmpty()); System.out.println("test2が空かどうか:" + test2.isEmpty()); } } |
実行結果
1 2 |
test1が空かどうか:true test2が空かどうか:false |
ここで注意していただきたいのは、空文字とnullは異なるということです。空文字とは””””のような、オブジェクトは存在しているが文字が入っていない状態のことであり、nullはそもそもオブジェクトが存在していない状態のことを指します。isEmptyでは空文字かどうかを判定できますが、nullは判定できないばかりか、NullPointerExceptionが発生します。以下のコードで確認してみましょう。
1 2 3 4 5 6 |
public class Main { public static void main(String[] args) { String test = null; System.out.println("testが空かどうか:" + test.isEmpty()); } } |
実行結果
1 |
Exception in thread ""main"" java.lang.NullPointerException at Main.main(Main.java:4) |
この為、nullが含まれる可能性がある場合は、先にifなどを利用してnullではないことを確認してから実行する必要があります。
1 2 3 4 5 6 7 8 9 10 11 |
public class Main { public static void main(String[] args) { String test = null; // 先にnullかどうかを判定する if (test != null) { System.out.println("testが空かどうか:" + test.isEmpty()); } else { System.out.println("testはnull"); } } } |
1 |
testはnull |
エンジニア
マネージャー
stringを便利に使いこなそう
stringはjavaの中でも多く利用されるデータ型です。しかし、javaでのstringはプリミティブ型ではなくクラスのため、他のデータ型とは違った処理をしなければならない箇所が多くあります。しかしながら、クラスであるために便利なメソッドが多く利用できるようになっています。JavaDocを確認しながら、stringを便利に使いこなしていきましょう。
FEnetJava・Javaコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Java新着案件New Job
官公庁向け業務システム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給39万~44万円東京都千代田区(永田町駅)販売管理システム開発/Java/東京都中央区/【WEB面談可】/テレワーク
月給49万~55万円東京都中央区(京橋駅)生命保険会社向けシステム開発/Java/東京都千代田区/【WEB面談可】/テレワーク
月給42万~48万円東京都千代田区(大手町駅)社会保険システムのパッケージ開発/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(新橋駅)金融機関向けシステム更改/Java/東京都江東区/【WEB面談可】/テレワーク
月給46万~51万円東京都江東区(豊洲駅)大手通信会社者向けWebシステム改修/Java/東京都港区/【WEB面談可】/テレワーク
月給42万~48万円東京都港区(品川駅)