Java – 配列 – 初期化

イニシャライザーによる初期化

全要素が同じ型の配列をイニシャライザーで初期化する書き方。typeはプリミティブ型でも参照型でもよい。

type[] arrayName = {emelent1, emenent2, ...};

newによる初期化

newによる配列インスタンスの生成の書き方。typeはプリミティブ型でも参照型でもよい。

type[] arrayName = new type[length];

以下の例では、配列を生成した後に一つずつ要素を定義している。

newによる初期化直後の値はプリミティブ型ならそれぞれのデフォルト値、参照型ならnullになる。

newによる初期化とイニシャライザー

配列宣言時ではなく、宣言済みの配列変数をイニシャライザーで初期化する書き方。

単にイニシャライザーで代入しようとするとエラーになるので、newによる配列の生成とイニシャライザーによる定義を同時に行う。

1つ目のint[]に関してはイニシャライザーによる初期化と同じだが、2つ目のString[]のように一度宣言された変数に対して新たな配列で初期化する場合に有効。

 

Java – プリミティブ型のリテラル

論理型

論理型のリテラルはtruefalseの2つ。

整数型

int/short/byte

各基数による表現

intの範囲以内の整数は10進、2進、8進、16進で表現可能。

8進表現は頭に’0‘を付ける。以下の表現は8進で表現できない値を指定していることになって、エラーになる。10進や16進表現で要注意。

  • 0809→範囲外
  • 0a0bなど→構文エラー
基数 範囲
10進 63 -2147483648~2147483647
2進 0b111111 0b0
0b11111111111111111111111111111111
8進 077 00037777777777
16進 0x3f 0x00ffffffff

整数系のリテラルは、各型で表現できる範囲とビットパターンとの関係で注意が必要。

たとえばbyte型の表現範囲は−128~127で、当然以下のような代入は可能だが、これを超える値は代入できない。

一方、2進や16進で表現した場合のリテラルは、型によって解釈の仕方が変わるため、代入結果の値に注意が必要。

たとえば2進数0b1111|1111(16進数0xff)は、byte型なら2の補数表現で−1、short型やint型など9ビット以上を扱えるなら、9ビット目以上が0で埋められて255となる。

最上位ビットが8ビット目や16ビット目でそれが1の場合、正数で解釈できる型になり、敢えて補数でマイナス表現としたいときには(byte)などでキャストする必要がある。

符号

各表現に+/-をつけることができて、−をつけると負数になる。

各基数による表現を正規表現で表すと以下のような感じか。

10進 ^[+-]?[1-9][0-9]*$(ただし範囲内)
2進 ^[+-]?0b0*1[01]{0,31}$
8進 ^[+-]?0+[1-4]?[0-7]{0,10}$
16進 ^[+-]?0x0*[0-9A-Fa-f]{0,8}$

long

long型の整数は末尾にl/Lをつける。

  • int型の範囲内の数でも末尾にLをつけるとlong型になる
  • int型の範囲を超える数は末尾にLが必須。

8進表記の不思議

8進数の場合が不規則。以下の様に2進表記の32ビットを3ビットごとに区切れば8進表示となる。

0b01|11-1|111|-111|1-11|11-1|111|-111|1-11|11-1|111
= 017777777777

0b11|11-1|111|-111|1-11|11-1|111|-111|1-11|11-1|111
= 037777777777

これから、8進表示の整数リテラルの上限は037777777777(10進で−1)となりそうだが、実際には047777777777まで通る。

実数型

double/float

Javaの実数型は浮動小数点形式のfloatdoubleの2つ。

小数点表示をした場合はdoubleとして解釈され、これにfをつけるとfloatで解釈される。

小数点と整数部か小数部のいずれかがあれば実数型に解釈される。

整数表現にfをつけるとfloatdをつけるとdoubleに解釈される。

文字型

char

文字指定

