目录
java.lang.Math%C2%A0%E7%B1%BB%E8%AF%A6%E8%A7%A3-toc" name="tableOfContents" style="margin-left:0px">一、Java 中的数学利器:java.lang.Math 类详解
1.常用属性
2.常用方法
⑴.static int abs(int a)
⑵.static double ceil(double a)
⑶.static double floor(double a)
⑷.static int max(int a, int b) 和 static int min(int a, int b)
⑸.static double random()
⑹.static long round(double a)
⑺.static double sqrt(double a)
运行结果:
⑻.static double pow(double a, double b)
java.util.Random%C2%A0%E7%B1%BB%EF%BC%9A%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90%E7%9A%84%E5%88%A9%E5%99%A8-toc" name="tableOfContents" style="margin-left:0px">二、Java 中 java.util.Random 类:随机数生成的利器
1.常用构造方法
Random()
2.常用方法
⑴.int nextInt()
⑵.int nextInt(int bound)
⑶.double nextDouble()
3.练一练:生成 5 个不重复的随机数
java.lang.System%C2%A0%E7%B1%BB-toc" name="tableOfContents" style="margin-left:0px">三、深入探索 Java 中的 java.lang.System 类
1.常用属性
⑴.static final PrintStream err
⑵.static final InputStream in
⑶.static final PrintStream out
2.常用方法
⑴.static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
⑵.static void exit(int status)
⑶.static void gc()
⑷.static long currentTimeMillis()
⑸.static long nanoTime()
⑸.static Properties getProperties()
⑹.static String getProperty(String key)
四、深入了解 Java 中的 UUID:通用唯一标识符
1.什么是UUID?
UUID核心特性
Java 中 UUID 的应用场景
2.Java中的UUID实现
java.lang.Math%C2%A0%E7%B1%BB%E8%AF%A6%E8%A7%A3" style="background-color:transparent">一、Java 中的数学利器:java.lang.Math
类详解
在 Java 编程中,处理数学运算时,java.lang.Math
类是一个非常实用的工具。它提供了一系列静态方法和常量,方便我们进行各种常见的数学计算,无需创建对象即可直接使用,大大提高了代码的简洁性和效率。
1.常用属性
-
static final double PI
:圆周率常量(3.141592653589793)
PI
是 Math
类中一个静态常量,表示圆周率 ,其值约为 3.141592653589793。在进行与圆相关的计算时,这个常量非常有用。
public class MathPIExample {public static void main(String[] args) {double radius = 5.0;// 计算圆的面积double area = Math.PI * Math.pow(radius, 2);System.out.println("半径为 " + radius + " 的圆的面积是: " + area);}
}
2.常用方法
⑴.static int abs(int a)
abs
方法用于返回一个数的绝对值。它可以处理 int
类型的数据,也有对应的重载方法可以处理 long
、float
和 double
类型的数据。
public class MathAbsExample {public static void main(String[] args) {int num = -10;int absNum = Math.abs(num);System.out.println(num + " 的绝对值是: " + absNum);}
}
运行结果:
⑵.static double ceil(double a)
ceil
方法用于对一个 double
类型的数进行向上取整,返回大于或等于该数的最小整数。
public class MathCeilExample {public static void main(String[] args) {double num = 3.2;double ceilNum = Math.ceil(num);System.out.println(num + " 向上取整的结果是: " + ceilNum);}
}
运行结果:
⑶.static double floor(double a)
floor
方法用于对一个 double
类型的数进行向下取整,返回小于或等于该数的最大整数。
public class MathFloorExample {public static void main(String[] args) {double num = 3.8;double floorNum = Math.floor(num);System.out.println(num + " 向下取整的结果是: " + floorNum);}
}
运行结果:
⑷.static int max(int a, int b)
和 static int min(int a, int b)
max
方法用于返回两个数中的最大值,min
方法用于返回两个数中的最小值。同样,也有对应的重载方法可以处理 long
、float
和 double
类型的数据。
public class MathMaxMinExample {public static void main(String[] args) {int num1 = 10;int num2 = 20;int maxNum = Math.max(num1, num2);int minNum = Math.min(num1, num2);System.out.println(num1 + " 和 " + num2 + " 中的最大值是: " + maxNum);System.out.println(num1 + " 和 " + num2 + " 中的最小值是: " + minNum);}
}
运行结果:
⑸.static double random()
random
方法用于生成一个大于等于 0.0 且小于 1.0 的随机 double
类型的数。通过一些简单的运算,我们可以生成指定范围的随机数。
public class MathRandomExample {public static void main(String[] args) {// 生成 [0-100) 的随机整数int num = (int) (Math.random() * 100);System.out.println("生成的 [0-100) 的随机整数是: " + num);}
}
运行结果:
⑹.static long round(double a)
round
方法用于对一个 double
类型的数进行四舍五入,返回最接近该数的 long
类型的整数。
public class MathRoundExample {public static void main(String[] args) {double num = 3.6;long roundNum = Math.round(num);System.out.println(num + " 四舍五入的结果是: " + roundNum);}
}
运行结果:
⑺.static double sqrt(double a)
sqrt
方法用于计算一个 double
类型的数的平方根。
public class MathSqrtExample {public static void main(String[] args) {double num = 16.0;double sqrtNum = Math.sqrt(num);System.out.println(num + " 的平方根是: " + sqrtNum);}
}
运行结果:
⑻.static double pow(double a, double b)
pow
方法用于计算一个数的指定次幂,其中 a
是底数,b
是指数。
public class MathPowExample {public static void main(String[] args) {double base = 2.0;double exponent = 3.0;double result = Math.pow(base, exponent);System.out.println(base + " 的 " + exponent + " 次幂是: " + result);}
}
运行结果:
java.util.Random%C2%A0%E7%B1%BB%EF%BC%9A%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90%E7%9A%84%E5%88%A9%E5%99%A8" name="%E4%BA%8C%E3%80%81Java%20%E4%B8%AD%C2%A0java.util.Random%C2%A0%E7%B1%BB%EF%BC%9A%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90%E7%9A%84%E5%88%A9%E5%99%A8">二、Java 中 java.util.Random
类:随机数生成的利器
在 Java 编程里,我们常常需要生成随机数来满足各种需求,比如模拟游戏中的随机事件、生成测试数据等。java.util.Random
类就是专门用来生成随机数的工具类,它提供了丰富的方法和构造函数,让我们可以轻松地生成不同类型和范围的随机数。
1.常用构造方法
Random()
这是 Random
类最常用的构造方法。当我们使用 Random()
来创建 Random
对象时,它会使用当前系统时间作为种子来初始化随机数生成器。由于系统时间是不断变化的,所以每次创建的随机数序列通常是不同的。
import java.util.Random;public class RandomConstructorExample {public static void main(String[] args) {Random random = new Random();// 后续可以使用这个 random 对象生成随机数}
}
2.常用方法
⑴.int nextInt()
nextInt()
方法会返回一个 int
类型取值范围内的随机整数,其范围是 -2147483648
到 2147483647
。
import java.util.Random;public class NextIntExample {public static void main(String[] args) {Random random = new Random();int randomInt = random.nextInt();System.out.println("生成的随机整数是: " + randomInt);}
}
⑵.int nextInt(int bound)
nextInt(int bound)
方法会返回一个在 [0, bound)
区间内的随机整数。也就是说,生成的随机数大于等于 0 且小于指定的 bound
值。
import java.util.Random;public class NextIntBoundExample {public static void main(String[] args) {Random random = new Random();int bound = 10;int randomInt = random.nextInt(bound);System.out.println("生成的 [0, " + bound + ") 区间内的随机整数是: " + randomInt);}
}
⑶.double nextDouble()
nextDouble()
方法会返回一个在 [0.0, 1.0)
区间内的随机 double
类型的数。
import java.util.Random;public class NextDoubleExample {public static void main(String[] args) {Random random = new Random();double randomDouble = random.nextDouble();System.out.println("生成的 [0.0, 1.0) 区间内的随机小数是: " + randomDouble);}
}
3.练一练:生成 5 个不重复的随机数
下面我们来完成一个小练习,使用 Random
类生成 5 个不重复的随机数。为了确保生成的随机数不重复,我们可以使用 ArrayList
来存储已经生成的随机数,每次生成新的随机数时,先检查该数是否已经在列表中,如果不在则添加到列表中。
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class GenerateUniqueRandomNumbers {public static void main(String[] args) {Random random = new Random();List<Integer> uniqueNumbers = new ArrayList<>();int count = 0;int bound = 100; // 假设生成 [0, 100) 区间内的随机数while (count < 5) {int randomNumber = random.nextInt(bound);if (!uniqueNumbers.contains(randomNumber)) {uniqueNumbers.add(randomNumber);count++;}}System.out.println("生成的 5 个不重复的随机数是: " + uniqueNumbers);}
}
java.lang.System%C2%A0%E7%B1%BB" name="%E4%B8%89%E3%80%81%E6%B7%B1%E5%85%A5%E6%8E%A2%E7%B4%A2%20Java%20%E4%B8%AD%E7%9A%84%C2%A0java.lang.System%C2%A0%E7%B1%BB">三、深入探索 Java 中的 java.lang.System
类
在 Java 编程的世界里,java.lang.System
类是一个极为重要的工具类,它提供了许多与系统交互的静态方法和属性。由于 System
类的构造方法是私有的,我们无法实例化它,只能通过类名直接调用其静态成员。下面,我们将详细介绍 System
类的常用属性和方法。
1.常用属性
⑴.static final PrintStream err
err
是标准错误输出流,通常用于输出错误信息。与标准输出流不同的是,使用 System.err.println()
输出的信息在控制台中一般会以红色字体显示,这样能让开发者更直观地识别错误信息。
public class SystemErrExample {public static void main(String[] args) {System.err.println("这是一条错误信息!");System.out.println("这是一条错误信息!");}
}
运行结果:
⑵.static final InputStream in
in
是标准输入流,它允许程序从控制台读取用户输入的数据。在实际开发中,我们常常会结合 Scanner
类来使用它。
import java.util.Scanner;public class SystemInExample {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你的名字:");String name = scanner.nextLine();System.out.println("你输入的名字是:" + name);//拆开写InputStream inputStream = System.in;Scanner s2 = new Scanner(inputStream);System.out.println(s2.next());scanner.close();}
}
⑶.static final PrintStream out
out
是标准输出流,这是我们在 Java 编程中最常用的输出方式。通过 System.out.println()
或 System.out.print()
方法,我们可以将信息输出到控制台。
import java.io.PrintStream;public class oop2 {public static void main(String[] args) {System.out.println("hello world!");PrintStream printStream = System.out;printStream.println(100);printStream.println(false);printStream.println("123");printStream.println(1.23);System.out.println("这是一条标准输出信息。");}
}
2.常用方法
⑴.static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
arraycopy
方法用于数组拷贝,它可以将一个数组中的指定部分复制到另一个数组中。其中,src
是源数组,srcPos
是源数组的起始位置,dest
是目标数组,destPos
是目标数组的起始位置,length
是要复制的元素个数。
public class SystemArraycopyExample {public static void main(String[] args) {int[] srcArray = {1, 2, 3, 4, 5};int[] destArray = new int[5];System.arraycopy(srcArray, 0, destArray, 0, 5);for (int num : destArray) {System.out.print(num + " ");}}
}
运行结果:
⑵.static void exit(int status)
exit
方法用于退出 Java 虚拟机。参数 status
为 0 表示正常退出,非 0 表示异常退出。
public class SystemExitExample {public static void main(String[] args) {System.out.println("程序即将退出...");System.exit(0);System.out.println("这行代码不会被执行。");}
}
运行结果:
⑶.static void gc()
gc
方法用于建议 Java 虚拟机启动垃圾回收器。需要注意的是,这只是一个建议,虚拟机不一定会立即执行垃圾回收操作。
public class SystemGCExample {public static void main(String[] args) {// 创建一些对象for (int i = 0; i < 1000; i++) {new Object();}// 建议启动垃圾回收器System.gc();}
}
⑷.static long currentTimeMillis()
currentTimeMillis
方法用于获取自 1970 - 01 - 01 00:00:00 000 到系统当前时间的总毫秒数。
这个方法在计算程序执行时间、定时任务等场景中非常有用
public class SystemCurrentTimeMillisExample {public static void main(String[] args) {long startTime = System.currentTimeMillis();// 模拟一些耗时操作for (int i = 0; i < 1000000; i++) {// do something}long endTime = System.currentTimeMillis();System.out.println("程序执行耗时:" + (endTime - startTime) + " 毫秒");}
}
⑸.static long nanoTime()
nanoTime
方法用于获取自 1970 年 1 月 1 日 0 时 0 分 0 秒以来,当前时间的纳秒数。它提供了比 currentTimeMillis
更高的时间精度,常用于性能测试等对时间精度要求较高的场景。
public class SystemNanoTimeExample {public static void main(String[] args) {long startTime = System.nanoTime();// 模拟一些耗时操作for (int i = 0; i < 1000000; i++) {// do something}long endTime = System.nanoTime();System.out.println("程序执行耗时:" + (endTime - startTime) + " 纳秒");}
}
⑷.static Map<String, String> getenv()
getenv
方法用于获取当前系统的环境变量,返回一个包含环境变量名和对应值的 Map
对象。常见的环境变量有 Path
、JAVA_HOME
、CLASSPATH
等。
import java.util.Map;public class SystemGetenvExample {public static void main(String[] args) {Map<String, String> envVars = System.getenv();for (Map.Entry<String, String> entry : envVars.entrySet()) {System.out.println(entry.getKey() + " = " + entry.getValue());}}
}
⑸.static Properties getProperties()
getProperties
方法用于获取当前系统的属性,返回一个 Properties
对象。系统属性包含了许多关于 Java 虚拟机和操作系统的信息。
import java.util.Properties;public class SystemGetPropertiesExample {public static void main(String[] args) {Properties properties = System.getProperties();properties.list(System.out);}
}
⑹.static String getProperty(String key)
getProperty
方法用于通过指定的 key
获取系统属性的值。例如,我们可以通过 "os.name"
获取操作系统的名称。
public class SystemGetPropertyExample {public static void main(String[] args) {String osName = System.getProperty("os.name");System.out.println("当前操作系统的名称是:" + osName);}
}
四、深入了解 Java 中的 UUID:通用唯一标识符
1.什么是UUID?
UUID(Universally Unique Identifier) 是一种用于生成全局唯一标识符的开放标准,其核心目标是在分布式系统中生成无需中央协调的唯一ID。它通过128位二进制数实现唯一性,相当于在理论上可以产生约3.4×10^38个不同的标识符(大约是宇宙中原子数量的10亿倍)。
UUID核心特性
特性 | 说明 |
---|---|
全局唯一性 | 重复概率低至可以忽略不计(每秒生成10亿个UUID,100年后重复概率约50%) |
本地生成能力 | 无需依赖数据库或中央服务器 |
跨平台兼容性 | 支持所有主流编程语言和系统 |
标准化格式 | 支持多种字符串表示形式 |
UUID 是一种软件构建的标准,其核心目的是生成具有唯一性的 ID。它具有以下显著特点:
分布式系统友好
在分布式系统中,多个节点可能同时生成标识符。UUID 能够在这种复杂的环境下,为每个节点生成唯一的标识符,避免了主键冲突等问题带来的麻烦。这使得分布式系统的开发和维护更加顺畅。
高度唯一性
UUID 使用 128 位数字来表示,其重复的概率极低。除了传统的 32 位 16 进制表示形式外,还有基于 62 进制的表示方法,这种表示更加简洁紧凑,方便在各种场景下使用。
本地生成
UUID 的生成不需要依赖任何中央控制器或数据库服务器。开发者可以在本地快速、方便地生成唯一标识符,无需与外部系统进行交互,大大提高了开发效率。
跨语言支持
UUID 生成后可以被许多编程语言支持,并且能够方便地转化为字符串表示形式。这使得它适用于多种应用场景,无论是 Web 开发、移动开发还是大数据处理,UUID 都能发挥重要作用。
Java 中 UUID 的应用场景
在 Java 开发中,UUID 的使用非常普遍,常见的应用场景包括:
数据表主键
在数据库设计中,使用 UUID 作为数据表的主键可以避免因自增主键在分布式环境下的冲突问题。每个记录都有一个唯一的 UUID,确保数据的一致性和完整性。
场景标识
在复杂的业务系统中,不同的业务场景可能需要唯一的标识。UUID 可以作为场景标识,方便系统对不同的业务流程进行管理和跟踪。
链路追踪
在分布式系统的调用链中,使用 UUID 可以唯一标识一次请求的处理过程。通过在各个服务之间传递 UUID,我们可以方便地追踪请求的执行路径,定位问题所在。
缓存 Key
在缓存系统中,使用 UUID 作为缓存 Key 可以避免 Key 冲突的问题。每个缓存项都有一个唯一的 UUID,确保缓存数据的准确性和一致性。
2.Java中的UUID实现
Java通过java.util.UUID
类提供原生支持:
import java.util.UUID;public class UUIDGenerationExample {public static void main(String[] args) {UUID uuid = UUID.randomUUID();System.out.println("生成的 UUID: " + uuid);}
}
将 UUID 转换为字符串
String toString()
方法用于将 UUID
对象转换为字符串表示形式。在实际开发中,我们经常需要将 UUID 以字符串的形式存储或传输,这个方法非常实用。
import java.util.UUID;public class UUIDToStringExample {public static void main(String[] args) {UUID uuid = UUID.randomUUID();String uuidString = uuid.toString();System.out.println("UUID 的字符串表示: " + uuidString);}
}
格式解析
标准36字符格式分解:
xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx