Javaコラム Javaエンジニアのためのお役立ちコラム

Javaのbyte型を基本から解説!byteとStringは相互に変換できる

2020年10月25日
SE
Javaのbyte型はどのように使用するのでしょうか。
PM
byte型の使用目的はバイナリデータを扱うことです。

Javaのbyte型とは?


Javaのbyteはプリミティブ型(基本型)の一つで、-128~127までの範囲を持ちます。名前通りサイズは1バイトで、基本型の中ではbooleanの次にデータサイズが小さくなっています。byte型の使用目的はバイナリデータを扱うことです。

バイナリデータとは人間が読めるテキストデータ等とは違い、人間が見ても分からない生のデータのことです。例えば画像ファイルをテキストエディタで無理矢理開くと、意味不明な文字の羅列が表示されますが、これがバイナリデータです。

全てのデジタルなデータはbyte型

より正しく言えば、画像データに限らず、コンピュータで扱う全てのデジタルなデータは数字で表されるバイナリデータです。よってバイナリを表すbyte型を知ることは、プログラミングの基本を学ぶ上で重要と言えるでしょう。

JavaではString型の文字列もbyteで構成されています。そのため以下のようにbyte配列からString型の文字列を生成できます。

byte[] ary = { 0x61, 0x62, 0x63, 0x64, 0x65 };
System.out.println(new String(ary));

実行結果は、

abcde

になります。

byteとStringは相互に変換できる

上のJavaサンプルの数値についている「0x」は16進数を表します。そしてaはUnicodeでは0x61で表されます。Java文字列はUnicodeのbyte型のデータで構成されているのです。逆に以下のように文字列をbyte型の配列に変換することもできます。

byte[] ary = “”abcde””.getBytes();
for (byte b : ary) {
System.out.print(“” 0x””+Integer.toHexString(b));
}

結果は、

0x61 0x62 0x63 0x64 0x65

となります。なおfor文の中で16進数の変換を行わずにそのまま表示すると、

System.out.print(“” “”+b);

以下のように10進数で表示されます。

97 98 99 100 101

byte型の注意点

Javaのbyte型は-128から127までの値しか取れません。その範囲を超えるとどうなるのでしょう。以下のJavaサンプルを実行してみてください。

byte b = 127;
b++; // 127に1を加算
System.out.println(b);
b–; // -128に1を減算
System.out.println(b);

結果は、

-128
127

になります。127に1を加算すると-128になり、-128に-1を減算すると127になってしまいます。最大値と最小値がつながって、帯のようなループ状になっているということです。

byte型変数にbyte以外の型の数値を代入した場合

上のような結果は、byte型の変数に他の型の変数をキャストして代入する時にも表れます。以下のJavaサンプルをご覧ください。

short s = 128;
byte b = (byte)s;
System.out.println(b);
int i = 129;
b = (byte)i;
System.out.println(b);
float f = 130.0f;
b = (byte)f;
System.out.println(b);
double d = 131;
b = (byte)d;
System.out.println(b);

byteよりサイズが大きい方に、byte型に入れられない128以上の数を(byte)でキャストして代入しています。結果は、

-128
-127
-126
-125

となります。byteの範囲を超える数を入れると、最大なら最小、最小なら最大に値がはみでるということです。

byte以外の型の変数にbyte型変数を代入した場合

逆にbyte型の変数を他の型の変数に代入するとどうなるのでしょう。以下のJavaサンプルをご覧ください。

byte b = 127;
short s = b;
System.out.println(s);
int i = b;
System.out.println(i);
float f = b;
System.out.println(f);
double d = b;
System.out.println(d);

結果は以下になります。どの型もbyteよりサイズが大きいので、キャストも不要で問題なく変換できています。

127
127
127.0
127.0

Byteクラスについて

Javaには基本型のbyteの他に、Byteというクラスがあり、byte型の数値をクラスとしてラップしたい時に使用します。以下のJavaサンプルでは、-128というbyteの値からByteクラスのインスタンスを生成して、そこからbyteの値を取り出しています。

Byte bObj = Byte.valueOf((byte)-128);
byte b = bObj.byteValue();
System.out.println(b);

結果は以下になります。

-128

オートボクシングで代入するだけでByteクラスを生成できる

Javaにはオートボクシングという基本型からクラスを生成する機能があります。以下のように値をByte型に代入するだけで、Byte型のインスタンスを生成できます。

Byte bObj = -128;
System.out.println(bObj.byteValue());

Byte型のような基本型をラップするクラスは、他にもIntegerなどがあります。こういったクラスが役立つこととして、nullの状態を持たせることができるという点です。

基本型は0や-1にもその値には意味があるので「無い」という状態としては扱えませんが、ラップするクラスの場合、nullなら「無い」という状態を表せます。

Byteクラスならコレクションが使える

他にByteクラスを使う理由は、以下のJavaサンプルのようにコレクションを使えるという点です。なお、これを実行する場合はソースの先頭に「import java.util.ArrayList;」が必要です。

ArrayList list = new ArrayList();

list.add(Byte.valueOf((byte)10));
list.add(Byte.valueOf((byte)20));
list.add(Byte.valueOf((byte)30));

for (Byte b : list) {
System.out.println(b.byteValue());
}

結果は以下になります。

10
20
30

このサンプルと同じことは配列でもできますが、ArrayListを使えば検索やソートなどの様々な機能を使うことが可能です。

Byteクラスの比較の方法

Byte型同士を比較する場合は、以下のように==ではなくequalsメソッドを使用します。==を使うと中身の値の比較ではなく、参照のアドレスが等しいかどうかという別の意味になってしまいます。

Byte a = Byte.valueOf((byte)10);
Byte b = Byte.valueOf((byte)10);
if (a.equals(b)) System.out.println(“”値が等しいです。””);

Byte型同士の大小を比較する場合は、以下のようにcompareToを使用します。

System.out.println(“”compareToの結果””+a.compareTo(b));
System.out.println(“”compareToの結果””+a.compareTo(Byte.valueOf((byte)8)));
System.out.println(“”compareToの結果””+a.compareTo(Byte.valueOf((byte)12)));

実行結果は以下のように、差分が表示されます。

compareToの結果0
compareToの結果2
compareToの結果-2

SE
Javaのbyteのことがよく理解できました。
PM
Javaのbyteはブログラミングをする上での基本です。バイナリデータを扱う前にバイナリを表すbyte型の使い方を知っておきましょう。

byte型は全てのデータの基本

Javaのbyteについて解説しましたが、ご理解頂けましたでしょうか。全てのデジタルデータはバイナリデータで表され、それはbyte型として処理することができます。

また、byteを知ることはプログラミングの基本を知ることになります。ここで紹介したことを活用して、ぜひJavaのbyteをマスターしてください。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags