文字列処理 – エンジニアの入り口 https://eng-entrance.com 「エンジニアの入り口」は、プログラミング入門やエンジニアリング入門の知識が満載の初心者のための勉強サイトです。プログラミングやサーバ、ネットワークの基礎知識や勉強方法を習得できます。 Sat, 08 Oct 2016 03:45:28 +0000 ja hourly 1 https://wordpress.org/?v=5.2.19 【初心者向け】Javaでの文字列と文字列の比較方法 https://eng-entrance.com/java-basic-string-compare https://eng-entrance.com/java-basic-string-compare#respond Sat, 08 Oct 2016 03:35:07 +0000 http://eng-entrance.com/?p=2954 Javaの文字列はStringクラスの参照型だ。演算子で比較してもうまく動作しないことがある。

このページではJavaでの文字列比較の方法についてお伝えした。参考にしていただければと思う。

Javaでの文字列の比較

整数などの基本型の場合、値が一致するかどうかの比較は「==」演算子を使用する。

しかし、Stringクラスは参照型なので「==」演算子で比較しても、オブジェクトの実体までは比較していないので正しく動作しない場合がある。

equalsメソッド

文字列の比較のために、Stringクラスではequalsというメソッドを用意している。

下記のように比較をすることができる。

比較相手の文字列.equals(比較対象の文字列);

str1.equals(str2)

で簡単に比較することができる。

文字列と文字列の比較 

実際に、「==」で比較した場合も含めて、どうなるかを見ていこう。

サンプルコード

public class StringSample4 {

    public static void main(String[] args) {
        String str1 = "朝"; //[1]
        String str2 = "朝"; //[2]
        String str3 = new String("朝"); //[3]
        String str4 = "朝日"; //[4]
        String str5 = str1 + "日"; //[5]

        //「==」演算子を使用
        System.out.println(str1 == str2); //[6]
        System.out.println(str2 == str3); //[7]
        System.out.println(str1 == str3); //[8]
        System.out.println(str4 == str5); //[9]

        System.out.println("---------------------------");
        
        //.equalsメソッドを使用
        System.out.println(str1.equals(str2)); //[10]
        System.out.println(str2.equals(str3)); //[11]
        System.out.println(str1.equals(str3)); //[12]
        System.out.println(str4.equals(str5)); //[13]
    }
}

実行結果

true
false
false
false
---------------------------
true
true
true
true

サンプルコードの説明

  • [1] String型の変数str1を宣言し、初期化。
  • [2] String型の変数str2を宣言し、初期化。
  • [3] String型の変数str3を宣言。明示的にnew演算子を用いてStringオブジェクトを生成し値を代入。
  • [4] String型の変数str4を宣言し、初期化。
  • [5] String型の変数str5を宣言し、初期化。str1と文字”日”を連結した文字列を代入
  • [6] str1とstr2を「==」演算子を用いて比較。
  • [7] str2とstr3を「==」演算子を用いて比較。
  • [8] str1とstr3を「==」演算子を用いて比較。
  • [9] str4とstr5を「==」演算子を用いて比較。
  • [10] str1とstr2を.equalsメソッドを用いて比較。
  • [11] str2とstr3を.equalsメソッドを用いて比較。
  • [12] str2とstr3を.equalsメソッドを用いて比較。
  • [13] str2とstr3を.equalsメソッドを用いて比較。

「==」演算子の場合

「==」演算子を用いて比較をしても[6]のように正しい結果が返ってくることもある。

しかし、これはJavaの内部処理でなるべくメモリを有効に利用しようとしているから起こることであり、正確な動きを保証しているものではない。

str1とstr2では、宣言と同時に同じ「朝」という文字で初期化している。

この場合、「Javaの内部で同じ文字を代入していることからオブジェクトの実体を共有する」という動きになっている。そのため、「==」演算子を用いて比較しても同じだというtrueの結果が返ってくることになる。

しかし、これはJavaの内部でメモリを有効利用するために作られた仕組みであって、==演算子が値の比較を行っているわけではない。

