常用工具类 - Random,Scanner,Objects,UUID,Properties等
- Random
- Scanner
- 一、构造方法
- 1. `Scanner(InputStream source)`
- 2. `Scanner(InputStream source, String charsetName)`
- 3. `Scanner(File source)`
- 4. `Scanner(File source, String charsetName)`
- 5. `Scanner(String source)`
- 6. `Scanner(Readable source)`
- 7. `Scanner(ReadableByteChannel source)`
- 8. `Scanner(ReadableByteChannel source, String charsetName)`
- 二、读取各种类型数据的方法
- 三、检查输入的方法
- 四、正则表达式相关方法
- 错误处理方法
- 状态查询方法
- 捕获匹配方法
- 匹配方法
- 删除输入方法
- 更多方法
- 用途与使用场景
- 总结
- Objects
- Properties
- Properties类方法详解
- 1. `void load(InputStream inStream)` 和 `void load(Reader reader)`
- 2. `void store(OutputStream out, String comments)` 和 `void store(Writer writer, String comments)`
- 3. `void loadFromXML(InputStream in)` 和 `void storeToXML(OutputStream os, String comment)`
- 4. `Object setProperty(String key, String value)`
- 5. `String getProperty(String key)` 和 `String getProperty(String key, String defaultValue)`
- 6. `Enumeration<?> propertyNames()`
- 7. `Set<String> stringPropertyNames()`
- 8. `void list(PrintStream out)` 和 `void list(PrintWriter out)`
- 详细方法分类和整理
- 总结
- UUID
- UUID类方法详解
- 1. `static UUID randomUUID()`
- 2. `static UUID nameUUIDFromBytes(byte[] name)`
- 3. `long getMostSignificantBits()`
- 4. `long getLeastSignificantBits()`
- 5. `int version()`
- 6. `int variant()`
- 7. `long timestamp()`
- 8. `int clockSequence()`
- 9. `long node()`
- 10. `String toString()`
- 11. `int hashCode()`
- 12. `boolean equals(Object obj)`
- 13. `int compareTo(UUID val)`
- 详细方法分类和整理
- 总结
- Observable - Java9之后不建议使用
- Observer - Java9之后不建议使用
Random
Random
类是 Java 提供的生成伪随机数的工具类。它包含多种生成随机数的方法,这些方法可以生成不同类型的随机数。下面我将详细讲解 Random
类中的所有方法,并按照方法的用途、功能、目的、作用、使用场景等方面进行分类整理,并提供相应的测试用例。
一、构造方法
1. Random()
功能: 使用一个相对时间值作为种子,创建一个新的随机数生成器。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
System.out.println("Random number: " + random.nextInt());
}
}
2. Random(long seed)
功能: 使用指定的种子,创建一个新的随机数生成器。
参数:
seed
- 随机数生成器的种子。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random(12345L);
System.out.println("Random number with seed 12345: " + random.nextInt());
}
}
二、生成随机数的方法
1. int nextInt()
功能: 返回一个从随机数序列中选择的 int
值。
返回值: int
- 随机生成的整数。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
int randomInt = random.nextInt();
System.out.println("Random int: " + randomInt);
}
}
2. int nextInt(int bound)
功能: 返回一个在 [0, bound)
范围内均匀分布的随机 int
值。
参数:
bound
- 上限(不包括)。
返回值: int
- 随机生成的整数。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
int randomIntInRange = random.nextInt(10);
System.out.println("Random int in range [0, 10): " + randomIntInRange);
}
}
3. long nextLong()
功能: 返回一个从随机数序列中选择的 long
值。
返回值: long
- 随机生成的长整数。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
long randomLong = random.nextLong();
System.out.println("Random long: " + randomLong);
}
}
4. float nextFloat()
功能: 返回一个在 [0.0, 1.0)
范围内均匀分布的随机 float
值。
返回值: float
- 随机生成的浮点数。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
float randomFloat = random.nextFloat();
System.out.println("Random float: " + randomFloat);
}
}
5. double nextDouble()
功能: 返回一个在 [0.0, 1.0)
范围内均匀分布的随机 double
值。
返回值: double
- 随机生成的双精度浮点数。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
double randomDouble = random.nextDouble();
System.out.println("Random double: " + randomDouble);
}
}
6. boolean nextBoolean()
功能: 返回一个随机的 boolean
值。
返回值: boolean
- 随机生成的布尔值。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
boolean randomBoolean = random.nextBoolean();
System.out.println("Random boolean: " + randomBoolean);
}
}
7. void nextBytes(byte[] bytes)
功能: 生成随机字节并将其置于用户提供的字节数组中。
参数:
bytes
- 要填充的字节数组。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
byte[] byteArray = new byte[10];
random.nextBytes(byteArray);
System.out.print("Random bytes: ");
for (byte b : byteArray) {
System.out.print(b + " ");
}
}
}
8. double nextGaussian()
功能: 返回一个按标准正态分布(均值为 0.0,标准差为 1.0)生成的随机 double
值。
返回值: double
- 随机生成的符合标准正态分布的双精度浮点数。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
double randomGaussian = random.nextGaussian();
System.out.println("Random Gaussian: " + randomGaussian);
}
}
三、其他常用方法
1. void setSeed(long seed)
功能: 使用单个 long
种子设置此随机数生成器的种子。
参数:
seed
- 随机数生成器的新种子。
示例:
import java.util.Random;
public class RandomExample {
public static void main(String[] args) {
Random random = new Random();
random.setSeed(12345L);
System.out.println("Random number with new seed 12345: " + random.nextInt());
}
}
四、用途与使用场景
1. 游戏开发
在游戏中,随机数生成器被广泛用于生成随机敌人、随机掉落、随机地形等。
示例:
import java.util.Random;
public class GameDevelopmentExample {
public static void main(String[] args) {
Random random = new Random();
int enemyType = random.nextInt(3); // 生成三种类型的敌人
System.out.println("Enemy type: " + enemyType);
}
}
2. 数据模拟与测试
在数据模拟和测试中,随机数生成器可以生成测试数据集,用于模拟各种场景。
示例:
import java.util.Random;
public class DataSimulationExample {
public static void main(String[] args) {
Random random = new Random();
double[] testData = new double[10];
for (int i = 0; i < testData.length; i++) {
testData[i] = random.nextDouble();
}
System.out.print("Test data: ");
for (double data : testData) {
System.out.print(data + " ");
}
}
}
3. 加密与安全
在加密和安全领域,随机数生成器可以用于生成随机密钥、随机盐值等。
示例:
import java.util.Random;
public class SecurityExample {
public static void main(String[] args) {
Random random = new Random();
byte[] salt = new byte[16];
random.nextBytes(salt);
System.out.print("Random salt: ");
for (byte b : salt) {
System.out.print(b + " ");
}
}
}
综合示例
下面是一个综合示例,展示了如何使用 Random
类的各种方法生成不同类型的随机数:
import java.util.Random;
public class ComprehensiveRandomExample {
public static void main(String[] args) {
Random random = new Random();
// 生成随机整数
int randomInt = random.nextInt();
System.out.println("Random int: " + randomInt);
// 生成指定范围内的随机整数
int randomIntInRange = random.nextInt(10); // [0, 10)
System.out.println("Random int in range [0, 10): " + randomIntInRange);
// 生成随机长整数
long randomLong = random.nextLong();
System.out.println("Random long: " + randomLong);
// 生成随机浮点数
float randomFloat = random.nextFloat();
System.out.println("Random float: " + randomFloat);
// 生成随机双精度浮点数
double randomDouble = random.nextDouble();
System.out.println("Random double: " + randomDouble);
// 生成随机布尔值
boolean randomBoolean = random.nextBoolean();
System.out.println("Random boolean: " + randomBoolean);
// 生成随机字节数组
byte[] byteArray = new byte[10];
random.nextBytes(byteArray);
System.out.print("Random bytes: ");
for (byte b : byteArray) {
System.out.print(b + " ");
}
System.out.println();
// 生成符合高斯分布的随机双精度浮点数
double randomGaussian = random.nextGaussian();
System.out.println("Random Gaussian: " + randomGaussian);
// 使用新的种子
random.setSeed(12345L);
System.out.println("Random number with new seed 12345: " + random.nextInt());
}
}
总结
Random
类提供了多种生成伪随机数的方法,通过详细了解和掌握这些方法,您可以在 Java 编程中灵活处理各种需要随机数的情景。
- 构造方法: 使用默认或指定的种子创建随机数生成器。
- 生成随机数的方法:
nextInt()
,nextInt(int bound)
,nextLong()
,nextFloat()
,nextDouble()
,nextBoolean()
,nextBytes(byte[] bytes)
,nextGaussian()
- 其他方法:
setSeed(long seed)
- 用途与使用场景: 游戏开发、数据模拟与测试、加密与安全等。
Scanner
Scanner
类是 Java 中用于从输入流中获取输入的实用工具类。它提供了多种扫描方法,可以从不同的数据源中读取和解析各种类型的数据。下面我将详细讲解 Scanner
类中的所有方法,并按照方法的用途、功能、目的、作用、使用场景等方面进行分类整理,并提供相应的测试用例。
一、构造方法
1. Scanner(InputStream source)
功能: 从指定的输入流读取数据。
参数:
source
- 输入流。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter something: ");
String input = scanner.nextLine();
System.out.println("You entered: " + input);
}
}
2. Scanner(InputStream source, String charsetName)
功能: 从指定的输入流使用指定的字符集读取数据。
参数:
source
- 输入流。charsetName
- 字符集名称。
示例:
import java.util.Scanner;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello, world!";
ByteArrayInputStream inputStream = new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8));
Scanner scanner = new Scanner(inputStream, "UTF-8");
System.out.println(scanner.nextLine());
}
}
3. Scanner(File source)
功能: 从指定文件中读取数据。
参数:
source
- 文件。
示例:
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
public class ScannerExample {
public static void main(String[] args) {
try {
File file = new File("test.txt");
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
4. Scanner(File source, String charsetName)
功能: 从指定文件中使用指定的字符集读取数据。
参数:
source
- 文件。charsetName
- 字符集名称。
示例:
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
public class ScannerExample {
public static void main(String[] args) {
try {
File file = new File("test.txt");
Scanner scanner = new Scanner(file, "UTF-8");
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
5. Scanner(String source)
功能: 从指定的字符串中读取数据。
参数:
source
- 字符串。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello, world!";
Scanner scanner = new Scanner(data);
System.out.println(scanner.nextLine());
}
}
6. Scanner(Readable source)
功能: 从指定的 Readable
对象中读取数据。
参数:
source
-Readable
对象。
示例:
import java.util.Scanner;
import java.io.StringReader;
public class ScannerExample {
public static void main(String[] args) {
StringReader reader = new StringReader("Hello, world!");
Scanner scanner = new Scanner(reader);
System.out.println(scanner.nextLine());
}
}
7. Scanner(ReadableByteChannel source)
功能: 从指定的 ReadableByteChannel
中读取数据。
参数:
source
-ReadableByteChannel
对象。
示例:
import java.util.Scanner;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.ByteBuffer;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello, world!";
ReadableByteChannel channel = Channels.newChannel(new java.io.ByteArrayInputStream(data.getBytes()));
Scanner scanner = new Scanner(channel);
System.out.println(scanner.nextLine());
}
}
8. Scanner(ReadableByteChannel source, String charsetName)
功能: 从指定的 ReadableByteChannel
中使用指定的字符集读取数据。
参数:
source
-ReadableByteChannel
对象。charsetName
- 字符集名称。
示例:
import java.util.Scanner;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.ByteBuffer;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello, world!";
ReadableByteChannel channel = Channels.newChannel(new java.io.ByteArrayInputStream(data.getBytes()));
Scanner scanner = new Scanner(channel, "UTF-8");
System.out.println(scanner.nextLine());
}
}
二、读取各种类型数据的方法
1. String next()
功能: 查找并返回下一个完整标记。
返回值: String
- 下一个标记。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello world!";
Scanner scanner = new Scanner(data);
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
}
}
2. boolean nextBoolean()
功能: 扫描输入的下一个标记并将其作为布尔值返回。
返回值: boolean
- 布尔值。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "true false";
Scanner scanner = new Scanner(data);
while (scanner.hasNextBoolean()) {
System.out.println(scanner.nextBoolean());
}
}
}
3. byte nextByte()
功能: 扫描输入的下一个标记并将其作为字节值返回。
返回值: byte
- 字节值。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "100 101";
Scanner scanner = new Scanner(data);
while (scanner.hasNextByte()) {
System.out.println(scanner.nextByte());
}
}
}
4. double nextDouble()
功能: 扫描输入的下一个标记并将其作为双精度浮点数返回。
返回值: double
- 双精度浮点数。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "1.23 4.56";
Scanner scanner = new Scanner(data);
while (scanner.hasNextDouble()) {
System.out.println(scanner.nextDouble());
}
}
}
5. float nextFloat()
功能: 扫描输入的下一个标记并将其作为单精度浮点数返回。
返回值: float
- 单精度浮点数。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "1.23 4.56";
Scanner scanner = new Scanner(data);
while (scanner.hasNextFloat()) {
System.out.println(scanner.nextFloat());
}
}
}
6. int nextInt()
功能: 扫描输入的下一个标记并将其作为整数返回。
返回值: int
- 整数。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "123 456";
Scanner scanner = new Scanner(data);
while (scanner.hasNextInt()) {
System.out.println(scanner.nextInt());
}
}
}
7. int nextInt(int radix)
功能: 扫描输入的下一个标记并将其作为指定基数的整数返回。
参数:
radix
- 基数。
返回值: int
- 指定基数的整数。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "1010 1001";
Scanner scanner = new Scanner(data);
while (scanner.hasNextInt(2)) {
System.out.println(scanner.nextInt(2)); // 读取二进制数
}
}
}
8. long nextLong()
功能: 扫描输入的下一个标记并将其作为长整数返回。
返回值: long
- 长整数。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "123456789 987654321";
Scanner scanner = new Scanner(data);
while (scanner.hasNextLong()) {
System.out.println(scanner.nextLong());
}
}
}
9. short nextShort()
功能: 扫描输入的下一个标记并将其作为短整数返回。
返回值: short
- 短整数。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "12345 6789";
Scanner scanner = new Scanner(data);
while (scanner.hasNextShort()) {
System.out.println(scanner.nextShort());
}
}
}
10. String nextLine()
功能: 扫描输入的下一行,并将其作为字符串返回。
返回值: String
- 下一行字符串。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello, world!\nJava programming";
Scanner scanner = new Scanner(data);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
}
}
三、检查输入的方法
1. boolean hasNext()
功能: 如果此扫描器的输入中另有完整的标记,则返回 true
。
返回值: boolean
- 如果有更多的标记,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello world!";
Scanner scanner = new Scanner(data);
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
}
}
2. boolean hasNextBoolean()
功能: 如果此扫描器的输入中有一个布尔值,则返回 true
。
返回值: boolean
- 如果有布尔值,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "true false";
Scanner scanner = new Scanner(data);
while (scanner.hasNextBoolean()) {
System.out.println(scanner.nextBoolean());
}
}
}
3. boolean hasNextByte()
功能: 如果此扫描器的输入中有一个字节值,则返回 true
。
返回值: boolean
- 如果有字节值,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "100 101";
Scanner scanner = new Scanner(data);
while (scanner.hasNextByte()) {
System.out.println(scanner.nextByte());
}
}
}
4. boolean hasNextDouble()
功能: 如果此扫描器的输入中有一个双精度浮点值,则返回 true
。
返回值: boolean
- 如果有双精度浮点值,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "1.23 4.56";
Scanner scanner = new Scanner(data);
while (scanner.hasNextDouble()) {
System.out.println(scanner.nextDouble());
}
}
}
5. boolean hasNextFloat()
功能: 如果此扫描器的输入中有一个单精度浮点值,则返回 true
。
返回值: boolean
- 如果有单精度浮点值,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "1.23 4.56";
Scanner scanner = new Scanner(data);
while (scanner.hasNextFloat()) {
System.out.println(scanner.nextFloat());
}
}
}
6. boolean hasNextInt()
功能: 如果此扫描器的输入中有一个整数值,则返回 true
。
返回值: boolean
- 如果有整数值,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "123 456";
Scanner scanner = new Scanner(data);
while (scanner.hasNextInt()) {
System.out.println(scanner.nextInt());
}
}
}
7. boolean hasNextInt(int radix)
功能: 如果此扫描器的输入中有一个指定基数的整数值,则返回 true
。
参数:
radix
- 基数。
返回值: boolean
- 如果有指定基数的整数值,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "1010 1001";
Scanner scanner = new Scanner(data);
while (scanner.hasNextInt(2)) {
System.out.println(scanner.hasNextInt(2)); // 检查是否有二进制数
}
}
}
8. boolean hasNextLong()
功能: 如果此扫描器的输入中有一个长整数值,则返回 true
。
返回值: boolean
- 如果有长整数值,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "123456789 987654321";
Scanner scanner = new Scanner(data);
while (scanner.hasNextLong()) {
System.out.println(scanner.nextLong());
}
}
}
9. boolean hasNextShort()
功能: 如果此扫描器的输入中有一个短整数值,则返回 true
。
返回值: boolean
- 如果有短整数值,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "12345 6789";
Scanner scanner = new Scanner(data);
while (scanner.hasNextShort()) {
System.out.println(scanner.nextShort());
}
}
}
10. boolean hasNextLine()
功能: 如果此扫描器的输入中有下一行,则返回 true
。
返回值: boolean
- 如果有下一行,则返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello, world!\nJava programming";
Scanner scanner = new Scanner(data);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
}
}
四、正则表达式相关方法
1. Scanner useDelimiter(Pattern pattern)
功能: 设置此扫描器的分隔模式为指定的正则表达式模式。
参数:
pattern
- 正则表达式模式。
返回值: Scanner
- 设置了分隔模式的扫描器。
示例:
import java.util.Scanner;
import java.util.regex.Pattern;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello,world!Java,programming";
Scanner scanner = new Scanner(data).useDelimiter(Pattern.compile(","));
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
}
}
2. Scanner useDelimiter(String pattern)
功能: 设置此扫描器的分隔模式为指定的正则表达式模式。
参数:
pattern
- 正则表达式模式字符串。
返回值: Scanner
- 设置了分隔模式的扫描器。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello,world!Java,programming";
Scanner scanner = new Scanner(data).useDelimiter(",");
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
}
}
3. Pattern delimiter()
功能: 返回此扫描器所使用的分隔符模式。** - 扫描器默认按照空格来分隔**
返回值: Pattern
- 分隔符模式。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello, world!";
Scanner scanner = new Scanner(data);
System.out.println("Default delimiter: " + scanner.delimiter());
scanner.useDelimiter(",");
System.out.println("New delimiter: " + scanner.delimiter());
}
}
4. Scanner useLocale(Locale locale)
功能: 设置此扫描器的本地化设置为指定的 Locale
。
参数:
locale
- 本地化设置。
返回值: Scanner
- 设置了本地化设置的扫描器。
示例:
import java.util.Scanner;
import java.util.Locale;
public class ScannerExample {
public static void main(String[] args) {
String data = "123,45 678,90";
Scanner scanner = new Scanner(data);
scanner.useLocale(Locale.GERMANY);
while (scanner.hasNextDouble()) {
System.out.println(scanner.nextDouble());
}
}
}
5. Locale locale()
功能: 返回此扫描器的当前本地化设置。
返回值: Locale
- 当前本地化设置。
示例:
import java.util.Scanner;
import java.util.Locale;
public class ScannerExample {
public static void main(String[] args) {
String data = "123,45 678,90";
Scanner scanner = new Scanner(data);
System.out.println("Default locale: " + scanner.locale());
scanner.useLocale(Locale.GERMANY);
System.out.println("New locale: " + scanner.locale());
}
}
错误处理方法
1. IOException ioException()
功能: 返回此扫描器可能抛出的最后一个 IOException
。
返回值: IOException
- 如果有异常,返回异常对象;否则返回 null
。
示例:
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
public class ScannerExample {
public static void main(String[] args) {
try {
File file = new File("nonexistent.txt");
Scanner scanner = new Scanner(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
状态查询方法
1. boolean hasNext(String pattern)
功能: 如果此扫描器的输入中有下一个匹配指定模式的标记,则返回 true
。
参数:
pattern
- 正则表达式模式。
返回值: boolean
- 如果有匹配的标记,返回 true
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "123 abc 456";
Scanner scanner = new Scanner(data);
while (scanner.hasNext("\\d+")) {
System.out.println(scanner.nextInt());
}
}
}
2. boolean hasNext(Pattern pattern)
功能: 如果此扫描器的输入中有下一个匹配指定模式的标记,则返回 true
。
参数:
pattern
- 正则表达式模式。
返回值: boolean
- 如果有匹配的标记,返回 true
。
示例:
import java.util.Scanner;
import java.util.regex.Pattern;
public class ScannerExample {
public static void main(String[] args) {
String data = "123 abc 456";
Scanner scanner = new Scanner(data);
Pattern pattern = Pattern.compile("\\d+");
while (scanner.hasNext(pattern)) {
System.out.println(scanner.nextInt());
}
}
}
3. String next(String pattern)
功能: 查找并返回下一个匹配指定模式的标记。
参数:
pattern
- 正则表达式模式。
返回值: String
- 下一个匹配的标记。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello123 world456";
Scanner scanner = new Scanner(data);
while (scanner.hasNext("\\w+\\d+")) {
System.out.println(scanner.next("\\w+\\d+"));
}
}
}
4. String next(Pattern pattern)
功能: 查找并返回下一个匹配指定模式的标记。
参数:
pattern
- 正则表达式模式。
返回值: String
- 下一个匹配的标记。
示例:
import java.util.Scanner;
import java.util.regex.Pattern;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello123 world456";
Scanner scanner = new Scanner(data);
Pattern pattern = Pattern.compile("\\w+\\d+");
while (scanner.hasNext(pattern)) {
System.out.println(scanner.next(pattern));
}
}
}
捕获匹配方法
1. String findInLine(String pattern)
功能: 在此扫描器的当前行中查找下一个匹配指定模式的子序列,并返回它。
参数:
pattern
- 正则表达式模式。
返回值: String
- 下一个匹配的子序列;如果没有匹配则返回 null
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello123 world456";
Scanner scanner = new Scanner(data);
String match = scanner.findInLine("\\w+\\d+");
System.out.println("Found: " + match);
}
}
2. String findInLine(Pattern pattern)
功能: 在此扫描器的当前行中查找下一个匹配指定模式的子序列,并返回它。
参数:
pattern
- 正则表达式模式。
返回值: String
- 下一个匹配的子序列;如果没有匹配则返回 null
。
示例:
import java.util.Scanner;
import java.util.regex.Pattern;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello123 world456";
Scanner scanner = new Scanner(data);
Pattern pattern = Pattern.compile("\\w+\\d+");
String match = scanner.findInLine(pattern);
System.out.println("Found: " + match);
}
}
3. String findWithinHorizon(String pattern, int horizon)
功能: 查找下一个匹配指定模式的子序列,并返回它,最多扫描到指定的字符数。
参数:
pattern
- 正则表达式模式。horizon
- 扫描的最大字符数。
返回值: String
- 下一个匹配的子序列;如果没有匹配则返回 null
。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello123 world456";
Scanner scanner = new Scanner(data);
String match = scanner.findWithinHorizon("\\w+\\d+", 10);
System.out.println("Found within horizon: " + match);
}
}
4. String findWithinHorizon(Pattern pattern, int horizon)
功能: 查找下一个匹配指定模式的子序列,并返回它,最多扫描到指定的字符数。
参数:
pattern
- 正则表达式模式。horizon
- 扫描的最大字符数。
返回值: String
- 下一个匹配的子序列;如果没有匹配则返回 null
。
示例:
import java.util.Scanner;
import java.util.regex.Pattern;
public class ScannerExample {
public static void main(String[] args) {
String data = "Hello123 world456";
Scanner scanner = new Scanner(data);
Pattern pattern = Pattern.compile("\\w+\\d+");
String match = scanner.findWithinHorizon(pattern, 10);
System.out.println("Found within horizon: " + match);
}
}
匹配方法
1. MatchResult match()
功能: 返回最后一次扫描操作的匹配结果。
返回值: MatchResult
- 最后一次扫描操作的匹配结果。
示例:
import java.util.Scanner;
import java.util.regex.MatchResult;
public class ScannerExample {
public static void main(String[] args) {
String data = "The price is 123.45 dollars";
Scanner scanner = new Scanner(data);
scanner.findInLine("(\\d+\\.\\d+)");
MatchResult result = scanner.match();
System.out.println("Found: " + result.group(1));
}
}
删除输入方法
1. void close()
功能: 关闭此扫描器。
示例:
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter something: ");
String input = scanner.nextLine();
System.out.println("You entered: " + input);
scanner.close();
}
}
更多方法
1. BigDecimal nextBigDecimal()
功能: 扫描输入的下一个标记并将其作为 BigDecimal
返回。
返回值: BigDecimal
- 大浮动数值。
示例:
import java.util.Scanner;
import java.math.BigDecimal;
public class ScannerExample {
public static void main(String[] args) {
String data = "12345.6789";
Scanner scanner = new Scanner(data);
while (scanner.hasNextBigDecimal()) {
System.out.println(scanner.nextBigDecimal());
}
}
}
2. BigInteger nextBigInteger()
功能: 扫描输入的下一个标记并将其作为 BigInteger
返回。
返回值: BigInteger
- 大整数值。
示例:
import java.util.Scanner;
import java.math.BigInteger;
public class ScannerExample {
public static void main(String[] args) {
String data = "12345678901234567890";
Scanner scanner = new Scanner(data);
while (scanner.hasNextBigInteger()) {
System.out.println(scanner.nextBigInteger());
}
}
}
3. BigInteger nextBigInteger(int radix)
功能: 扫描输入的下一个标记并将其作为指定基数的 BigInteger
返回。
参数:
radix
- 基数。
返回值: BigInteger
- 指定基数的大整数值。
示例:
import java.util.Scanner;
import java.math.BigInteger;
public class ScannerExample {
public static void main(String[] args) {
String data = "1010101010";
Scanner scanner = new Scanner(data);
while (scanner.hasNextBigInteger(2)) {
System.out.println(scanner.nextBigInteger(2)); // 二进制大整数
}
}
}
用途与使用场景
1. 从控制台读取输入
用途: 常用于获取用户的输入,例如接受命令行参数和用户输入数据。
示例:
import java.util.Scanner;
public class ConsoleInputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = scanner.nextLine();
System.out.println("Hello, " + name + "!");
}
}
2. 从文件读取数据
用途: 从文件中读取数据进行解析和处理。
示例:
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
public class FileInputExample {
public static void main(String[] args) {
try {
Scanner scanner = new Scanner(new File("data.txt"));
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
3. 从字符串读取数据
用途: 从字符串中解析和提取数据。
示例:
import java.util.Scanner;
public class StringInputExample {
public static void main(String[] args) {
String data = "123 456 789";
Scanner scanner = new Scanner(data);
while (scanner.hasNextInt()) {
System.out.println(scanner.nextInt());
}
}
}
总结
Scanner
类提供了多种从输入流中读取和解析数据的方法。通过详细了解和掌握这些方法,您可以在 Java 编程中灵活处理各种输入需求。
- 构造方法: 从不同数据源创建扫描器。
- 读取各种类型数据的方法:
next()
,nextBoolean()
,nextByte()
,nextDouble()
,nextFloat()
,nextInt()
,nextInt(int radix)
,nextLong()
,nextShort()
,nextLine()
- 检查输入的方法:
hasNext()
,hasNextBoolean()
,hasNextByte()
,hasNextDouble()
,hasNextFloat()
,hasNextInt()
,hasNextInt(int radix)
,hasNextLong()
,hasNextShort()
,hasNextLine()
- 正则表达式相关方法:
useDelimiter(Pattern pattern)
,useDelimiter(String pattern)
,delimiter()
,useLocale(Locale locale)
,locale()
- 错误处理方法:
ioException()
- 状态查询方法:
hasNext(String pattern)
,hasNext(Pattern pattern)
,next(String pattern)
,next(Pattern pattern)
- 捕获匹配方法:
findInLine(String pattern)
,findInLine(Pattern pattern)
,findWithinHorizon(String pattern, int horizon)
,findWithinHorizon(Pattern pattern, int horizon)
- 匹配方法:
match()
- 删除输入方法:
close()
- 更多方法:
nextBigDecimal()
,nextBigInteger()
,nextBigInteger(int radix)
Objects
Objects
类是 Java 提供的一个工具类,包含了一系列静态方法,用于操作和处理对象。它可以帮助我们进行对象的比较、检验、计算哈希值、转换为字符串等操作。下面我将详细讲解 Objects
类中的所有方法,并按照方法的用途、功能、目的、作用、使用场景等方面进行分类整理,并提供相应的测试用例。
一、比较方法
1. boolean equals(Object a, Object b)
功能: 比较两个对象是否相等。相等的标准是两个对象都为 null
,或者两个对象的 equals
方法返回 true
。
参数:
a
- 第一个对象。b
- 第二个对象。
返回值: boolean
- 如果两个对象相等,则返回 true
;否则返回 false
。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
System.out.println(Objects.equals(str1, str2)); // true
String str3 = null;
String str4 = null;
System.out.println(Objects.equals(str3, str4)); // true
System.out.println(Objects.equals(str1, str3)); // false
}
}
2. boolean deepEquals(Object a, Object b)
功能: 对两个对象进行“深度”相等性检查。它比较的是两个对象的内容是否相同,而不是内存地址。
参数:
a
- 第一个对象。b
- 第二个对象。
返回值: boolean
- 如果两个对象“深度”相等,则返回 true
;否则返回 false
。
示例:
import java.util.Objects;
import java.util.Arrays;
public class ObjectsExample {
public static void main(String[] args) {
int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
System.out.println(Objects.deepEquals(array1, array2)); // true
int[] array3 = {4, 5, 6};
System.out.println(Objects.deepEquals(array1, array3)); // false
}
}
二、检查方法
1. T requireNonNull(T obj)
功能: 检查指定的对象是否为 null
。如果对象为 null
,则抛出 NullPointerException
。
参数:
obj
- 要检查的对象。
返回值: T
- 如果对象不为 null
,则返回该对象。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str = "hello";
System.out.println(Objects.requireNonNull(str)); // hello
try {
String str2 = null;
System.out.println(Objects.requireNonNull(str2));
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException");
}
}
}
2. T requireNonNull(T obj, String message)
功能: 检查指定的对象是否为 null
。如果对象为 null
,则抛出带有指定详细消息的 NullPointerException
。
参数:
obj
- 要检查的对象。message
- 当对象为null
时抛出的异常的详细消息。
返回值: T
- 如果对象不为 null
,则返回该对象。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str = "hello";
System.out.println(Objects.requireNonNull(str, "Object cannot be null")); // hello
try {
String str2 = null;
System.out.println(Objects.requireNonNull(str2, "Object cannot be null"));
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException: " + e.getMessage());
}
}
}
3. T requireNonNull(T obj, Supplier<String> messageSupplier)
功能: 检查指定的对象是否为 null
。如果对象为 null
,则抛出带有由提供者提供的详细消息的 NullPointerException
。
参数:
obj
- 要检查的对象。messageSupplier
- 当对象为null
时抛出的异常的详细消息的提供者。
返回值: T
- 如果对象不为 null
,则返回该对象。
示例:
import java.util.Objects;
import java.util.function.Supplier;
public class ObjectsExample {
public static void main(String[] args) {
String str = "hello";
Supplier<String> messageSupplier = () -> "Object cannot be null";
System.out.println(Objects.requireNonNull(str, messageSupplier)); // hello
try {
String str2 = null;
System.out.println(Objects.requireNonNull(str2, messageSupplier));
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException: " + e.getMessage());
}
}
}
三、哈希方法
1. int hash(Object... values)
功能: 生成对象的哈希码。此方法将多个对象的哈希码组合成一个哈希码。
参数:
values
- 要计算哈希码的对象。
返回值: int
- 组合哈希码。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "world";
System.out.println(Objects.hash(str1, str2)); // 组合哈希码
String str3 = null;
System.out.println(Objects.hash(str1, str3)); // 组合哈希码,其中一个对象为 null
}
}
2. int hashCode(Object o)
功能: 返回对象的哈希码,如果对象为 null
,则返回 0。
参数:
o
- 要计算哈希码的对象。
返回值: int
- 对象的哈希码。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str = "hello";
System.out.println(Objects.hashCode(str)); // 对象的哈希码
String str2 = null;
System.out.println(Objects.hashCode(str2)); // 0
}
}
四、比较方法
1. int compare(T a, T b, Comparator<? super T> c)
功能: 使用指定的比较器比较两个对象。
参数:
a
- 第一个对象。b
- 第二个对象。c
- 比较器。
返回值: int
- 比较结果。
示例:
import java.util.Objects;
import java.util.Comparator;
public class ObjectsExample {
public static void main(String[] args) {
String str1 = "apple";
String str2 = "banana";
Comparator<String> comparator = String::compareTo;
System.out.println(Objects.compare(str1, str2, comparator)); // -1
}
}
五、转换为字符串的方法
1. String toString(Object o)
功能: 返回对象的字符串表示形式。如果对象为 null
,则返回字符串 “null”。
参数:
o
- 要转换为字符串的对象。
返回值: String
- 对象的字符串表示形式。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str = "hello";
System.out.println(Objects.toString(str)); // hello
String str2 = null;
System.out.println(Objects.toString(str2)); // null
}
}
2. String toString(Object o, String nullDefault)
功能: 返回对象的字符串表示形式。如果对象为 null
,则返回指定的默认字符串。
参数:
o
- 要转换为字符串的对象。nullDefault
- 对象为null
时返回的默认字符串。
返回值: String
- 对象的字符串表示形式。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str = "hello";
System.out.println(Objects.toString(str, "default")); // hello
String str2 = null;
System.out.println(Objects.toString(str2, "default")); // default
}
}
六、空检查方法
1. boolean isNull(Object obj)
功能: 判断对象是否为 null
。
参数:
obj
- 要检查的对象。
返回值: boolean
- 如果对象为 null
,返回 true
;否则返回 false
。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str = null;
System.out.println(Objects.isNull(str)); // true
String str2 = "hello";
System.out.println(Objects.isNull(str2)); // false
}
}
2. boolean nonNull(Object obj)
功能: 判断对象是否不为 null
。
参数:
obj
- 要检查的对象。
返回值: boolean
- 如果对象不为 null
,返回 true
;否则返回 false
。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
String str = null;
System.out.println(Objects.nonNull(str)); // false
String str2 = "hello";
System.out.println(Objects.nonNull(str2)); // true
}
}
七、比较辅助方法
1. int compare(T a, T b, Comparator<? super T> c)
功能: 使用指定的比较器比较两个对象。
参数:
a
- 第一个对象。b
- 第二个对象。c
- 比较器。
返回值: int
- 比较结果。
示例:
import java.util.Objects;
import java.util.Comparator;
public class ObjectsExample {
public static void main(String[] args) {
String str1 = "apple";
String str2 = "banana";
Comparator<String> comparator = String::compareTo;
System.out.println(Objects.compare(str1, str2, comparator)); // -1
}
}
八、断言方法
1. void checkIndex(int index, int length)
功能: 检查索引是否在范围内。
参数:
index
- 要检查的索引。length
- 范围的长度。
返回值: 无。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
int length = 5;
try {
Objects.checkIndex(3, length); // 合法索引,不会抛出异常
Objects.checkIndex(5, length); // 非法索引,会抛出异常
} catch (IndexOutOfBoundsException e) {
System.out.println("Caught IndexOutOfBoundsException: " + e.getMessage());
}
}
}
2. void checkFromToIndex(int fromIndex, int toIndex, int length)
功能: 检查索引范围是否在范围内。
参数:
fromIndex
- 起始索引。toIndex
- 结束索引。length
- 范围的长度。
返回值: 无。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
int length = 5;
try {
Objects.checkFromToIndex(1, 3, length); // 合法范围,不会抛出异常
Objects.checkFromToIndex(3, 6, length); // 非法范围,会抛出异常
} catch (IndexOutOfBoundsException e) {
System.out.println("Caught IndexOutOfBoundsException: " + e.getMessage());
}
}
}
3. void checkFromIndexSize(int fromIndex, int size, int length)
功能: 检查从指定起始索引开始的大小是否在范围内。
参数:
fromIndex
- 起始索引。size
- 大小。length
- 范围的长度。
返回值: 无。
示例:
import java.util.Objects;
public class ObjectsExample {
public static void main(String[] args) {
int length = 5;
try {
Objects.checkFromIndexSize(1, 3, length); // 合法范围,不会抛出异常
Objects.checkFromIndexSize(3, 3, length); // 非法范围,会抛出异常
} catch (IndexOutOfBoundsException e) {
System.out.println("Caught IndexOutOfBoundsException: " + e.getMessage());
}
}
}
用途与使用场景
1. 对象比较
用途: 比较两个对象是否相等或“深度”相等,适用于任何需要进行对象比较的场景。
示例:
import java.util.Objects;
import java.util.Arrays;
public class ObjectComparisonExample {
public static void main(String[] args) {
String str1 = "apple";
String str2 = "apple";
System.out.println(Objects.equals(str1, str2)); // true
int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
System.out.println(Objects.deepEquals(array1, array2)); // true
}
}
2. 空检查
用途: 检查对象是否为 null
,适用于任何需要进行空检查的场景。
示例:
import java.util.Objects;
public class NullCheckExample {
public static void main(String[] args) {
String str = null;
System.out.println(Objects.isNull(str)); // true
System.out.println(Objects.nonNull(str)); // false
str = "hello";
System.out.println(Objects.requireNonNull(str)); // hello
}
}
3. 哈希码计算
用途: 计算对象或多个对象的哈希码,适用于需要生成哈希值的场景。
示例:
import java.util.Objects;
public class HashCodeExample {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "world";
System.out.println(Objects.hash(str1, str2)); // 组合哈希码
System.out.println(Objects.hashCode(str1)); // 单个对象的哈希码
}
}
4. 断言检查
用途: 检查索引或索引范围的合法性,适用于任何需要进行索引检查的场景。
示例:
import java.util.Objects;
public class IndexCheckExample {
public static void main(String[] args) {
int length = 5;
try {
Objects.checkIndex(3, length); // 合法索引,不会抛出异常
Objects.checkIndex(5, length); // 非法索引,会抛出异常
} catch (IndexOutOfBoundsException e) {
System.out.println("Caught IndexOutOfBoundsException: " + e.getMessage());
}
}
}
总结
Objects
类提供了一系列非常有用的静态方法,通过详细了解和掌握这些方法,您可以在 Java 编程中更加高效地操作和处理对象。
- 比较方法:
equals(Object a, Object b)
,deepEquals(Object a, Object b)
- 检查方法:
requireNonNull(T obj)
,requireNonNull(T obj, String message)
,requireNonNull(T obj, Supplier<String> messageSupplier)
- 哈希方法:
hash(Object... values)
,hashCode(Object o)
- 转换为字符串的方法:
toString(Object o)
,toString(Object o, String nullDefault)
- 空检查方法:
isNull(Object obj)
,nonNull(Object obj)
- 比较辅助方法:
compare(T a, T b, Comparator<? super T> c)
- 断言方法:
checkIndex(int index, int length)
,checkFromToIndex(int fromIndex, int toIndex, int length)
,checkFromIndexSize(int fromIndex, int size, int length)
Properties
Properties
类在 Java 中用于维护键值对的持久性属性列表。它继承自 Hashtable
类,因此它也具有 Hashtable
的所有方法。Properties
类通常用于配置文件管理,例如读取和写入配置文件信息。本文将详细讲解 Properties
类中的所有方法,并按照用途、功能、目的、作用、使用场景等方面进行分类整理,并提供相应的测试用例。
Properties类方法详解
1. void load(InputStream inStream)
和 void load(Reader reader)
功能: 从输入流中读取属性列表(键和值)。
参数:
inStream
- 输入流(通常是文件输入流)。reader
- 字符输入流。
用途: 从文件或其他输入流中加载属性。
使用场景: 当需要从配置文件或资源文件中读取属性时使用。
示例:
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
public class PropertiesLoadExample {
public static void main(String[] args) {
Properties properties = new Properties();
try (InputStream input = new FileInputStream("config.properties")) {
properties.load(input);
System.out.println("Database: " + properties.getProperty("database"));
System.out.println("Username: " + properties.getProperty("dbuser"));
System.out.println("Password: " + properties.getProperty("dbpassword"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. void store(OutputStream out, String comments)
和 void store(Writer writer, String comments)
功能: 将此属性列表(键和值)写入输出流。
参数:
out
- 输出流。writer
- 字符输出流。comments
- 注释。
用途: 将属性保存到文件或其他输出流中。
使用场景: 保存配置到文件,保持属性的持久化。
示例:
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Properties;
public class PropertiesStoreExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
try (OutputStream output = new FileOutputStream("config.properties")) {
properties.store(output, "Database Configuration");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. void loadFromXML(InputStream in)
和 void storeToXML(OutputStream os, String comment)
功能: 从 XML 输入流加载属性列表,或将属性列表保存到 XML 输出流。
参数:
in
- XML 输入流。os
- XML 输出流。comment
- 注释。
用途: 从 XML 文件中加载属性,或将属性保存到 XML 文件中。
使用场景: 使用 XML 文件作为配置文件格式。
示例:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
public class PropertiesXMLExample {
public static void main(String[] args) {
// Save properties to XML
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
try (OutputStream output = new FileOutputStream("config.xml")) {
properties.storeToXML(output, "Database Configuration");
} catch (Exception e) {
e.printStackTrace();
}
// Load properties from XML
Properties loadedProperties = new Properties();
try (InputStream input = new FileInputStream("config.xml")) {
loadedProperties.loadFromXML(input);
System.out.println("Database: " + loadedProperties.getProperty("database"));
System.out.println("Username: " + loadedProperties.getProperty("dbuser"));
System.out.println("Password: " + loadedProperties.getProperty("dbpassword"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. Object setProperty(String key, String value)
功能: 设置属性键值对。
参数:
key
- 键。value
- 值。
用途: 设置属性值。
使用场景: 当需要添加或更新属性时使用。
示例:
import java.util.Properties;
public class PropertiesSetExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
System.out.println("Database: " + properties.getProperty("database"));
System.out.println("Username: " + properties.getProperty("dbuser"));
System.out.println("Password: " + properties.getProperty("dbpassword"));
}
}
5. String getProperty(String key)
和 String getProperty(String key, String defaultValue)
功能: 获取指定键对应的值。
参数:
key
- 键。defaultValue
- 默认值(如果键不存在,则返回该默认值)。
用途: 获取属性值。
使用场景: 当需要读取配置中的某个键的值时使用。
示例:
import java.util.Properties;
public class PropertiesGetExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
String database = properties.getProperty("database");
String dbuser = properties.getProperty("dbuser", "defaultUser");
System.out.println("Database: " + database);
System.out.println("DB User: " + dbuser); // 输出默认值
}
}
6. Enumeration<?> propertyNames()
功能: 返回此属性列表中的键的枚举。
用途: 获取所有属性键。
使用场景: 当需要遍历所有属性键时使用。
示例:
import java.util.Enumeration;
import java.util.Properties;
public class PropertiesNamesExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
Enumeration<?> propertyNames = properties.propertyNames();
while (propertyNames.hasMoreElements()) {
String key = (String) propertyNames.nextElement();
System.out.println(key + ": " + properties.getProperty(key));
}
}
}
7. Set<String> stringPropertyNames()
功能: 返回此属性列表中的键的集合。
用途: 获取所有属性键。
使用场景: 当需要遍历所有属性键时使用,但返回类型为 Set
。
示例:
import java.util.Properties;
import java.util.Set;
public class PropertiesStringNamesExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
Set<String> propertyNames = properties.stringPropertyNames();
for (String key : propertyNames) {
System.out.println(key + ": " + properties.getProperty(key));
}
}
}
8. void list(PrintStream out)
和 void list(PrintWriter out)
功能: 将此属性列表中的键和值输出到指定的输出流。
参数:
out
- 输出流(可以是PrintStream
或PrintWriter
)。
用途: 打印所有属性键值对。
使用场景: 当需要将属性列表打印到控制台或日志时使用。
示例:
import java.util.Properties;
public class PropertiesListExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
properties.list(System.out);
}
}
详细方法分类和整理
1. 属性加载和存储方法
从流中加载属性:
void load(InputStream inStream)
: 从输入流加载属性。void load(Reader reader)
: 从字符输入流加载属性。void loadFromXML(InputStream in)
: 从 XML 输入流加载属性。
保存属性到流:
void store(OutputStream out, String comments)
: 将属性保存到输出流。void store(Writer writer, String comments)
: 将属性保存到字符输出流。void storeToXML(OutputStream os, String comment)
: 将属性保存到 XML 输出流。
示例:
import java.io.*;
import java.util.Properties;
public class PropertiesLoadStoreExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
// 保存到文件
try (OutputStream output = new FileOutputStream("config.properties")) {
properties.store(output, "Database Configuration");
} catch (Exception e) {
e.printStackTrace();
}
// 从文件加载
Properties loadedProperties = new Properties();
try (InputStream input = new FileInputStream("config.properties")) {
loadedProperties.load(input);
System.out.println("Database: " + loadedProperties.getProperty("database"));
} catch (Exception e) {
e.printStackTrace();
}
// 保存到XML
try (OutputStream output = new FileOutputStream("config.xml")) {
properties.storeToXML(output, "Database Configuration");
} catch (Exception e) {
e.printStackTrace();
}
// 从XML加载
Properties xmlProperties = new Properties();
try (InputStream input = new FileInputStream("config.xml")) {
xmlProperties.loadFromXML(input);
System.out.println("Database: " + xmlProperties.getProperty("database"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 属性获取和设置方法
获取属性:
String getProperty(String key)
: 获取指定键的值。String getProperty(String key, String defaultValue)
: 获取指定键的值,如果键不存在则返回默认值。
设置属性:
Object setProperty(String key, String value)
: 设置属性键值对。
示例:
import java.util.Properties;
public class PropertiesGetSetExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
System.out.println("Database: " + properties.getProperty("database"));
System.out.println("Username: " + properties.getProperty("dbuser"));
System.out.println("Password: " + properties.getProperty("dbpassword"));
String dbport = properties.getProperty("dbport", "3306");
System.out.println("Database Port: " + dbport);
}
}
3. 属性枚举和集合方法
获取属性键的枚举和集合:
Enumeration<?> propertyNames()
: 返回属性键的枚举。Set<String> stringPropertyNames()
: 返回属性键的集合。
示例:
import java.util.Enumeration;
import java.util.Properties;
import java.util.Set;
public class PropertiesNamesExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
Enumeration<?> propertyNames = properties.propertyNames();
while (propertyNames.hasMoreElements()) {
String key = (String) propertyNames.nextElement();
System.out.println(key + ": " + properties.getProperty(key));
}
Set<String> stringPropertyNames = properties.stringPropertyNames();
for (String key : stringPropertyNames) {
System.out.println(key + ": " + properties.getProperty(key));
}
}
}
4. 属性列表方法
打印属性列表:
void list(PrintStream out)
: 将属性列表输出到PrintStream
。void list(PrintWriter out)
: 将属性列表输出到PrintWriter
。
示例:
import java.util.Properties;
public class PropertiesListExample {
public static void main(String[] args) {
Properties properties = new Properties();
properties.setProperty("database", "localhost");
properties.setProperty("dbuser", "user1");
properties.setProperty("dbpassword", "password");
properties.list(System.out);
}
}
总结
Properties
类通过键值对的形式提供了方便的属性管理功能,常用于应用程序配置文件的读取和写入。上文详细介绍了 Properties
类中的所有方法,以及如何使用这些方法进行属性管理。
- 属性加载和存储方法:
load
,loadFromXML
,store
,storeToXML
- 属性获取和设置方法:
getProperty
,setProperty
- 属性枚举和集合方法:
propertyNames
,stringPropertyNames
- 属性列表方法:
list
UUID
UUID
类在 Java 中用于表示通用唯一标识符(Universally Unique Identifier)。UUID 是一个 128 位长的值,通常用于唯一标识对象,例如数据库条目、会话 ID 等。UUID 类提供了一些静态方法用于生成和操作 UUID。
本文将详细讲解 UUID
类中的所有方法,并按照用途、功能、目的、作用、使用场景等方面进行分类整理,并提供相应的测试用例。
UUID类方法详解
1. static UUID randomUUID()
功能: 生成一个类型 4(伪随机生成的)UUID。
用途: 创建一个新的、随机生成的 UUID。
使用场景: 当需要唯一标识符,且不需要基于时间或名称空间时使用。
示例:
import java.util.UUID;
public class UUIDRandomExample {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println("Random UUID: " + uuid.toString());
}
}
2. static UUID nameUUIDFromBytes(byte[] name)
功能: 根据指定的字节数组生成一个类型 3(基于名称的)UUID。
参数:
name
- 用于生成 UUID 的字节数组。
用途: 基于名称生成一个 UUID,确保相同的名称生成相同的 UUID。
使用场景: 当需要基于某个特定名称生成 UUID 时使用(例如,生成用户 ID)。
示例:
import java.nio.charset.StandardCharsets;
import java.util.UUID;
public class UUIDNameExample {
public static void main(String[] args) {
String name = "example";
UUID uuid = UUID.nameUUIDFromBytes(name.getBytes(StandardCharsets.UTF_8));
System.out.println("Name-based UUID: " + uuid.toString());
}
}
3. long getMostSignificantBits()
功能: 获取 UUID 的高 64 位。(1位十六进制数 需要用 4位二进制数来表达)
用途: 分别获取 UUID 的高位和低位部分。
使用场景: 当需要单独处理 UUID 的高位部分时使用。
示例:
import java.util.UUID;
public class UUIDMostSignificantBitsExample {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
long mostSignificantBits = uuid.getMostSignificantBits();
System.out.println("Most Significant Bits: " + mostSignificantBits);
}
}
4. long getLeastSignificantBits()
功能: 获取 UUID 的低 64 位。
用途: 分别获取 UUID 的高位和低位部分。
使用场景: 当需要单独处理 UUID 的低位部分时使用。
示例:
import java.util.UUID;
public class UUIDLeastSignificantBitsExample {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
long leastSignificantBits = uuid.getLeastSignificantBits();
System.out.println("Least Significant Bits: " + leastSignificantBits);
}
}
5. int version()
功能: 获取 UUID 的版本号。
用途: 判断 UUID 使用的版本(例如,1 表示时间戳,4 表示伪随机生成)。
使用场景: 当需要检查 UUID 的版本时使用。
示例:
import java.util.UUID;
public class UUIDVersionExample {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
int version = uuid.version();
System.out.println("UUID Version: " + version);
}
}
6. int variant()
功能: 获取 UUID 的变体号。
用途: 判断 UUID 所遵循的规则集。
使用场景: 当需要检查 UUID 的变体时使用。
示例:
import java.util.UUID;
public class UUIDVariantExample {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
int variant = uuid.variant();
System.out.println("UUID Variant: " + variant);
}
}
7. long timestamp()
功能: 获取时间戳,用于时间戳 UUID(类型 1)。
用途: 提取时间戳信息。
使用场景: 当需要从时间戳 UUID 中提取时间信息时使用。
示例(注意:此方法仅适用于类型 1 的 UUID):
import java.util.UUID;
public class UUIDTimestampExample {
public static void main(String[] args) {
// 生成一个特定的时间戳 UUID
UUID uuid = UUID.fromString("550e8400-e29b-11d4-a716-446655440000");
long timestamp = uuid.timestamp();
System.out.println("Timestamp: " + timestamp);
}
}
8. int clockSequence()
功能: 获取时钟序列,用于时间戳 UUID(类型 1)。
用途: 提取时钟序列信息。
使用场景: 当需要从时间戳 UUID 中提取时钟序列信息时使用。
示例(注意:此方法仅适用于类型 1 的 UUID):
import java.util.UUID;
public class UUIDClockSequenceExample {
public static void main(String[] args) {
// 生成一个特定的时间戳 UUID
UUID uuid = UUID.fromString("550e8400-e29b-11d4-a716-446655440000");
int clockSequence = uuid.clockSequence();
System.out.println("Clock Sequence: " + clockSequence);
}
}
9. long node()
功能: 获取节点值,用于时间戳 UUID(类型 1)。
用途: 提取节点信息。
使用场景: 当需要从时间戳 UUID 中提取节点信息时使用。
示例(注意:此方法仅适用于类型 1 的 UUID):
import java.util.UUID;
public class UUIDNodeExample {
public static void main(String[] args) {
// 生成一个特定的时间戳 UUID
UUID uuid = UUID.fromString("550e8400-e29b-11d4-a716-446655440000");
long node = uuid.node();
System.out.println("Node: " + node);
}
}
10. String toString()
功能: 返回 UUID 的字符串表示形式。
用途: 获取 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 String: " + uuidString);
}
}
11. int hashCode()
功能: 返回 UUID 的哈希码。
用途: 获取 UUID 的哈希码,用于哈希表等数据结构。
使用场景: 当需要将 UUID 用于哈希表或其他基于哈希的数据结构时使用。
示例:
import java.util.UUID;
public class UUIDHashCodeExample {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
int hashCode = uuid.hashCode();
System.out.println("UUID HashCode: " + hashCode);
}
}
12. boolean equals(Object obj)
功能: 判断两个 UUID 是否相等。
参数:
obj
- 要比较的对象。
用途: 比较两个 UUID 是否相等。
使用场景: 当需要判断两个 UUID 是否相同时使用。
示例:
import java.util.UUID;
public class UUIDEqualsExample {
public static void main(String[] args) {
UUID uuid1 = UUID.randomUUID();
UUID uuid2 = UUID.randomUUID();
UUID uuid3 = uuid1;
System.out.println("UUID1 equals UUID2: " + uuid1.equals(uuid2)); // false
System.out.println("UUID1 equals UUID3: " + uuid1.equals(uuid3)); // true
}
}
13. int compareTo(UUID val)
功能: 比较两个 UUID。
参数:
val
- 要比较的 UUID。
用途: 比较两个 UUID 的大小。
使用场景: 当需要排序或比较两个 UUID 时使用。
示例:
import java.util.UUID;
public class UUIDCompareToExample {
public static void main(String[] args) {
UUID uuid1 = UUID.randomUUID();
UUID uuid2 = UUID.randomUUID();
int result = uuid1.compareTo(uuid2);
if (result < 0) {
System.out.println("UUID1 is less than UUID2");
} else if (result > 0) {
System.out.println("UUID1 is greater than UUID2");
} else {
System.out.println("UUID1 is equal to UUID2");
}
}
}
详细方法分类和整理
1. UUID 生成方法
随机生成 UUID:
static UUID randomUUID()
: 生成一个随机 UUID。
基于名称生成 UUID:
static UUID nameUUIDFromBytes(byte[] name)
: 基于字节数组生成 UUID。
示例:
import java.util.UUID;
import java.nio.charset.StandardCharsets;
public class UUIDGenerationExample {
public static void main(String[] args) {
UUID randomUUID = UUID.randomUUID();
System.out.println("Random UUID: " + randomUUID);
String name = "example";
UUID nameUUID = UUID.nameUUIDFromBytes(name.getBytes(StandardCharsets.UTF_8));
System.out.println("Name-based UUID: " + nameUUID);
}
}
2. UUID 信息提取方法
获取 UUID 部分信息:
long getMostSignificantBits()
: 获取高 64 位。long getLeastSignificantBits()
: 获取低 64 位。int version()
: 获取 UUID 版本号。int variant()
: 获取 UUID 变体号。long timestamp()
: 获取时间戳(类型 1)。int clockSequence()
: 获取时钟序列(类型 1)。long node()
: 获取节点值(类型 1)。
示例:
import java.util.UUID;
public class UUIDInfoExtractionExample {
public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println("UUID: " + uuid);
System.out.println("Most Significant Bits: " + uuid.getMostSignificantBits());
System.out.println("Least Significant Bits: " + uuid.getLeastSignificantBits());
System.out.println("Version: " + uuid.version());
System.out.println("Variant: " + uuid.variant());
// 注意:下列方法仅适用于类型 1 的 UUID
UUID timeBasedUUID = UUID.fromString("550e8400-e29b-11d4-a716-446655440000");
System.out.println("Timestamp: " + timeBasedUUID.timestamp());
System.out.println("Clock Sequence: " + timeBasedUUID.clockSequence());
System.out.println("Node: " + timeBasedUUID.node());
}
}
3. UUID 常用方法
常用操作方法:
String toString()
: 返回 UUID 的字符串表示。int hashCode()
: 返回 UUID 的哈希码。boolean equals(Object obj)
: 判断两个 UUID 是否相等。int compareTo(UUID val)
: 比较两个 UUID。
示例:
import java.util.UUID;
public class UUIDCommonMethodsExample {
public static void main(String[] args) {
UUID uuid1 = UUID.randomUUID();
UUID uuid2 = UUID.randomUUID();
System.out.println("UUID1: " + uuid1.toString());
System.out.println("UUID1 HashCode: " + uuid1.hashCode());
System.out.println("UUID1 equals UUID2: " + uuid1.equals(uuid2));
int comparison = uuid1.compareTo(uuid2);
if (comparison < 0) {
System.out.println("UUID1 is less than UUID2");
} else if (comparison > 0) {
System.out.println("UUID1 is greater than UUID2");
} else {
System.out.println("UUID1 is equal to UUID2");
}
}
}
总结
UUID
类在 Java 中提供了生成和操作通用唯一标识符(UUID)的功能,广泛应用于需要唯一标识符的场景。上文详细介绍了 UUID
类中的所有方法,以及如何使用这些方法进行 UUID 的生成和操作。
- UUID 生成方法:
randomUUID
,nameUUIDFromBytes
- UUID 信息提取方法:
getMostSignificantBits
,getLeastSignificantBits
,version
,variant
,timestamp
,clockSequence
,node
- UUID 常用方法:
toString
,hashCode
,equals
,compareTo
Observable - Java9之后不建议使用
Observable
类在 Java 中实现了观察者模式,它允许对象(Observable
)被一个或多个观察者(Observer
)观察,并在发生变化时通知所有观察者。Observable
类提供了一系列方法来管理观察者和通知变化。下面我将详细讲解 Observable
类中的所有方法,并按照方法的用途、功能、目的、作用、使用场景等方面进行分类整理,并提供相应的测试用例。
Observable类方法详解
1. void addObserver(Observer o)
功能: 将观察者添加到观察者列表中。
参数:
o
- 要添加的观察者。
用途: 将新的观察者对象添加到 Observable
的观察者列表中,以便在状态变化时通知该观察者。
使用场景: 当有新的观察者希望监听 Observable
对象的状态变化时使用。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer notified: " + arg);
}
};
observable.addObserver(observer);
System.out.println("Observer added.");
}
}
2. void deleteObserver(Observer o)
功能: 删除观察者列表中的指定观察者。
参数:
o
- 要删除的观察者。
用途: 当不希望某个观察者继续接收 Observable
的状态变化通知时使用。
使用场景: 当某个观察者不再需要监听 Observable
对象的状态变化时使用。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer notified: " + arg);
}
};
observable.addObserver(observer);
System.out.println("Observer added.");
observable.deleteObserver(observer);
System.out.println("Observer deleted.");
}
}
3. void deleteObservers()
功能: 清除所有观察者。
用途: 当希望 Observable
对象不再通知任何观察者时使用。
使用场景: 当需要清空观察者列表时使用。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer1 = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer1 notified: " + arg);
}
};
Observer observer2 = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer2 notified: " + arg);
}
};
observable.addObserver(observer1);
observable.addObserver(observer2);
observable.deleteObservers();
System.out.println("All observers deleted.");
}
}
4. void setChanged()
功能: 标记 Observable
对象为已改变。
用途: 在调用 notifyObservers
方法之前,必须调用此方法,以便 Observable
知道状态已更改。
使用场景: 当要通知观察者之前,标记 Observable
对象已发生变化。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer notified.");
}
};
observable.addObserver(observer);
observable.setChanged();
observable.notifyObservers();
}
}
5. void clearChanged()
功能: 清除 Observable
对象的已改变状态。
用途: 在调用 notifyObservers
方法之后,调用此方法以清除已改变的状态。
使用场景: 在通知观察者之后,清除 Observable
对象的已改变状态。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer notified.");
}
};
observable.addObserver(observer);
observable.setChanged();
observable.notifyObservers();
observable.clearChanged();
}
}
6. void notifyObservers()
功能: 通知所有观察者。
用途: 当 Observable
对象的状态发生变化时,调用此方法通知所有观察者。
使用场景: 当需要通知所有观察者 Observable
对象的状态已更改时使用。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer notified.");
}
};
observable.addObserver(observer);
observable.setChanged();
observable.notifyObservers();
}
}
7. void notifyObservers(Object arg)
功能: 通知所有观察者,并传递一个参数。
参数:
arg
- 要传递给观察者的参数。
用途: 当 Observable
对象的状态发生变化时,调用此方法通知所有观察者,并传递额外的信息。
使用场景: 当需要通知所有观察者 Observable
对象的状态已更改,并传递额外的信息时使用。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer notified: " + arg);
}
};
observable.addObserver(observer);
observable.setChanged();
observable.notifyObservers("Hello, Observers!");
}
}
8. boolean hasChanged()
功能: 检查 Observable
对象是否已改变。
返回值: boolean
- 如果 Observable
对象已改变,则返回 true
;否则返回 false
。
用途: 用于检查 Observable
对象是否被标记为已改变。
使用场景: 当需要检查 Observable
对象的状态是否已改变时使用。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
System.out.println(observable.hasChanged()); // false
observable.setChanged();
System.out.println(observable.hasChanged()); // true
observable.clearChanged();
System.out.println(observable.hasChanged()); // false
}
}
9. int countObservers()
功能: 返回观察者的数量。
返回值: int
- 观察者的数量。
用途: 用于获取当前在观察者列表中的观察者数量。
使用场景: 当需要了解有多少观察者监听 Observable
对象时使用。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObservableExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer1 = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer1 notified: " + arg);
}
};
Observer observer2 = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer2 notified: " + arg);
}
};
observable.addObserver(observer1);
observable.addObserver(observer2);
System.out.println("Number of observers: " + observable.countObservers()); // 2
observable.deleteObservers();
System.out.println("Number of observers after deletion: " + observable.countObservers()); // 0
}
}
测试用例总结
以上示例展示了如何使用 Observable
类中的所有方法。通过这些示例,您应该能够理解每个方法的用途、参数作用以及使用场景。
详细方法分类和整理
1. 观察者管理方法
添加和删除观察者:
void addObserver(Observer o)
: 添加观察者。void deleteObserver(Observer o)
: 删除指定观察者。void deleteObservers()
: 清除所有观察者。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObserverManagementExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer1 = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer1 notified: " + arg);
}
};
Observer observer2 = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer2 notified: " + arg);
}
};
observable.addObserver(observer1);
observable.addObserver(observer2);
observable.deleteObserver(observer1);
observable.deleteObservers();
}
}
2. 通知方法
通知观察者:
void notifyObservers()
: 通知所有观察者。void notifyObservers(Object arg)
: 通知所有观察者并传递一个参数。
示例:
import java.util.Observable;
import java.util.Observer;
public class NotificationExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer notified: " + arg);
}
};
observable.addObserver(observer);
observable.setChanged();
observable.notifyObservers("Update received!");
}
}
3. 状态管理方法
管理状态:
void setChanged()
: 标记为已改变。void clearChanged()
: 清除已改变状态。boolean hasChanged()
: 检查是否已改变。
示例:
import java.util.Observable;
public class StateManagementExample {
public static void main(String[] args) {
Observable observable = new Observable();
System.out.println(observable.hasChanged()); // false
observable.setChanged();
System.out.println(observable.hasChanged()); // true
observable.clearChanged();
System.out.println(observable.hasChanged()); // false
}
}
4. 查询方法
查询观察者:
int countObservers()
: 返回观察者的数量。
示例:
import java.util.Observable;
import java.util.Observer;
public class ObserverCountExample {
public static void main(String[] args) {
Observable observable = new Observable();
Observer observer1 = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer1 notified: " + arg);
}
};
Observer observer2 = new Observer() {
@Override
public void update(Observable o, Object arg) {
System.out.println("Observer2 notified: " + arg);
}
};
observable.addObserver(observer1);
observable.addObserver(observer2);
System.out.println("Number of observers: " + observable.countObservers()); // 2
observable.deleteObservers();
System.out.println("Number of observers after deletion: " + observable.countObservers()); // 0
}
}
总结
Observable
类是 Java 实现观察者模式的一个核心类,通过它,可以方便地管理观察者并通知它们状态的变化。上文详细介绍了 Observable
类中的所有方法,以及如何使用这些方法进行观察者模式的实现。
- 观察者管理方法:
addObserver
,deleteObserver
,deleteObservers
- 通知观察者方法:
notifyObservers
,notifyObservers(Object arg)
- 状态管理方法:
setChanged
,clearChanged
,hasChanged
- 查询方法:
countObservers
Observer - Java9之后不建议使用
Observer
类是 Java 中观察者模式的一个实现,它用于通知观察者对象,当被观察对象(Observable
)发生变化时,所有的观察者都会被自动通知。该模式在事件驱动的编程中非常有用。Observer
是一个接口,而不是一个类,它定义了一个方法,供实现此接口的类使用。
Observer接口
Observer
接口只有一个方法:
void update(Observable o, Object arg)
方法详解
1. void update(Observable o, Object arg)
功能: 当被观察对象发生变化时,update
方法会被调用。此方法会被 Observable
对象调用,以通知观察者有更新。
参数:
o
- 变化的被观察对象。arg
- 被观察对象传递的参数(可以是任意对象,也可以为null
)。
用途:
- 该方法用于通知观察者,被观察对象发生了变化。常用于事件驱动的编程中,例如 GUI 事件、数据变化等。
使用场景:
- 当一个对象的状态改变时,自动通知所有依赖于它的对象。
- 如 GUI 组件的事件监听、模型视图控制器(MVC)架构中的视图更新等。
示例代码
下面是一个简单的例子,展示了如何使用 Observer
和 Observable
进行观察者模式的实现。
1. 创建被观察对象(Observable)
首先,我们需要创建一个类继承自 Observable
类。
import java.util.Observable;
public class NewsFeed extends Observable {
private String news;
public void setNews(String news) {
this.news = news;
setChanged(); // 标记为已改变
notifyObservers(news); // 通知所有观察者
}
public String getNews() {
return news;
}
}
在上面的代码中,NewsFeed
类继承自 Observable
,并且有一个 setNews
方法,当调用此方法时,会通知所有观察者新闻已更新。
2. 创建观察者(Observer)
然后,我们需要创建一个实现 Observer
接口的类。
import java.util.Observable;
import java.util.Observer;
public class NewsReader implements Observer {
private String news;
@Override
public void update(Observable o, Object arg) {
if (o instanceof NewsFeed) {
news = (String) arg;
System.out.println("News updated: " + news);
}
}
}
在上面的代码中,NewsReader
类实现了 Observer
接口,并在 update
方法中处理新闻的更新。
3. 测试用例
最后,我们需要创建一个测试用例,展示如何使用 NewsFeed
和 NewsReader
。
public class ObserverExample {
public static void main(String[] args) {
NewsFeed newsFeed = new NewsFeed();
NewsReader reader1 = new NewsReader();
NewsReader reader2 = new NewsReader();
// 将观察者添加到被观察对象的观察者列表中
newsFeed.addObserver(reader1);
newsFeed.addObserver(reader2);
// 更新新闻
newsFeed.setNews("Breaking News: Java 17 Released!");
// 更新新闻
newsFeed.setNews("Update: Java 17 Features Explained!");
}
}
在上面的代码中,我们创建了两个 NewsReader
观察者,并将它们添加到 NewsFeed
的观察者列表中。然后,当新闻被更新时,NewsReader
会自动接收到更新通知。
总结
Observer
接口在 Java 中用于实现观察者模式,这是一种设计模式,允许对象自动通知其他依赖于它的对象,当其状态发生变化时。通过使用 Observable
类和 Observer
接口,我们可以轻松地实现这种模式。
- 方法:
void update(Observable o, Object arg)
o
: 被观察对象arg
: 传递的参数,可以是任何对象
- 用途: 通知观察者,被观察对象发生了变化。
- 使用场景:
- GUI 事件监听
- 模型视图控制器(MVC)中的视图更新
- 数据变化通知