|
|
文字列と数値 |
H.Kamifuji . |
プログラムの中で値として使用される文字列や数値について使い方を確認していきます。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10-)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
Javaでは文字と文字列は別のものとして扱っています。まずここでは文字について見ていきましょう。 文字は1つの文字のことであり「a」や「あ」などが文字となります。プログラムの中で値として使用される文字は文字リテラルという呼び方をすることもあります。 リテラルリテラルという言葉は文字リテラルの他にも数値リテラルや文字列リテラルなどのように使われるのですが、「の値」と読み替えておけばほぼ間違いありません。つまり文字リテラルは文字の値のことです。「リテラル」 とは 「の値」プログラムの中では演算子や変数や制御文など色々なものを組み合わせて記述しますが、数値や文字など実際の値も記述されます。このような値のことをリテラルといいます。文字リテラルと書いてある場合は文字の値と読み替えておいて下さい。 文字の値を表現するではプログラムの中で文字の値を記述する場合はシングルクォーテーション(')で囲んで表現します。'a' 'あ''a'や'あ'のように1つの文字をシングルクォーテーションで囲んだものが文字リテラルとなります。 文字は1文字なので次のように2つ以上の文字を('')で囲んだ場合はエラーとなります。 'ab' '文字'では簡単なサンプルで試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample1_1 { public static void main ( String[] args ) { System.out.println( "a" ); System.out.println( "あ" ); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Num]$ java JSample1_1 a あ [xxxxxxxx@dddddddddd Num]$文字の「a」や「あ」が出力されました。 では今度は2つの文字をシングルクォーテーションで囲んだ場合を確認しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample1_2 { public static void main ( String[] args ) { System.out.println( 'ab' ); } } コンパイルを行うと次のようなエラーが表示されます。 [xxxxxxxx@dddddddddd Num]$ javac JSample1_2.java JSample1_2.java:3: エラー: 文字リテラルが閉じられていません System.out.println( 'ab' ); ^ JSample1_2.java:3: エラー: ';'がありません System.out.println( 'ab' ); ^ JSample1_2.java:3: エラー: 文字リテラルが閉じられていません System.out.println( 'ab' ); ^ JSample1_2.java:3: エラー: ';'がありません System.out.println( 'ab' ); ^ エラー4個 [xxxxxxxx@dddddddddd Num]$文字は今回のサンプルのように1文字だけ画面に出力したい場合や、入力された文字列から1文字ずつ取り出し、特定の文字と比較するような場合などに使われます。 |
このページではJavaで文字の値をどのように扱っているかについてもう少し詳しく記述します。もし分からない部分があればこのページは飛ばして次へ進んで頂いても構いません。 Javaが使用する文字エンコーディングJavaに限らずコンピュータにおいて文字を表現するためまず文字の集合を用意されました。これは使用する文字を全て集めたもので、例えばアルファベットしか必要無い場合もありますし日本語の文字も全て使いたい場合もあります。国によっても使う文字の集合は異なるわけです。次に文字の集合に含まれる各文字に対し数値を割り当てます。コンピュータの世界では何事も数値に置き換えて処理しなければなりません。この数値を文字コードと呼びます。ある文字の集合に対してどのように文字コードを割り当てるのかを定めたものが文字エンコーディングと呼ばれるものです。例えば良く使われるShift_JISやEUC-JPは日本語も含めた文字の集合に対して文字コードを割り当てたものですし、ASCIIはアルファベットと数値などの文字の集合に対して文字コードを割り当てたものです。 そしてJavaにおいては文字の集合としてUnicodeを使用しています。Unicodeとは簡単に言えば全世界で使用する文字を全て集めた巨大な文字の集合です。そしてUnicodeに対する文字エンコーディングとしてはUTF-16符号化形式(多分です)というものを使っています。 文字コードを使う文字と文字コードは一対一ですので、文字の代わりに文字コードを使うことができます。例えば「a」や「あ」をJavaで使用している文字コードに直すと次のような値となります。'a' == 97 (0x0061) 'あ' == 12354 (0x3042) '渓' == 28179 (0x6E13)※括弧の中は16進数表記です。 文字の'a'と文字コードである数値の97はJavaの内部では同じものとして扱います。よって次の3つは同じことを記述しています。 char c; c = 'a'; c = 97; c = 0x61;※charというのは文字型の基本データ型です。ここではそれほど気にしないで下さい。 ただし次のように記述してしまうと違った意味になってしまいます。 System.out.println(97);文字の'a'のことではなく数値の97だと解釈されてしまいます。このような場合には文字を次のような形式で記述して下さい。 '\uxxxx'「xxxx」の部分には16進数の文字コードを指定します。コードは必ず4桁で指定して下さい。例えば'a'であれば'\u0097'となり、'あ'であれば'\u3042'となります。 '\u0061' '\u3042'キーボードから入力できないような文字を使用する場合などに文字コードを使って記述すると便利です。 では簡単なサンプルで試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample2_1 { public static void main ( String[] args ) { System.out.println( "a" ); System.out.println( "\u0061" ); System.out.println( "\u0041" ); System.out.println( "\u3041" ); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Num]$ java JSample2_1 a a A ぁ [xxxxxxxx@dddddddddd Num]$文字コードを使った記述方法でも同じように文字を出力できました。 |
文字が1つの文字を表していたのに対して文字列は複数の連続する文字を表します。例えば「こんにちは」や「Hello」など複数の文字が連続するものが文字列となります。 文字列を画面に出力する場合など、文字列を値として使用する場合には文字列リテラルという呼び方をすることもあります。 文字列の値を表現するプログラムの中で文字列の値を記述する場合はダブルクォーテーション(")で囲んで表現します。"こんにちは" "Hello"「"」から「"」までに記述された文字の集まりが文字列となります。 ※他のプログラミング言語の場合「"」の代わりに「'」で文字の集合を囲うことで文字列を表すことができるものもありますが、Javaでは文字を表す場合に「'」は使用しますので文字列には必ず「"」を使って下さい。 1つだけの文字からなる文字列と文字はいっけん同じように見えますが元になっているデータ型が異なるためまったく別のものとなります。詳しくは別のページで確認します。 では簡単なサンプルで試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample3_1 { public static void main ( String[] args ) { System.out.println( "こんにちは" ); System.out.println( "Hello" ); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Num]$ java JSample3_1 こんにちは Hello [xxxxxxxx@dddddddddd Num]$ |
文字を文字列を値として使用する場合、キーボードから入力できないような文字があります。例えば改行です。文字列の中で改行をキーボードから入力した場合は次のようになります。 System.out.println("こんにちは お元気ですか");上記の例では「こんにちは」と「お元気ですか」の間で改行を入力しようとしましたがキーボードで「Enter」キーを押してもプログラムが改行されるだけです。文字列の途中で改行するとコンパイルエラーとなります。 そこで改行などキーボードから入力できない文字などは「\」+特定の文字の組み合わせで表現します。例えば改行は「\n」という「\」と「n」の組み合わせによって表すことができます。 System.out.println("こんにちは\nお元気ですか");上記では「こんにちは」と「お元気ですか」の間に「\n」が記述されています。「\n」は改行を表しますので実際に実行してみると次のように画面に出力されます。 こんにちは お元気ですかこのようにキーボードから入力できない文字を他の文字の組み合わせで表現したものをエスケープシーケンスといいます。 エスケープシーケンスの一覧エスケープシーケンスとしては次のようなものが定義されています。
改行や水平タブについてはキーボードから入力できない文字のためのエスケープシーケンスですが、「\'」や「\"」については次のような理由からエスケープシーケンスが用意されています。 文字を例に考えてみます。文字は1つの文字をシングルクオーテーション(')で囲うことで表していました。例えば「'a'」や「'各'」などです。ここで「'」を表す文字を表現しようとすると「'''」となります。 System.out.println(''');文字を表すには「'」から「'」までに1つの文字を囲んで表現しますが、このプログラムでは2番目の「'」が文字ではなく文字の終端を表す「'」だと解釈されてしまいます。その結果上記のように記述すると「'」と「'」の間にも文字が記述されていないと言うはエラーとなります。 このような場合に「'」の代わりに「\'」を記述すると、この「'」は文字の終端を表す「'」ではなく1つの文字としての「'」として扱われます。 System.out.println('\'');上記の場合には1番目と3番目の「'」の間に文字の「'」が記述されているものとして処理されます。 また文字列は「"」から「"」までの間に記述された文字の集まりですので、文字列の中で「"」を使用したい場合にも「"」の代わりに「\"」を使用します。 System.out.println("この机は\"1500円\"です");エスケープシーケンスは「\」+特定の文字で表しますので文字や文字列の中で「\」を使用したい場合にも注意が必要です。例えば「\」という文字の後に「n」という文字を続けたい場合、「\n」と記述してしまうとこれは改行を表すエスケープシーケンスとして扱われてしまいますので「\」がエスケープシーケンスの1文字目ではなく単なる文字の「\」としたい場合には「\\」と記述する必要があります。 System.out.println("改行のエスケープシーケンスは\\nです");どのように出力されるのかはサンプルで確認して下さい。 では簡単なサンプルで試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample4_1{ public static void main(String args[]){ System.out.println('\''); System.out.println("この机は\"1500円\"です"); System.out.println("改行のエスケープシーケンスは\nです"); System.out.println("改行のエスケープシーケンスは\\nです"); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Num]$ java JSample4_1 ' この机は"1500円"です 改行のエスケープシーケンスは です 改行のエスケープシーケンスは\nです [xxxxxxxx@dddddddddd Num]$ |
プログラムの中で計算をしたり、繰り返す回数をカウントする場合などに使用するのが数値です。プログラムの中で値として使用される数値は数値リテラルという呼び方をすることもあります。 プログラムの中で数値の値を記述する場合は単に数値を記述します。 100 3.14文字や文字列などのように「'」や「"」などで囲う必要はありません。逆に数値を「"」などで囲った場合には数値ではなく数値を表す文字からなる文字列になってしまいます。 215 -> 数値 "215" -> 文字列上記では上は215という数値ですが、下は「215」と言う文字列です。文字列では計算を行ったりすることはできません。 数値には整数と浮動小数点数の2種類があり、それぞれ整数リテラルや浮動小数点数リテラルと呼ばれることもあります。整数リテラルは100や45などで、浮動小数点数リテラルは3.14や10.2などです。より詳しいことはデータ型のページで解説します。 では簡単なサンプルで試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample5_1{ public static void main(String args[]){ System.out.println(123); System.out.println(1.414); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Num]$ java JSample5_1 123 1.414 [xxxxxxxx@dddddddddd Num]$ |
整数の値はは10進数の他に8進数や16進数で表すことが可能です。 8進数で数値を表すには0で始まり0から7までの数字で数値を表します。 015 033216進数で数値を表すには'0x'又は'0X'で始まり0から9までの数字かAからFまでの記号(小文字のaからfでも可)で数値を表します。 0x3fa 0x55例えば10進数で10と記述する代わりに8進数で012と記述しても16進数で0xAと記述してもプログラム的には何ら違いはありません。表記の仕方が違っているだけです。プログラムを記述する上で10進数ではなく16進数を使った方が分かりやすい場合には16進数を使って記述して下さい。 なお8進数や16進数で記述した数値が10進数で表すとどのようになるのかは、このページの最後に対照表を載せておきました。 では簡単なサンプルで試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample6_1{ public static void main(String args[]){ System.out.println(012); System.out.println(0x5F); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Num]$ java JSample6_1 10 95 [xxxxxxxx@dddddddddd Num]$8進数や16進数で表記した場合でも、単に出力した場合は10進数に換算した値で出力されます。 対照表10進数と8進数や16進数の対照表を少し掲載しておきます。
|
浮動小数点数の値は小数点形式と指数形式で表すことが可能です。 小数点形式の場合は整数部分と小数部分をピリオドを使って次のように表します。 32.45 0.0038指数形式の場合は基数が10として次のように表します。 3.2e2 2.4e-3「3.2e2」とは「3.2×102」のことであり「320.0」です。また「2.4e-3」とは「2.4×10-3」のことであり「0.0024」です。 では簡単なサンプルで試してみます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample7_1{ public static void main(String args[]){ System.out.println(3.2e2); System.out.println(2.4e-3); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Num]$ java JSample6_1 320.0 0.0024 [xxxxxxxx@dddddddddd Num]$ |
|