Str3では明示的にnew演算子を用いてStringオブジェクトを生成し値を代入しているので、生成されたオブジェクトの実体の共有は行われない。そのため値は等しくないというfalseが返ってくる。

同様に、str4とstr5には、同じ「朝日」という文字列が代入されているがstr4は最初から「朝日」という文字列を代入。str5はstr1の実体に「日」という文字を連結し代入しているため、比較した結果はfalseとなる。

equalsメソッドの場合

一方、Stringクラスの.equalsメソッドを使用した場合は、実体である値を比較しているので、どのパターンでも正しく比較されtrueの結果が返っている。 

文字列と文字列の比較は、分岐処理の際の条件として使われることが多い。

その際、比較演算子を正しく使用しないと正しい結果が返ってこなくなる。

また、.equalsメソッドを使用する場合に気を付けるべきことは、比較するStringクラスの文字列にnullが入っていないかをチェックすることを忘れないようにすることだ。実行した際にnullが入ってくるとプログラムは例外を発生させそこで動かなくなってしまう。 

まとめ

このページではJavaでの文字列の比較について、細かいところも含めてお伝えした。いかがだっただろうか?

参照型であることから、このように少し特殊な動きをする。初心者であっても、覚えておいた方がいい知識だ。

]]>
https://eng-entrance.com/java-basic-string-compare/feed 0
【初心者向け】Stringクラスによる文字列の処理の方法 https://eng-entrance.com/java-basic-string-string https://eng-entrance.com/java-basic-string-string#respond Tue, 04 Oct 2016 00:25:15 +0000 http://eng-entrance.com/?p=2911 Javaで文字列を処理するには、Stringクラスを使う。

このページではStringクラスを使って文字処理をするための方法を初心者の方向けに解説した。

Javaの基本として理解しておこう。

文字列処理のためのStringオブジェクトへの代入

Stringクラスの基本

複数の文字からなる文字列を表す型はStringクラスだ。

参照型であるStringクラスのオブジェクトへの値の代入は以下のように記述する。

String 変数名 = “あいうえお”;

サンプルコード

Stringクラスのオブジェクトを生成し、値を代入するサンプルコードを見てみよう。

public class StringSample2 {
  public static void main(String[] args) {
        String str = "こんにちは"; //[1]
        System.out.println(str); //[2]
        str = "こんばんは"; //[3]
        System.out.println(str); //[4]
    }      
}

実行結果

こんにちは
こんばんは

サンプルコードの説明

とても簡単に見えるが、これまでのモノとは少し違う。

100%理解しなくて構わないので、なんとなく把握しておこう。とりあえず、文字列はこうすると扱える認識でも初心者の方は構わないので、ここから下の説明は飛ばしてしまってもいいくらいだ。

(少し難しい)Stringクラスオブジェクト

実は、Stringはここまでで理解しているような整数型や文字型などの基本型とは違う。一見同じように見えるが、Stringは基本型ではなくて、参照型のオブジェクトだ。

詳しくは下記でお伝えしている。

Stringクラスは内部でオブジェクトを生成する仕組みを持っているため、ほかの基本型のように直接代入するように見える記述方法でオブジェクトが生成され値が代入される。

Stringクラスでは、一度文字列を代入するとその文字列を変更することはできない。

  • [1] String型の変数strを宣言し、初期化。→オブジェクトを生成し値を代入。生成されたオブジェクトのアドレスを変数に代入
  • [2] 変数strの値を出力。
  • [3] 変数str へ値を代入→新しいオブジェクトを生成し値を代入。生成された新しいオブジェクトのアドレスを変数に代入。
  • [4] 変数strの値を出力。

文字列「こんにちは」が「こんばんは」へ書き換わるのではなく、変数strに代入される値が「こんにちは」の参照値から「こんばんは」の参照値に変わる。

ここは少し違和感があるかもしれないが、理解していただきたい部分だ。サンプルコードを図で表現すると以下のようになる。

参照型

文字列の連結

Java言語での文字列の連結には以下の方法がある。

文字列 + 文字列

String.concat()

実際には他にも種類があるが、徐々に知っていけばいい。まずはこの2つだけ知っておこう。

文字列の連結のサンプルコード

サンプルコードを見てみる。

public class StringSample3 {
    public static void main(String[] args) {
        String str1 = "こんにちは。";// [1]
        String str2 = "山田さん。";// [2]
        String str3 = "お元気ですか?";// [3]
        String message;// [4]
        
        //「+」演算子を使用
        message = str1 + str2; // [5]
        System.out.println(message); // [6]
        
        //concatメソッドを使用
        message = message.concat(str3);// [7]
        System.out.println(message);// [8]
    }
}

実行結果

こんにちは。山田さん。
こんにちは。山田さん。お元気ですか?

サンプルコードの説明

  • [1] String型の変数str1の宣言と初期化。
  • [2] String型の変数str2の宣言と初期化。
  • [3] String型の変数str3の宣言と初期化。
  • [4] String型の変数messageの宣言。
  • [5] 変数messageに変数str1とstr2を連結した文字列を代入
  • [6] 変数messageの値を出力
  • [7] 変数messageの値にconcate()メソッドを利用して変数str3の文字列を連結
  • [8] 変数messageの値を出力

細かいところもお伝えしておくと、Stringクラスで表される文字列は変更できない。文字列の変更のためにStringBufferクラスが用意されている。

「+」演算子での文字列の連結は、内部的にはStringBufferクラスのappendメソッドを使用して文字列の連結を行っている。

例えばfor文などのループ処理の中で+演算子を使用した文字列の連結を行ってしまうと、そのたびにStringBufferオブジェクトを新しく生成してappendメソッドで連結を行うので、無駄なオブジェクトを生成することになり、処理の遅延の原因になったりするので注意が必要だ。

StringBufferクラスについては下記ページで詳しく解説している。

まとめ

このページでは文字処理のためのStringクラスについてお伝えしてきた。

基本データ型ではないが、同じように使える。よくわからなければ、参照型などの細かいところは後々理解していけばいい。まずはStringの使い方をざっくり理解しておこう。

]]>
https://eng-entrance.com/java-basic-string-string/feed 0
【はじめての】Stringクラスオブジェクトの作り方 https://eng-entrance.com/java-basic-string-object https://eng-entrance.com/java-basic-string-object#comments Tue, 20 Sep 2016 00:24:03 +0000 http://eng-entrance.com/?p=2743 このページでは文字列を扱うStringオブジェクトの生成方法とその使い方についてお伝えした。

標準クラスを使うときの基本を学べるので参考にしてほしい。

Stringオブジェクトの生成

Stringクラスは文字列を表す参照型の型である。

文字列は、”Hello”のようにダブルクォーテーション(“)で囲むことで表せる。

“123”のように数値を記述していてもダブルクォーテーションで囲まれていれば文字列ということになる。

参照型の場合、new演算子を使用して必要な領域をメモリ上に確保し(オブジェクトの実体の生成という)値を代入する必要がある。

Stringオブジェクトを生成する主な方法としては次の2つがある。

