ITエンジニアのプレイングマネージャー化応援サイト

7.文字と文字列の扱い

この記事では、当社 の新人エンジニア研修の参考にJava8を解説します。

前回は配列の作成と使用について解説しました。

今回は文字と文字列の扱いについて解説します。

 

1.文字と文字列の違い

まれに混同される方がいますが、Javaにおいて文字と文字列は全く別物です。

以下のサンプルプログラムを見てください。

結果


どちらも結果は同じですが、c1にはひらがな「あ」の文字コードが、str1には文字列「あ」への参照が入っています。

文字はプリミティブ型、文字列は参照型と言い換えても同じことです。

試しに以下のようなプログラムを実行すると

コンソールには「あ」のUTF-8のコードを10進表記した「12354」が表示されます。

 

2.Stringクラス

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

そのためimport文なしでいきなりソースコード中に記述できるのでした。

Stringは次のようにnew演算子とString()というコンストラクタを使ってインスタンス化することもできます。

※new演算子とコンストラクタについては9.インスタンスの活用のところで詳しく学びます。

しかし、文字列はとても頻繁に使いますので、以下のように簡便なインスタンス化方法も用意されています。

Stringは、new演算子を使わなくてもインスタンスを作れる特殊なクラスです。

ただし、実はこの二つのインスタンスの作り方では微妙な違いがあります。

 

3.Stringクラスの同一性と同値性

以下のサンプルプログラムを見てください。

結果

false
true

 

ここで、str1~4は参照です。

参照が指し示しているのは”Hello”が格納されている”メモリのありか”です。

str1とstr2は異なる2つのインスタンスが作られています。

ですから、それぞれが格納されているメモリのありかも違っていて、その結果上記のfalseが表示されるのです。

対して、str3とstr4では同じ1つのインスタンスを参照しています。

実は、str4を=演算子でインスタンス化したとき、メモリの中を検索して、

同じ文字列”Hello”があれば、それを再利用しているのです。

その結果、trueが表示されたのでした。

 

複数の変数が同じインスタンスを参照している性質のことを同一性といいます。

複数の変数が同じインスタンスを参照してはいないけれど、同じ値を持っていることを同値性といいます。

同一性は上記のサンプルプログラムのように==演算子で判定できます。

一方、参照先にあるインスタンスが同じ値を持っているか判定するにはStringクラスのequalsメソッドを使う必要があります。

文字列の同値性の検証にはequalsメソッドを使います。

以下、同値性を検証しているサンプルです。

結果

false
true

この後、研修が進むと、例えばユーザーがキーボードから入力したパスワードとデータベースに格納されているパスワードが等しいかどうか?というような判定をする時が来ます。

その時のためにequalsメソッドを使わなければならないということを理解してください。

 

4.Stringクラスは不変性(イミュータブル)である

もう少し、Stringクラスの特殊性の話を続けたいと思います。

以下のサンプルプログラムを見てください。

<結果>

Hello World

このとき、表示結果には影響ありませんが、5行目でstr1という変数が一旦捨てられて、同じ名前のstr1という変数が作り直されているのです。

実は、Stringクラスのインスタンスは一度作ったら中身を変えられないのです。

このような性質を不変性:イミュータブルといいます。

それを証明する次のようなサンプルコードを見てください。

結果

false

もし8行目でstr1に”World”を代入した時点で参照はそのままで参照が指し示す値だけを上書きしたとしたら、trueとなるはずです。

ですが”World”を代入した時点で(名前は同じ)新たな参照が作成されたため、str1とstr2の参照値は異なりfalseとなった訳です。

これがString型がイミュ―タブル(不変)であるということです。

イミュータブルというのが難しければ、一度だけ内容を書き込むことのできる記憶装置、PROM (Programmable ROM) をイメージいただくと良いかもしれません。

さて、実務においてこのことはどのような問題があるでしょうか?

 

例えば、大量の文字列の結合を繰り返す場合にパフォーマンスが悪化します。

何千何万回と文字列を結合するような場合には、Stringクラスではなく、StringBuilderクラスのappendメソッドを使うことをお勧めいたします。

 

5.Stringクラスのメソッド

Stringクラスには、文字列を扱うための便利なメソッドが用意されています。

そのほんの一部を紹介します。

結果

17
11
-1
true
false
新人SEのためのJava研修

lengthメソッドは、長さという意味なので文字数を返します。

indexOfメソッドは、文字列を配列としてみたときの添え字の値のうち、実引数の文字列が最初に現れたindex(添え字)を返します。

containsメソッドは、含むという意味なので実引数の文字列を含むかどうかを返します。

replaceメソッドは、replace(置き換え)という意味ですので文字通りですね。

 

また、当社の新人研修では大きな数値を扱うとき、3桁カンマで表示するようにお願いすることが多いのですが、

それは、このように実現できます。

結果

123,456,789

ここで、注目していただきたいのは、メソッドの呼び出し方です。

String.format(“%,d”, price)

Stringは先頭文字が大文字になっていますね。

これは、クラスですね。

クラスに属するメソッドということでクラスメソッドまたは、スタティック(Static)メソッドと呼ばれます。

Staticは静的という意味で、反意語はDynamic(動的)です。

ここでは、Staticはあらかじめ用意してあるメソッドという意味です。

動的に作り出したインスタンスが持つメソッドではないという意味です。

 

クラスメソッドは、

クラス名.メソッド名

という形で呼び出すことができます。

一方、

str.length()

のようにインスタンスを作ってから、その個々のインスタンスのメソッドを呼び出すのをインスタンスメソッドといいます。

インスタンスメソッドは、

インスタンス変数名.メソッド名

という形で呼び出します。

 

ここでは、なぜ、クラスメソッドとインスタンスメソッドがあるのかを考察してみましょう。

str.length()は、str(その中身は”新人エンジニアのためのJava研修”)自身が持つ文字列の長さということですから、インスタンスメソッドがふさわしいのです。

インスタンスが変われば文字列の長さも変わりますね。

 

一方、String.format()はintを整形してStringを得るメソッドです。

この処理にはStringのインスタンスは一切関与していません。

具体的な文字列は最終的な結果として表示される(123,456,789)以外には出てきていないのです。

そのため、String.format()はインスタンスではなくクラスに属すると考えて、クラスメソッドであるべきなのです。

intに対応するStringを生成するのは、インスタンスには関係のない決まりきった内容の処理だからです。

 

6.エスケープシーケンス

例えばHello と World の間に改行を入れたい場合はどうしたらいいでしょうか?

以下のように、改行を入れたいところには、¥nを入れる必要があります。

<結果>

Hello
World

特別な記号や出力方法を制御するためには「¥」記号を使います。

この ¥nなどの文字を、「文字本来の意味から逃がした文字列」という意味で、エスケープシーケンス(escape sequence)と呼びます。

この¥記号は環境によっては\記号を使います。このWebページ上でも\記号で表記されているはずです。

なぜなら、インターネットはUNIX(Linux)中心のネットワークなので、UNIXの表記が\記号なのですね。

もともと英語圏では\記号を使うのですが、日本語圏では¥記号を使う必要があったため、\記号を¥記号に置き換えたという経緯があります。

 

当社の新人研修で使用する可能性のあるエスケープシーケンスを紹介します。

 

エスケープシーケンス

意味

\n

改行

\t

水平タブ

\\

\

\’

\”

覚える必要はありませんが、上手く表示できない文字があった時に、ここに戻れるようにしておきましょう。

 

なお、文字列の結合に「+」を使うことの問題については、以前3.演算子のところでお話ししましたので忘れてしまった方は見直すようにしてください。

ここまで理解できたら以下の練習問題を解いてみましょう。

5.文字と文字列の扱い

 

今回は文字と文字列の扱いについて見てきました。

次回は、今回も少し出てきたクラスメソッド(スタティックメソッド)について学びましょう。

 

JavaSE8の解説に戻る

新入社員研修ポータル

IT企業の人財育成に関することなら全てお任せ下さい TEL 0120-559-463 受付時間 10:00 - 17:00 (土・日・祝日除く)

ZOOMを使った遠隔研修メニュー(PDFが開きます)

ZOOMを使った遠隔研修

新人エンジニアのためのJavaタイピングゲーム

新人プログラマのためのプログラミング動画

YouTubeチャンネル

お問い合わせはこちらから

    お名前 (必須)

    メールアドレス (必須)

    題名(件名)

    メッセージ本文

    確認画面は表示されません。上記内容にて送信しますので、よろしければチェックを入れてください。

    新入社員研修ポータル

    PAGETOP
    Copyright © Say Consulting Group, Inc. All Rights Reserved.