この記事はSRA Advent Calendar 2021の1日目の記事です。
こんにちは! 関西事業部の佐々木です。
#3年ぶりのLTSバージョン
2021年の9月にリリースされたJava 17は、2018年リリースのJava 11以来のLTSバージョンになります。
(実際にLTSとするかどうかはJDKのディストリビュータによりますが)
LTSなので当然適用されることも多くなりそうなJava 17ですが、どのような変更点があるのか気になるところです。
JDK 11からの全ての追加APIを知りたい場合は
https://docs.oracle.com/en/java/javase/17/docs/api/new-list.html
を参考にしてもらうとして、この記事では個人的によく使うことになりそうな HexFormt クラスを紹介したいと思います。
#16進数表記用のクラス
ここ数年私が関わっているプロジェクトでは「16進数表記」を使う機会がとても多く、バイト配列と16進数文字列の変換なども頻繁にコーディングしています。
そのような場合、今までは外部のライブラリを使うことが多かったのですが、Java 17からは HexFormat クラスを使えばよさそうです。
ちなみにHexFormatクラスはimmutableでスレッドセーフです。
#HexFormatの使い方
HexFormatクラスを使うにはstaticメソッドの of()
でオブジェクトを取得します。
HexFormat hex = HexFormat.of();
バイト配列から16進数文字列に変換するには formatHex()
メソッドを使います。
byte[] bytes = {0, 1, -1, 10};
String hexString = hex.formatHex(bytes);
//hexString ==> "0001ff0a"
16進数文字列をバイト配列に変換したい場合は parseHex()
メソッドを使います。
byte[] bytes = hex.parseHex("0aff");
// bytes ==> byte[2] {10, -1}
引数に渡す16進数文字列は大文字でも小文字でも、混同しててもOKです。
byte[] bytes = hex.parseHex("0AfF");
// bytes ==> byte[2] {10, -1}
バイト配列を 大文字の 16進数文字列に変換したいときは withUpperCase()
メソッドを使ってHexFormatオブジェクトを取得します。
HexFormat hex = HexFormat.of().withUpperCase();
byte[] bytes = {0, 1, -1, 10};
String hexString = hex.formatHex(bytes);
//hexString ==> "0001FF0A"
他にも色々メソッドがありますが、よく使いそうなのはこれらになると思います。