String 変数名 = new String(“あいうえお"); [1]

String 変数名 = “あいうえお”;  [2]

一般的には参照型を使用する場合は[1]のようにnew演算子を使用してオブジェクトを生成するが、Stringクラスの場合はすでにnew演算子を利用しない便利な仕組みが準備されているため、[2]の方法でオブジェクトが生成できる。

メモリ領域を有効に使うためにも[2]の方法が推奨される。

Stringオブジェクトの生成 サンプルコード

それではサンプルコードを見ていこう。

サンプルコード

public class StringSample1 {
    public static void main(String[] args) {
        String message ; [1]
        message = "おはようございます"; [2]
        System.out.println(message); [3]
    }
}

実行結果

おはようございます

サンプルコードの説明

  • [1] String型の変数messageの宣言
  • [2] 変数messageの初期化(※)
  • [3] 変数messageの値を出力

※変数には必ず一度値を代入する必要がある。これを初期化といい、初期化されていない変数がある場合、コンパイルエラーとなり実行できない

変数の宣言と初期化を同時に行うサンプルコード

変数の宣言と初期化を同時に行った時は次の通りだ。

サンプルコード

public class StringSample1 {
    public static void main(String[] args) {
        String message ="おはようございます" [1]
        System.out.println(message); [2]
    }
}

実行結果

おはようございます

サンプルコードの説明

  • [1] String型の変数messageを宣言し、初期化。
  • [2] 変数messageの値を出力

参照型の変数

整数を表すint型や文字を表すchar型は基本型なので、オブジェクトを生成せずに値を代入することができる。

しかし、Stringは参照型なので、前にも記述したように、値を代入して利用するにはオブジェクトの生成が必要になる。

基本型の場合は、型の大きさが決まっているので、値を入れるべき箱(メモリの使用量)が決まっている。そのため、まず宣言された大きさの領域を確保し、その中に値を直接代入する。

参照型の場合は、実際に値が代入されるまでどのくらいの大きさのものが代入されるかわからないため、変数の領域には実際の代入されたオブジェクトがある場所のアドレス(参照値)が代入され、そのアドレスをもとに値を参照する。

stringの参照

まとめ

このページではStringオブジェクトの生成方法についてお伝えした。

Stringは参照型というもので、intやcharと違ってオブジェクトにしないと使えないというのは覚えておこう。

]]>
https://eng-entrance.com/java-basic-string-object/feed 1
【Java入門】1分で理解する標準クラスとは? https://eng-entrance.com/java-basic-string-standardclass https://eng-entrance.com/java-basic-string-standardclass#comments Mon, 19 Sep 2016 23:50:40 +0000 http://eng-entrance.com/?p=2738 標準クラスとは、Java言語であらかじめ用意しているクラスライブラリのことだ。

このページでは「標準クラスとは」について詳しくお伝えした。Java初心者の方は参考にしていただければと思う。

標準クラスとは

標準クラスとは、Java言語であらかじめ用意しているクラスライブラリのことだ。

様々な機能のクラスが、機能ごとにパッケージというまとまりで用意されている。それぞれのパッケージやクラスと提供されている機能(メソッド)については、利用するJavaのバージョンに合わせたAPIドキュメントにて概要を参照することができる。

Java8のAPIドキュメントは下記から参照できる。

https://docs.oracle.com/javase/jp/8/docs/api/

エンジニアの入り口でもいくつもご紹介している。

例えば、文字列を扱うStringクラスもJava言語が用意した標準クラスである。StringクラスはJava.langパッケージに存在している。

Java.langパッケージとは

Java.langパッケージはプログラムを作成する上でよく使用される、基本的なクラスをまとめたものである。

通常、Java言語で用意された標準クラスであっても、プログラム中で利用する場合はimport文で利用することを宣言しなければならない。

しかし、Java.langパッケージはその記述を省略することができる。

Stringクラスとは

Stringクラスは複数文字、すなわち文字列を表す型である。

Java言語では、変数の型を基本型と参照型の2つに大きく分けることができる。

基本型には「1、2」などの整数を表すint型、「あ、い」等の1文字を表すchar型などがある。

参照型にはString型や日付型などがあり、オブジェクトを参照する型を参照型という。

基本型と参照型の大きな違いは、変数に代入された値を直接格納するかそうでないかという点である。

基本型の場合、型の大きさ(バイト数)が決まっているため直接値を代入することができる。しかし、文字列の場合、その長さは文字数によって変わるため、決めることができない。そのため、実際の文字列は別の場所に格納し、変数にはその実際の値が格納されたメモリ上の住所のようなもの(メモリのアドレス)が代入されている。

詳しい使いかはまた見ていこう。

まとめ

このページではJavaの標準クラスとは何かについてご紹介した。

特に、Java.langパッケージは何もせずとも自由にJavaプログラム内で使うことができる。

]]>
https://eng-entrance.com/java-basic-string-standardclass/feed 2