共通ツール
Java のコア ライブラリには、使用できる既製のクラスが多数用意されています。このセクションでは、一般的に使用されるツール クラスをいくつか紹介します。
数学
名前が示すように、Math
このクラスは数学的計算に使用され、数学的計算の実装を容易にする多数の静的メソッドを提供します。
絶対値を求めます。
Math.abs(-100); // 100
Math.abs(-7.8); // 7.8
最大値または最小値を取得します。
Math.max(100, 99); // 100
Math.min(1.2, 2.3); // 1.2
xy パワーを計算します。
Math.pow(2, 10); // 2的10次方=1024
√x を計算します。
Math.sqrt(2); // 1.414...
ex パワーを計算します。
Math.exp(2); // 7.389...
e を底とする対数を計算します。
Math.log(4); // 1.386...
10 を底とする対数を計算します。
Math.log10(100); // 2
三角関数:
Math.sin(3.14); // 0.00159...
Math.cos(3.14); // -0.9999...
Math.tan(3.14); // -0.0015...
Math.asin(1.0); // 1.57079...
Math.acos(1.0); // 0.0
Math には、いくつかの数学定数も用意されています。
double pi = Math.PI; // 3.14159...
double e = Math.E; // 2.7182818...
Math.sin(Math.PI / 6); // sin(π/6) = 0.5
乱数 x を生成します。x の範囲は次のとおりです0 <= x < 1
。
Math.random(); // 0.53907... 每次都不一样
間隔内で乱数を生成したい場合は、実装を[MIN, MAX)
使用できます。計算は次のようになります。Math.random()
Java の標準ライブラリにも、 とほぼ同じメソッドStrictMath
を提供するメソッドが用意されていることに気づいた子供靴もいるかもしれません。Math
これら 2 つのクラスの違いは、浮動小数点計算のエラーにより、異なるプラットフォーム (x86 と ARM など) の計算結果が一致しない (異なるエラーを参照する) 可能性があることです。すべてのプラットフォームはまったく同じですが、プラットフォームのコンピューティング速度の最適化が試行されるため、ほとんどの場合、それを使用するだけでStrictMath
十分です。Math
Math
16 進形式
配列を扱う場合byte[]
、16 進文字列との間の変換が必要になることがよくありますが、これを自分で記述するのは面倒ですが、Java 標準ライブラリによって提供されるものを使用すると、簡単に変換できますHexFormat
。
byte[]
配列を 16 進文字列に変換するには、formatHex()
次のメソッドを使用できます。
import java.util.HexFormat;
public class Main {
public static void main(String[] args) throws InterruptedException {
byte[] data = "Hello".getBytes();
HexFormat hf = HexFormat.of();
String hexData = hf.formatHex(data); // 48656c6c6f
}
}
変換形式をカスタマイズする場合は、カスタマイズされたHexFormat
インスタンスを使用します。
// 分隔符为空格,添加前缀0x,大写字母:
HexFormat hf = HexFormat.ofDelimiter(" ").withPrefix("0x").withUpperCase();
hf.formatHex("Hello".getBytes())); // 0x48 0x65 0x6C 0x6C 0x6F
16 進文字列からbyte[]
配列に変換するには、次を使用しますparseHex()
。
byte[] bs = HexFormat.of().parseHex("48656c6c6f");
ランダム
Random
擬似乱数を作成するために使用されます。いわゆる擬似乱数とは、最初のシードが与えられている限り、生成される乱数のシーケンスはまったく同じであることを意味します。
乱数を生成するにはnextInt()
、 、nextLong()
、nextFloat()
、を使用しますnextDouble()
。
Random r = new Random();
r.nextInt(); // 2071575453,每次都不一样
r.nextInt(10); // 5,生成一个[0,10)之间的int
r.nextLong(); // 8811649292570369305,每次都不一样
r.nextFloat(); // 0.54335...生成一个[0,1)之间的float
r.nextDouble(); // 0.3716...生成一个[0,1)之间的double
一部の子供靴は、プログラムが実行されるたびに、生成される乱数が異なり、擬似乱数の特性が見られないことを尋ねました。
これはRandom
、インスタンスを作成するときにシードを与えないと、システムの現在のタイムスタンプがシードとして使用されるため、実行するたびにシードが異なり、取得される擬似乱数のシーケンスが次のようになります。違う。
Random
インスタンスの作成時にシードを指定すると、完全に決定的な乱数のシーケンスが得られます。
java.util.Randomをインポートします。
走る
先ほど使ったものは実際に内部でクラスをMath.random()
呼び出しているので擬似乱数でもありますが、シードを指定することはできません。Random
セキュアランダム
疑似乱数があるところには真の乱数があります。実際、実際の真の乱数は量子力学の原理を通じてのみ取得できます。そして、私たちが必要としているのは、安全な乱数をSecureRandom
作成するために使用される、予測不可能で安全な乱数です。
SecureRandom sr = new SecureRandom();
System.out.println(sr.nextInt(100));
SecureRandom
シードを指定する方法はなく、RNG (乱数発生器) アルゴリズムが使用されます。実際、 JDK にSecureRandom
はさまざまな基盤となる実装があり、安全な乱数シードと擬似乱数アルゴリズムを使用して安全な乱数を生成するものや、実際の乱数ジェネレーターを使用するものもあります。実際に使用する場合は、最初に高強度の安全な乱数生成器を取得します。提供されていない場合は、通常レベルの安全な乱数生成器を使用します。
java.util.Arrays をインポートします。 インポート java.security.SecureRandom; インポート java.security.NoSuchAlgorithmException;
SecureRandom
のセキュリティは、オペレーティング システムによって提供される安全なランダム シードを通じて乱数を生成することです。このシードは、CPU の熱ノイズ、ディスクに読み書きされるバイト数、ネットワーク トラフィックなど、さまざまなランダム イベントによって生成される「エントロピー」です。
暗号化では、安全な乱数が非常に重要です。安全でない疑似乱数が使用されると、すべての暗号化システムが破られてしまいます。したがって、SecureRandom
安全な乱数を生成するには を使用する必要があることに常に留意してください。
安全な乱数を使用する必要がある場合は、SecureRandom を使用する必要があり、Random は決して使用しないでください。
まとめ
Java によって提供される一般的なツール クラスは次のとおりです。
-
数学: 数学的な計算
-
ランダム: 擬似乱数を生成します。
-
SecureRandom: 安全な乱数を生成します。