文字リテラルは、1文字をシングルクォート(')で囲む。全角文字もそのまま。2文字以上はエラー。

ダブルクォートで囲まれた場合は文字列(String)であり、char型ではない。charはプリミティブ型、Stringは参照型なのでキャストもできない。

エスケープ

シングルクォートや改行コード、タブコードなどの特殊文字はエスケープして定義する。

ユニコード指定

文字リテラルは、ユニコードのコードポイントでも指定可能。その場合、シングルクォートの中で\uでコードポイントを指定する。

ただしシングルクォートのコードポイント\u0027を指定すると文字定数が無効のエラーになる。ユニコードがコンパイルされたときに'''というリテラルになるためか。

 

Java – プリミティブ型

論理型

boolean

true/falseの二値。2値を表すのには1ビットで十分だが、実装上の内部表現については明確に定められていないらしい。

  • リテラル表現はtruefalse
  • 比較式の評価結果は論理値を持つ
  • 他の型へはキャストできない

数値型(整数型)

byte

8ビットの符号付き2進数で表現可能な整数で、範囲は−128~127。内部表現のサイズは1バイト。

  • byte型で表現可能な最大値127を超えると8ビット目が1となって負数になる
  • byte型で表現された−1(0b11111111)の演算結果がこれを超える場合、9ビット目以上が無視される
  • 符号なしで8ビット目が1となるリテラル(0b10000000x80)以上の数はint型で解釈され、byte型へのキャストが必要
    • 8ビット目が1のリテラルをbyte型にキャストした場合、負数とみなされる

short

16ビットの符号付き2進数で表現可能な整数で、範囲は−32768~32767(約3万)。内部表現のサイズは2バイト。

  • short型で表現可能な最大値32767を超えると16ビット目が1となって負数になる
  • short型で表現された−1(0bffff)の演算結果がこれを超える場合、17ビット目以上が無視される
  • 符号なしで16ビット目が1となるリテラル(0x8000)以上の数はint型で解釈され、short型へのキャストが必要
    • 16ビット目が1のリテラルをshort型にキャストした場合、負数とみなされる

int

32ビットの符号付き2進数で表現可能な整数で、範囲は−2147483648~2147483647(約21億、109オーダー)。内部表現のサイズは4バイト。

  • int型で表現可能な最大値2147483647を超えると最上位ビットが1となって負数になる
  • int型で表現された−1(0bffffffff)の演算結果がこれを超える場合、33ビット目以上が無視される
  • 符号なしで32ビット目が1となるリテラル(0x80000000)以上の数は、そのままint型の負数として解釈される

long

64ビットの符号付き2進数で表現可能な整数で、範囲は−9223372036854775808~9223372036854775807(約920京、1018オーダー)。内部表現のサイズは8バイト。

  • 与えるリテラルが16ビット以内の数値の場合、int型で解釈され、負数の場合は負数として64ビットに拡張される
  • 与えるリテラルが17ビット以上の数値の場合、リテラルには末尾にL/lを付ける必要がある
  • 与えるリテラルが65ビット以上の数値を扱うことはできない
  • long型で表現可能な最大値9223372036854775807を超えると最上位ビットが1となって負数になる
  • long型で表現された−1(0bffffffffffffffff)の演算結果がこれを超える場合、65ビット目以上が無視される

数値型(実数型)

float

32ビット(4バイト)の浮動小数点数で、−3.4028235×1038~−1.4×10−45、1.4×10−45~3.4028235×1038の範囲の実数を扱える。

  • 内部表現はIEEE754、符号1ビット、指数部8ビット、仮数部23ビット
  • 最大値はFloat.MAX、最小値はFloat.MINで取得できる
  • 最大値を超える値はInfinity、絶対値が最小値を下回る値は0.0となる

double

64 ビット(8バイト)の浮動小数点数で、−1.7976931348623157×10308~−4.9×10−324、4.9×10−324~1.7976931348623157×10308の範囲の実数を扱える。

  • 内部表現はIEEE754、符号1ビット、指数部11ビット、仮数部52ビット
  • 最大値はDouble.MAX、最小値はDouble.MINで取得できる
  • 最大値を超える値はInfinity、絶対値が最小値を下回る値は0.0となる

文字型

char

16ビットのユニコード1文字を扱う。シングルクォートで囲んだ1文字のほか、ユニコードなら\u0000\uffff、10進数なら0~65535。