【ITニュース解説】Java String contains() Method: How to Check Substrings with Examples
2025年09月22日に「Dev.to」が公開したITニュース「Java String contains() Method: How to Check Substrings with Examples」について初心者にもわかりやすく解説しています。
ITニュース概要
Javaの`String.contains()`メソッドは、ある文字列が指定した文字の並びを含んでいるかをtrue/falseで判定する。これは文字列検索、入力検証、データフィルタリングなどに活用でき、大文字・小文字を区別する点に注意が必要だ。
ITニュース解説
Javaプログラミングにおいて、文字列(String)は非常に頻繁に扱うデータ型の一つだ。例えば、ユーザーが入力した文章の中に特定のキーワードが含まれているか調べたり、ファイル名が特定の部分文字列を含んでいるか確認したりするなど、多くの場面で文字列の操作が必要になる。このような時、ある文字列が別の特定の文字の並び、つまり部分文字列を含んでいるかどうかを簡単にチェックできる便利なメソッドがJavaには用意されている。それがStringクラスのcontains()メソッドである。
contains()メソッドは、Javaに最初から組み込まれている機能の一つで、ある文字列の中に指定した文字の並びが存在するかどうかを判断するために使われる。このメソッドは、その結果を真偽値、つまりtrue(含まれている場合)またはfalse(含まれていない場合)で返す。プログラミングにおいて、このような条件の判定は非常に重要であり、contains()メソッドはそのシンプルさから広く利用されている。
contains()メソッドの基本的な書き方は次のようになる。
public boolean contains(CharSequence sequence)
ここで、publicはどこからでもこのメソッドを呼び出せることを意味し、booleanはこのメソッドがtrueかfalseのどちらかを返すことを示している。そして、containsがメソッドの名前であり、括弧の中に書かれているCharSequence sequenceが、検索したい文字の並びを指定する部分である。CharSequenceとは、文字列を扱うためのインターフェースで、具体的にはString型、StringBuilder型、StringBuffer型など、様々な種類の文字列オブジェクトを引数として渡すことができる。もし、指定したsequenceが元の文字列内に見つかればtrueを返し、見つからなければfalseを返す。
具体的な例でその使い方を見てみよう。 たとえば、「Java programming is fun」という文字列の中に「Java」という単語が含まれているか確認したいとする。
1public class ContainsExample { 2 public static void main(String[] args) { 3 String text = "Java programming is fun"; 4 5 System.out.println(text.contains("Java")); // true 6 System.out.println(text.contains("Python")); // false 7 System.out.println(text.contains("fun")); // true 8 } 9}
このコードを実行すると、出力は次のようになる。
true
false
true
これは、最初のtextの中に「Java」が含まれているためtrue、次に「Python」は含まれていないためfalse、最後に「fun」は含まれているためtrueという結果がそれぞれ出力されたことを示している。このように、contains()メソッドは、文字列内に特定の並びが存在するかどうかを非常に直感的にチェックできるのだ。
しかし、contains()メソッドには一つ重要な特徴がある。それは、大文字と小文字を区別する、つまり「ケースセンシティブ」であるということだ。たとえば、「Hello World」という文字列に対して「Hello」を検索するとtrueになるが、「hello」と小文字で検索するとfalseになる。
1public class CaseSensitiveExample { 2 public static void main(String[] args) { 3 String text = "Hello World"; 4 5 System.out.println(text.contains("Hello")); // true 6 System.out.println(text.contains("hello")); // false 7 } 8}
出力は次のようになる。
true
false
もし大文字と小文字を区別せずに検索したい場合は、検索対象の文字列と検索したい文字列の両方を、一時的に全て大文字か全て小文字に変換してからcontains()メソッドを使うと良い。例えば、text.toLowerCase().contains("hello".toLowerCase());と書けば、どちらの文字列も小文字に変換されてから比較されるため、期待通りの結果(true)が得られる。
検索したい単語を直接メソッドの引数に書く代わりに、変数に格納して使うことももちろん可能である。これは、ユーザーからの入力を受け取って検索する場合など、実際のプログラム開発では頻繁に行われる。
1public class VariableExample { 2 public static void main(String[] args) { 3 String mainString = "Welcome to Java tutorials"; 4 String searchWord = "Java"; 5 6 if (mainString.contains(searchWord)) { 7 System.out.println("Found: " + searchWord); 8 } else { 9 System.out.println("Not Found"); 10 } 11 } 12}
この例では、mainStringがsearchWordを含んでいるため、「Found: Java」と出力される。条件分岐であるif文と組み合わせることで、検索結果に基づいて異なる処理を実行できるため、プログラミングの幅が広がる。
contains()メソッドは様々なプログラミングタスクで役立つ。
- 検索機能: ウェブサイトやアプリケーションで、ユーザーが入力したキーワードが特定のデータに含まれているかを確認する際に使用される。例えば、商品リストから特定のキーワードを含む商品を絞り込む場合などだ。
- 検証(バリデーション): 例えば、メールアドレスの入力欄で「@」記号が含まれているか確認したり、URLが「https」で始まっているか(厳密には
startsWith()がより適切だが、部分的なチェックとして)確認したりする際に使える。これにより、入力されたデータが正しい形式であるかを事前にチェックできる。 - データのフィルタリング: 大量のデータの中から、特定のキーワードを含むものだけを抽出する際に役立つ。例えば、ログファイルから特定のエラーメッセージを含む行だけを見つけ出す、といった用途が考えられる。
例えば、文字列のリストから、特定の文字を含む名前だけをフィルタリングする例を見てみよう。
1import java.util.*; 2 3public class FilterExample { 4 public static void main(String[] args) { 5 List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); 6 7 for (String name : names) { 8 if (name.contains("a") || name.contains("A")) { 9 System.out.println(name); 10 } 11 } 12 } 13}
このコードでは、namesというリストから、「a」または「A」という文字を含む名前だけがコンソールに出力される。
出力は次のようになる。
Alice
Charlie
David
「Bob」はどちらの文字も含まないため、出力されない。このように、contains()はリストや配列などのコレクションの要素を処理する際にも非常に強力なツールとなる。
一方で、contains()メソッドにはいくつかの制限があることも理解しておく必要がある。
前述のように、大文字と小文字を区別するため、意図しない結果になることがある。また、contains()はあくまで指定された「正確な文字の並び」を探すものであり、「パターンマッチング」には対応していない。たとえば、「数字が3つ連続する」といった複雑なパターンを検索したい場合は、contains()ではなく、正規表現(Regular Expression)という別の強力な仕組みとmatches()メソッドなどを利用する必要がある。さらに、contains()メソッドの引数にnull(何もない状態を示す特別な値)を渡すと、プログラムが異常終了するNullPointerExceptionというエラーが発生する可能性があるため、注意が必要である。このエラーは、プログラムが予期せず停止する原因となるため、常にnullチェックを行う習慣をつけることが重要だ。
Javaには、contains()以外にも文字列を比較したり、その一部を調べたりするための様々なメソッドがある。それぞれのメソッドには得意な役割があるため、状況に応じて使い分けることが重要だ。
equals(): 二つの文字列が「完全に同じ」であるかどうかをチェックする。大文字と小文字も区別する。例えば"Hello".equals("hello")はfalseになる。contains()が部分的な一致を見るのに対し、equals()は文字列全体の一致を見る。startsWith(): 文字列が特定の「接頭辞」(先頭の文字の並び)で始まるかどうかをチェックする。例えば"Hello".startsWith("He")はtrueになる。endsWith(): 文字列が特定の「接尾辞」(末尾の文字の並び)で終わるかどうかをチェックする。例えば"Hello".endsWith("lo")はtrueになる。matches(): 正規表現を使って、文字列が特定の「パターン」に一致するかどうかをチェックする。非常に柔軟な検索が可能で、"abc123".matches("[a-z]+\\d+")はtrueになる(これは「アルファベットが1文字以上続き、その後に数字が1文字以上続く」というパターンに一致するかどうかを調べている)。
これらの違いを理解することで、より効率的で正確な文字列処理が可能になる。
contains()メソッドを効果的に使うためのいくつかのアドバイスをまとめる。
まず、単純に文字列の中に特定の部分文字列が含まれているかを確認したい場合は、contains()を使うのが最もシンプルでわかりやすい方法である。大文字と小文字を区別したくない場合は、検索対象と検索語の両方をtoLowerCase()(全て小文字に変換)またはtoUpperCase()(全て大文字に変換)メソッドを使ってからcontains()を実行すると良い。もし、より複雑な文字の並びやパターン(例えば、「a」で始まり、「b」で終わる文字列)を検索したい場合は、matches()メソッドやjava.util.regex.Patternクラスと正規表現を利用することを検討しよう。そして最も重要なことの一つは、contains()メソッドを呼び出す前に、引数として渡す可能性のある文字列がnullではないことを必ず確認することだ。これにより、NullPointerExceptionという予期せぬエラーを防ぐことができる。
JavaのString contains()メソッドは、文字列の中に特定の部分文字列が存在するかどうかを調べるための、非常に強力かつ簡単なツールである。このメソッドは、テキストの検索、データのフィルタリング、入力値の検証といった様々なプログラミングタスクで広く活用されている。contains()メソッドは、部分文字列の有無をtrueかfalseで返し、大文字と小文字を区別する。String型だけでなく、CharSequenceインターフェースを実装するStringBuilderやStringBufferといった他の文字列オブジェクトも引数として受け入れられる。単純な検索には最適だが、複雑なパターンマッチングには向かないことを覚えておくと良い。このcontains()メソッドを習得することで、Javaでの文字列操作がより効率的で効果的なものになるだろう。