1.BigDecimal 精度运算
import java.math.BigDecimal;import java.math.RoundingMode;public class BigDecimalDemo {public static void main(String[] args) {// ================== 初始化(必须用字符串避免精度丢失)[6,7](@ref) ==================BigDecimal num1 = new BigDecimal("10.5");BigDecimal num2 = new BigDecimal("3.2");BigDecimal dividend = new BigDecimal("10");BigDecimal divisor = new BigDecimal("3");// ================== 基础算术运算 ==================// 加法 [3,5](@ref)BigDecimal sum = num1.add(num2);System.out.println("加法结果: " + sum); // 13.7// 减法 [3,5](@ref)BigDecimal difference = num1.subtract(num2);System.out.println("减法结果: " + difference); // 7.3// 乘法 [3,5](@ref)BigDecimal product = num1.multiply(num2);System.out.println("乘法结果: " + product); // 33.60// 除法(必须指定舍入模式)[1,5](@ref)BigDecimal quotient = num1.divide(num2, 2, RoundingMode.HALF_UP);System.out.println("除法结果: " + quotient); // 3.28// ================== 数学函数运算 ==================// 绝对值 [4](@ref)BigDecimal absValue = num1.abs();System.out.println("绝对值: " + absValue); // 10.5// 取反 [4](@ref)BigDecimal negated = num1.negate();System.out.println("取反结果: " + negated); // -10.5// 幂运算(JDK 9+)[1](@ref)BigDecimal power = num1.pow(2);System.out.println("平方: " + power); // 110.25// ================== 精度控制与标度操作 ==================// 设置标度(保留2位小数,四舍五入)[1,7](@ref)BigDecimal scaled = new BigDecimal("123.4567").setScale(2, RoundingMode.HALF_UP);System.out.println("四舍五入后: " + scaled); // 123.46// 去除尾部零 [1](@ref)BigDecimal stripped = new BigDecimal("123.45000").stripTrailingZeros();System.out.println("去除尾部零: " + stripped); // 123.45// 缩放十次幂 [1](@ref)BigDecimal scaledByTen = new BigDecimal("123.456789").scaleByPowerOfTen(3);System.out.println("缩放十次幂: " + scaledByTen); // 123456.789// ================== 比较与转换 ==================// 比较大小(忽略标度)[4,7](@ref)int comparison = num1.compareTo(new BigDecimal("10.50"));System.out.println("比较结果: " + comparison); // 0(数值相等)// 转换为基本类型(可能丢失精度)[4](@ref)double d = num1.doubleValue(); // 10.5int i = num1.intValue(); // 10(直接截断)System.out.println("转换为 double: " + d + ", int: " + i);// 精确转换(超出范围抛异常)[1](@ref)try {long lExact = num1.longValueExact(); // 10System.out.println("精确转换 long: " + lExact);} catch (ArithmeticException e) {System.out.println("转换异常: " + e.getMessage());}// ================== 特殊运算 ==================// 余数运算 [1](@ref)BigDecimal remainder = dividend.remainder(divisor);System.out.println("余数: " + remainder); // 1// 求商和余数数组 [1](@ref)BigDecimal[] divideAndRemainder = dividend.divideAndRemainder(divisor);System.out.println("商: " + divideAndRemainder[0] + ", 余数: " + divideAndRemainder[1]); // 3, 1// 最大值/最小值 [1](@ref)BigDecimal max = num1.max(num2);BigDecimal min = num1.min(num2);System.out.println("最大值: " + max + ", 最小值: " + min); // 10.5, 3.2// ================== 小数点移动 ==================// 左移2位 [1](@ref)BigDecimal movedLeft = num1.movePointLeft(2);System.out.println("小数点左移两位: " + movedLeft); // 0.105// 右移1位 [1](@ref)BigDecimal movedRight = num1.movePointRight(1);System.out.println("小数点右移一位: " + movedRight); // 105.0}}import java.math.BigDecimal; import java.math.RoundingMode; public class BigDecimalDemo { public static void main(String[] args) { // ================== 初始化(必须用字符串避免精度丢失)[6,7](@ref) ================== BigDecimal num1 = new BigDecimal("10.5"); BigDecimal num2 = new BigDecimal("3.2"); BigDecimal dividend = new BigDecimal("10"); BigDecimal divisor = new BigDecimal("3"); // ================== 基础算术运算 ================== // 加法 [3,5](@ref) BigDecimal sum = num1.add(num2); System.out.println("加法结果: " + sum); // 13.7 // 减法 [3,5](@ref) BigDecimal difference = num1.subtract(num2); System.out.println("减法结果: " + difference); // 7.3 // 乘法 [3,5](@ref) BigDecimal product = num1.multiply(num2); System.out.println("乘法结果: " + product); // 33.60 // 除法(必须指定舍入模式)[1,5](@ref) BigDecimal quotient = num1.divide(num2, 2, RoundingMode.HALF_UP); System.out.println("除法结果: " + quotient); // 3.28 // ================== 数学函数运算 ================== // 绝对值 [4](@ref) BigDecimal absValue = num1.abs(); System.out.println("绝对值: " + absValue); // 10.5 // 取反 [4](@ref) BigDecimal negated = num1.negate(); System.out.println("取反结果: " + negated); // -10.5 // 幂运算(JDK 9+)[1](@ref) BigDecimal power = num1.pow(2); System.out.println("平方: " + power); // 110.25 // ================== 精度控制与标度操作 ================== // 设置标度(保留2位小数,四舍五入)[1,7](@ref) BigDecimal scaled = new BigDecimal("123.4567").setScale(2, RoundingMode.HALF_UP); System.out.println("四舍五入后: " + scaled); // 123.46 // 去除尾部零 [1](@ref) BigDecimal stripped = new BigDecimal("123.45000").stripTrailingZeros(); System.out.println("去除尾部零: " + stripped); // 123.45 // 缩放十次幂 [1](@ref) BigDecimal scaledByTen = new BigDecimal("123.456789").scaleByPowerOfTen(3); System.out.println("缩放十次幂: " + scaledByTen); // 123456.789 // ================== 比较与转换 ================== // 比较大小(忽略标度)[4,7](@ref) int comparison = num1.compareTo(new BigDecimal("10.50")); System.out.println("比较结果: " + comparison); // 0(数值相等) // 转换为基本类型(可能丢失精度)[4](@ref) double d = num1.doubleValue(); // 10.5 int i = num1.intValue(); // 10(直接截断) System.out.println("转换为 double: " + d + ", int: " + i); // 精确转换(超出范围抛异常)[1](@ref) try { long lExact = num1.longValueExact(); // 10 System.out.println("精确转换 long: " + lExact); } catch (ArithmeticException e) { System.out.println("转换异常: " + e.getMessage()); } // ================== 特殊运算 ================== // 余数运算 [1](@ref) BigDecimal remainder = dividend.remainder(divisor); System.out.println("余数: " + remainder); // 1 // 求商和余数数组 [1](@ref) BigDecimal[] divideAndRemainder = dividend.divideAndRemainder(divisor); System.out.println("商: " + divideAndRemainder[0] + ", 余数: " + divideAndRemainder[1]); // 3, 1 // 最大值/最小值 [1](@ref) BigDecimal max = num1.max(num2); BigDecimal min = num1.min(num2); System.out.println("最大值: " + max + ", 最小值: " + min); // 10.5, 3.2 // ================== 小数点移动 ================== // 左移2位 [1](@ref) BigDecimal movedLeft = num1.movePointLeft(2); System.out.println("小数点左移两位: " + movedLeft); // 0.105 // 右移1位 [1](@ref) BigDecimal movedRight = num1.movePointRight(1); System.out.println("小数点右移一位: " + movedRight); // 105.0 } }
2.类与对象
// 类定义:描述对象的行为和状态class Dog {// 实例变量(对象状态)String name;String color;// 方法(对象行为)void bark() {System.out.println(name + "在汪汪叫");}}public class TestDog {public static void main(String[] args) {// 创建对象实例Dog myDog = new Dog();myDog.name = "阿黄";myDog.color = "黄色";myDog.bark(); // 输出:阿黄在汪汪叫}}// 类定义:描述对象的行为和状态 class Dog { // 实例变量(对象状态) String name; String color; // 方法(对象行为) void bark() { System.out.println(name + "在汪汪叫"); } } public class TestDog { public static void main(String[] args) { // 创建对象实例 Dog myDog = new Dog(); myDog.name = "阿黄"; myDog.color = "黄色"; myDog.bark(); // 输出:阿黄在汪汪叫 } }
3.变量类型
public class VariablesDemo {// 成员变量(非静态)int instanceVar = 10;// 类变量(静态)static String classVar = "全局变量";void method() {// 局部变量int localVar = 20;System.out.println(localVar);}public static void main(String[] args) {System.out.println(classVar); // 直接访问静态变量VariablesDemo obj = new VariablesDemo();System.out.println(obj.instanceVar);obj.method();}}public class VariablesDemo { // 成员变量(非静态) int instanceVar = 10; // 类变量(静态) static String classVar = "全局变量"; void method() { // 局部变量 int localVar = 20; System.out.println(localVar); } public static void main(String[] args) { System.out.println(classVar); // 直接访问静态变量 VariablesDemo obj = new VariablesDemo(); System.out.println(obj.instanceVar); obj.method(); } }
4.数组
public class ArrayDemo {public static void main(String[] args) {// 数组声明与初始化int[] numbers = {1, 2, 3};String[] names = new String[3];names[0] = "张三";// 多维数组int[][] matrix = {{1,2}, {3,4}};System.out.println(matrix[1][0]); // 输出3}}public class ArrayDemo { public static void main(String[] args) { // 数组声明与初始化 int[] numbers = {1, 2, 3}; String[] names = new String[3]; names[0] = "张三"; // 多维数组 int[][] matrix = {{1,2}, {3,4}}; System.out.println(matrix[1][0]); // 输出3 } }
5.枚举
// 单独声明枚举类型enum FreshJuiceSize { SMALL, MEDIUM, LARGE }class FreshJuice {FreshJuiceSize size;}public class EnumTest {public static void main(String[] args) {FreshJuice juice = new FreshJuice();juice.size = FreshJuiceSize.MEDIUM;System.out.println(juice.size); // 输出MEDIUM}}// 单独声明枚举类型 enum FreshJuiceSize { SMALL, MEDIUM, LARGE } class FreshJuice { FreshJuiceSize size; } public class EnumTest { public static void main(String[] args) { FreshJuice juice = new FreshJuice(); juice.size = FreshJuiceSize.MEDIUM; System.out.println(juice.size); // 输出MEDIUM } }
6.继承
// 父类class Animal {void eat() {System.out.println("动物进食");}}// 子类继承class Cat extends Animal {@Overridevoid eat() {System.out.println("猫吃鱼");}}public class InheritanceDemo {public static void main(String[] args) {Cat myCat = new Cat();myCat.eat(); // 输出:猫吃鱼}}// 父类 class Animal { void eat() { System.out.println("动物进食"); } } // 子类继承 class Cat extends Animal { @Override void eat() { System.out.println("猫吃鱼"); } } public class InheritanceDemo { public static void main(String[] args) { Cat myCat = new Cat(); myCat.eat(); // 输出:猫吃鱼 } }
7.接口
// 接口定义interface Communication {void call();}// 类实现接口class Phone implements Communication {@Overridepublic void call() {System.out.println("拨打电话中...");}}public class InterfaceDemo {public static void main(String[] args) {Phone myPhone = new Phone();myPhone.call();}}// 接口定义 interface Communication { void call(); } // 类实现接口 class Phone implements Communication { @Override public void call() { System.out.println("拨打电话中..."); } } public class InterfaceDemo { public static void main(String[] args) { Phone myPhone = new Phone(); myPhone.call(); } }
8.修饰符与访问控制
public class ModifierDemo {// 私有变量(仅本类可访问)private int privateVar = 1;// 公开方法public void publicMethod() {System.out.println("公开方法");}// 静态方法static void staticMethod() {System.out.println("类方法");}}public class ModifierDemo { // 私有变量(仅本类可访问) private int privateVar = 1; // 公开方法 public void publicMethod() { System.out.println("公开方法"); } // 静态方法 static void staticMethod() { System.out.println("类方法"); } }
9.关键字
/*██████╗ █████╗ ██╗ ██╗ █████╗ ██╗ ██╗ ██████╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗██╔════╝ ██╔══██╗ ██║ ██║██╔══██╗ ██║ ██║██╔═══██╗██║ ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝██║ ███████║ ██║ █╗ ██║███████║ ███████║██║ ██║██║ █╗ ██║██║ ██║ ██║██║ ██║█████╗██║ ██╔══██║ ██║███╗██║██╔══██║ ██╔══██║██║ ██║██║███╗██║██║ ██║ ██║██║ ██║██╔══╝╚██████╗ ██║ ██║ ╚███╔███╔╝██║ ██║ ██║ ██║╚██████╔╝╚███╔███╔╝╚██████╗╚██████╔╝██████╔╝███████╗╚═════╝ ╚═╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══╝╚══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝*/// 访问控制修饰符示例class AccessModifiers {private int privateVar; // 仅本类可见protected void protectMethod() {} // 同包或子类可见public String publicField; // 全局可见/* default */ int packageVar; // 包级可见(默认修饰符,不需要显式声明) */}// 类/方法/变量修饰符示例abstract class Animal { // 抽象类final int LEGS = 4; // 不可修改的常量static String TYPE = "哺乳动物"; // 类变量abstract void sound(); // 抽象方法}class Dog extends Animal implements Runnable { // 继承+接口实现volatile boolean status; // 易失变量transient String tempData; // 不序列化的字段@Overridesynchronized void sound() { // 同步方法System.out.println("汪汪");}strictfp double calculate() { // 严格浮点计算return 0.1 + 0.2;}}// 程序控制语句示例class ControlFlow {void demo() {for (int i=0; i<5; i++) {if (i == 3) continue; // 跳过当前循环switch (i) {case 1:System.out.println("一");break;default:System.out.println("其他");}}do { // do-while循环System.out.println("执行");} while (false);while(true) { // 无限循环return; // 方法返回}}}// 错误处理示例class ExceptionDemo {void test() throws Exception { // 声明可能抛出异常try {if (1 > 0) throw new Exception("异常示例");} catch (Exception e) {System.out.println(e.getMessage());} finally {System.out.println("最终执行");}}}// 包与类型示例package com.example; // 包声明import java.util.List; // 导入包class PrimitiveTypes {boolean flag = true; // 布尔型byte smallNum = 127; // 字节型char ch = 'A'; // 字符型double price = 9.99; // 双精度float ratio = 3.14f; // 单精度int count = 100; // 整型long bigNum = 100000L; // 长整型short age = 30; // 短整型}class ReferenceDemo {void method() {this.toString(); // 当前对象引用super.hashCode(); // 父类方法调用}void emptyReturn() { // 无返回值方法System.out.println("void示例");}}/*██████╗ ███████╗██████╗ ███████╗██████╗ ██████╗██╔════╝ ██╔════╝██╔══██╗██╔════╝██╔══██╗██╔═══██╗██║ ███╗█████╗ ██████╔╝█████╗ ██║ ██║██║ ██║██║ ██║██╔══╝ ██╔══██╗██╔══╝ ██║ ██║██║ ██║╚██████╔╝██║ ██║ ██║███████╗██████╔╝╚██████╔╝╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═════╝ ╚═════╝*/// 注意:以下为保留关键字,不能实际使用// goto // 跳转语句(未实现)// const // 常量声明(未实现)代码结构说明:访问控制:展示了private/protected/public/default四种访问权限类修饰符:包含abstract/final/static等核心修饰符方法控制:演示synchronized/strictfp/transient等特殊修饰符流程控制:覆盖所有控制语句关键字的使用场景异常处理:完整try-catch-finally-throw-throws工作流类型系统:包含8种基本类型+void的声明方式特殊引用:this/super的实际应用场景保留关键字:展示未启用的goto/const(注释状态)/* ██████╗ █████╗ ██╗ ██╗ █████╗ ██╗ ██╗ ██████╗ ██╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗ ██╔════╝ ██╔══██╗ ██║ ██║██╔══██╗ ██║ ██║██╔═══██╗██║ ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝ ██║ ███████║ ██║ █╗ ██║███████║ ███████║██║ ██║██║ █╗ ██║██║ ██║ ██║██║ ██║█████╗ ██║ ██╔══██║ ██║███╗██║██╔══██║ ██╔══██║██║ ██║██║███╗██║██║ ██║ ██║██║ ██║██╔══╝ ╚██████╗ ██║ ██║ ╚███╔███╔╝██║ ██║ ██║ ██║╚██████╔╝╚███╔███╔╝╚██████╗╚██████╔╝██████╔╝███████╗ ╚═════╝ ╚═╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚══╝╚══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝ */ // 访问控制修饰符示例 class AccessModifiers { private int privateVar; // 仅本类可见 protected void protectMethod() {} // 同包或子类可见 public String publicField; // 全局可见 /* default */ int packageVar; // 包级可见(默认修饰符,不需要显式声明) */ } // 类/方法/变量修饰符示例 abstract class Animal { // 抽象类 final int LEGS = 4; // 不可修改的常量 static String TYPE = "哺乳动物"; // 类变量 abstract void sound(); // 抽象方法 } class Dog extends Animal implements Runnable { // 继承+接口实现 volatile boolean status; // 易失变量 transient String tempData; // 不序列化的字段 @Override synchronized void sound() { // 同步方法 System.out.println("汪汪"); } strictfp double calculate() { // 严格浮点计算 return 0.1 + 0.2; } } // 程序控制语句示例 class ControlFlow { void demo() { for (int i=0; i<5; i++) { if (i == 3) continue; // 跳过当前循环 switch (i) { case 1: System.out.println("一"); break; default: System.out.println("其他"); } } do { // do-while循环 System.out.println("执行"); } while (false); while(true) { // 无限循环 return; // 方法返回 } } } // 错误处理示例 class ExceptionDemo { void test() throws Exception { // 声明可能抛出异常 try { if (1 > 0) throw new Exception("异常示例"); } catch (Exception e) { System.out.println(e.getMessage()); } finally { System.out.println("最终执行"); } } } // 包与类型示例 package com.example; // 包声明 import java.util.List; // 导入包 class PrimitiveTypes { boolean flag = true; // 布尔型 byte smallNum = 127; // 字节型 char ch = 'A'; // 字符型 double price = 9.99; // 双精度 float ratio = 3.14f; // 单精度 int count = 100; // 整型 long bigNum = 100000L; // 长整型 short age = 30; // 短整型 } class ReferenceDemo { void method() { this.toString(); // 当前对象引用 super.hashCode(); // 父类方法调用 } void emptyReturn() { // 无返回值方法 System.out.println("void示例"); } } /* ██████╗ ███████╗██████╗ ███████╗██████╗ ██████╗ ██╔════╝ ██╔════╝██╔══██╗██╔════╝██╔══██╗██╔═══██╗ ██║ ███╗█████╗ ██████╔╝█████╗ ██║ ██║██║ ██║ ██║ ██║██╔══╝ ██╔══██╗██╔══╝ ██║ ██║██║ ██║ ╚██████╔╝██║ ██║ ██║███████╗██████╔╝╚██████╔╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═════╝ ╚═════╝ */ // 注意:以下为保留关键字,不能实际使用 // goto // 跳转语句(未实现) // const // 常量声明(未实现) 代码结构说明: 访问控制:展示了private/protected/public/default四种访问权限 类修饰符:包含abstract/final/static等核心修饰符 方法控制:演示synchronized/strictfp/transient等特殊修饰符 流程控制:覆盖所有控制语句关键字的使用场景 异常处理:完整try-catch-finally-throw-throws工作流 类型系统:包含8种基本类型+void的声明方式 特殊引用:this/super的实际应用场景 保留关键字:展示未启用的goto/const(注释状态)
10.类与对象定义
// 文件名:Dog.javapublic class Dog {// 成员变量(属性)private String breed;private String color;private int age;// 类变量(静态变量)private static int dogCount = 0;// 构造方法public Dog(String breed, String color, int age) {this.breed = breed;this.color = color;this.age = age;dogCount++;}// 成员方法(行为)public void bark() {System.out.println("Woof! Woof!");}// 访问器方法(Getter/Setter)public String getBreed() { return breed; }public void setBreed(String breed) { this.breed = breed; }public static int getDogCount() { return dogCount; }// 重写 toString 方法@Overridepublic String toString() {return "品种: " + breed + ", 颜色: " + color + ", 年龄: " + age;}}// 文件名:Dog.java public class Dog { // 成员变量(属性) private String breed; private String color; private int age; // 类变量(静态变量) private static int dogCount = 0; // 构造方法 public Dog(String breed, String color, int age) { this.breed = breed; this.color = color; this.age = age; dogCount++; } // 成员方法(行为) public void bark() { System.out.println("Woof! Woof!"); } // 访问器方法(Getter/Setter) public String getBreed() { return breed; } public void setBreed(String breed) { this.breed = breed; } public static int getDogCount() { return dogCount; } // 重写 toString 方法 @Override public String toString() { return "品种: " + breed + ", 颜色: " + color + ", 年龄: " + age; } }
11.继承与多态
// 抽象类示例abstract class Animal {private String name;public Animal(String name) {this.name = name;}public abstract void makeSound(); // 抽象方法public String getName() { return name; }}// 子类继承抽象类class Cat extends Animal {public Cat(String name) {super(name);}@Overridepublic void makeSound() { // 方法重写System.out.println("Meow!");}}// 抽象类示例 abstract class Animal { private String name; public Animal(String name) { this.name = name; } public abstract void makeSound(); // 抽象方法 public String getName() { return name; } } // 子类继承抽象类 class Cat extends Animal { public Cat(String name) { super(name); } @Override public void makeSound() { // 方法重写 System.out.println("Meow!"); } }
12.接口与多继承
// 定义接口interface Eatable {void eat();}// 实现接口的类class Puppy extends Dog implements Eatable {public Puppy(String breed, String color, int age) {super(breed, color, age);}@Overridepublic void eat() { // 实现接口方法System.out.println("Puppy is eating...");}// 方法重载(同名方法,参数不同)public void play(String toy) {System.out.println("Playing with " + toy);}public void play(int hours) {System.out.println("Playing for " + hours + " hours");}}// 定义接口 interface Eatable { void eat(); } // 实现接口的类 class Puppy extends Dog implements Eatable { public Puppy(String breed, String color, int age) { super(breed, color, age); } @Override public void eat() { // 实现接口方法 System.out.println("Puppy is eating..."); } // 方法重载(同名方法,参数不同) public void play(String toy) { System.out.println("Playing with " + toy); } public void play(int hours) { System.out.println("Playing for " + hours + " hours"); } }
13.封装与测试类
// 文件名:Main.javapublic class Main {public static void main(String[] args) {// 创建对象Dog myDog = new Dog("Golden Retriever", "Golden", 3);System.out.println(myDog); // 调用 toString()myDog.bark();// 测试继承与多态Animal cat = new Cat("Tom");cat.makeSound(); // 输出: Meow!// 测试接口与多态Puppy puppy = new Puppy("Husky", "Gray", 1);puppy.eat(); // 输出: Puppy is eating...puppy.play("Ball"); // 方法重载示例puppy.play(2);// 访问静态变量System.out.println("已创建的小狗数量: " + Dog.getDogCount());}}// 文件名:Main.java public class Main { public static void main(String[] args) { // 创建对象 Dog myDog = new Dog("Golden Retriever", "Golden", 3); System.out.println(myDog); // 调用 toString() myDog.bark(); // 测试继承与多态 Animal cat = new Cat("Tom"); cat.makeSound(); // 输出: Meow! // 测试接口与多态 Puppy puppy = new Puppy("Husky", "Gray", 1); puppy.eat(); // 输出: Puppy is eating... puppy.play("Ball"); // 方法重载示例 puppy.play(2); // 访问静态变量 System.out.println("已创建的小狗数量: " + Dog.getDogCount()); } }
14.Java 基本数据类型
import java.util.Optional;/*** 本类展示 Java 基本数据类型及其相关特性,并包含 JDK 各版本的新特性示例*/public class JavaDataTypesDemo {public static void main(String[] args) {// ============== 基础数据类型的定义与默认值(JDK 1.0+) ==============// 整数类型byte byteVal = 100; // 8位,-128~127short shortVal = 1000; // 16位,-32768~32767int intVal = 100000; // 32位(默认整数类型)long longVal = 100000L; // 64位,需加L后缀// 浮点类型float floatVal = 3.14f; // 32位,需加f后缀double doubleVal = 3.14; // 64位(默认浮点类型)// 布尔与字符boolean boolVal = true; // 1位,true/falsechar charVal = 'A'; // 16位,Unicode字符// ============== JDK 5 新特性:自动装箱/拆箱 ==============// 基本类型与包装类自动转换Integer autoBoxing = intVal; // 自动装箱(int -> Integer)int autoUnboxing = autoBoxing; // 自动拆箱(Integer -> int)// ============== JDK 7 新特性:二进制字面量 & 下划线分隔符 ==============int binaryLiteral = 0b1010; // 二进制前缀 0blong underscored = 1_000_000L; // 数字可加下划线增强可读性// ============== JDK 8 新特性:Optional 处理空引用 ==============Optional<String> optional = Optional.ofNullable(null);optional.ifPresentOrElse(str -> System.out.println(str),() -> System.out.println("值为空"));// ============== JDK 10 新特性:局部变量类型推断 (var) ==============var inferredInt = 100; // 编译器推断为 int 类型var inferredList = List.of(1, 2, 3); // 推断为 List<Integer>// ============== JDK 14 新特性:Record 类(简化不可变数据类) ==============record Point(int x, int y) {} // 自动生成构造器/getter/equals等方法Point p = new Point(10, 20);System.out.println(p.x() + ", " + p.y());=======================char 转Unicode 数字,表情,文字 ==============https://apps.timwhitlock.info/emoji/tables/unicode#https://www.emojiall.com/zh-hanschar c = '并';System.out.println((int) c); // 输出 20013String emoji = new String(new int[]{128512}, 0, 1);System.out.println(emoji); // 输出 😊int[] codePoints = {0x1F1F7,0x1F601};String complexEmoji = new String(codePoints, 0, 2);System.out.println(complexEmoji); // 输出 👩🚀int[] codes = {119, 111, 114, 108, 100}; // "world" 的码点StringBuilder word = new StringBuilder();for (int code : codes) {word.append((char) code); // 将码点转为字符并拼接}System.out.println(word.toString()); // 输出 world// ============== 类型转换示例 ==============// 强制转换(可能丢失精度)double d = 100.5;int i = (int) d; // 结果为 100(截断小数)// ============== 其他重要特性 ==============// JDK 15 文本块(多行字符串)String json = """{"name": "Java","version": 17}""";// JDK 16 模式匹配 instanceofObject obj = "Pattern Matching";if (obj instanceof String s) { // 直接绑定变量 sSystem.out.println(s.length());}}// ============== JDK 9 新特性:私有接口方法 ==============interface AdvancedMath {private static void log(String message) {System.out.println("Log: " + message);}default void calculate() {log("计算开始");// 实现逻辑...}}}import java.util.Optional; /** * 本类展示 Java 基本数据类型及其相关特性,并包含 JDK 各版本的新特性示例 */ public class JavaDataTypesDemo { public static void main(String[] args) { // ============== 基础数据类型的定义与默认值(JDK 1.0+) ============== // 整数类型 byte byteVal = 100; // 8位,-128~127 short shortVal = 1000; // 16位,-32768~32767 int intVal = 100000; // 32位(默认整数类型) long longVal = 100000L; // 64位,需加L后缀 // 浮点类型 float floatVal = 3.14f; // 32位,需加f后缀 double doubleVal = 3.14; // 64位(默认浮点类型) // 布尔与字符 boolean boolVal = true; // 1位,true/false char charVal = 'A'; // 16位,Unicode字符 // ============== JDK 5 新特性:自动装箱/拆箱 ============== // 基本类型与包装类自动转换 Integer autoBoxing = intVal; // 自动装箱(int -> Integer) int autoUnboxing = autoBoxing; // 自动拆箱(Integer -> int) // ============== JDK 7 新特性:二进制字面量 & 下划线分隔符 ============== int binaryLiteral = 0b1010; // 二进制前缀 0b long underscored = 1_000_000L; // 数字可加下划线增强可读性 // ============== JDK 8 新特性:Optional 处理空引用 ============== Optional<String> optional = Optional.ofNullable(null); optional.ifPresentOrElse( str -> System.out.println(str), () -> System.out.println("值为空") ); // ============== JDK 10 新特性:局部变量类型推断 (var) ============== var inferredInt = 100; // 编译器推断为 int 类型 var inferredList = List.of(1, 2, 3); // 推断为 List<Integer> // ============== JDK 14 新特性:Record 类(简化不可变数据类) ============== record Point(int x, int y) {} // 自动生成构造器/getter/equals等方法 Point p = new Point(10, 20); System.out.println(p.x() + ", " + p.y()); =======================char 转Unicode 数字,表情,文字 ============== https://apps.timwhitlock.info/emoji/tables/unicode# https://www.emojiall.com/zh-hans char c = '并'; System.out.println((int) c); // 输出 20013 String emoji = new String(new int[]{128512}, 0, 1); System.out.println(emoji); // 输出 😊 int[] codePoints = {0x1F1F7,0x1F601}; String complexEmoji = new String(codePoints, 0, 2); System.out.println(complexEmoji); // 输出 👩🚀 int[] codes = {119, 111, 114, 108, 100}; // "world" 的码点 StringBuilder word = new StringBuilder(); for (int code : codes) { word.append((char) code); // 将码点转为字符并拼接 } System.out.println(word.toString()); // 输出 world // ============== 类型转换示例 ============== // 强制转换(可能丢失精度) double d = 100.5; int i = (int) d; // 结果为 100(截断小数) // ============== 其他重要特性 ============== // JDK 15 文本块(多行字符串) String json = """ { "name": "Java", "version": 17 } """; // JDK 16 模式匹配 instanceof Object obj = "Pattern Matching"; if (obj instanceof String s) { // 直接绑定变量 s System.out.println(s.length()); } } // ============== JDK 9 新特性:私有接口方法 ============== interface AdvancedMath { private static void log(String message) { System.out.println("Log: " + message); } default void calculate() { log("计算开始"); // 实现逻辑... } } }
15.变量命名规则
// 类名:驼峰命名法,首字母大写public class NamingExample {// 实例变量:驼峰命名法,首字母小写,通常为 privateprivate int studentAge;// 静态变量(驼峰命名法):首字母小写public static int maxRetries = 3;// 静态变量(蛇形命名法):全大写+下划线,常用于常量public static final int MAX_CONNECTIONS = 10;// 方法参数:驼峰命名法,首字母小写public void processData(String inputData) {// 局部变量:驼峰命名法,首字母小写int temporaryResult = 0;// 有意义的命名示例double discountPercentage = 0.15;// 避免歧义:明确区分开始和结束时间long startTime = System.currentTimeMillis();long endTime = startTime + 1000;// ... 方法逻辑 ...}// 常量:全大写+下划线,final 修饰private static final double TAX_RATE = 0.07;// 错误示例(仅用于对比)// private int 1stValue; // 错误:数字开头// private String class; // 错误:使用关键字// public static int maxsize; // 错误:未使用驼峰命名}public class NamingExample { ... }private int studentAge;public static int maxRetries = 3;public static final int MAX_CONNECTIONS = 10;int temporaryResult = 0;double discountPercentage = 0.15;public void processData(String inputData) { ... }private static final double TAX_RATE = 0.07;// 类名:驼峰命名法,首字母大写 public class NamingExample { // 实例变量:驼峰命名法,首字母小写,通常为 private private int studentAge; // 静态变量(驼峰命名法):首字母小写 public static int maxRetries = 3; // 静态变量(蛇形命名法):全大写+下划线,常用于常量 public static final int MAX_CONNECTIONS = 10; // 方法参数:驼峰命名法,首字母小写 public void processData(String inputData) { // 局部变量:驼峰命名法,首字母小写 int temporaryResult = 0; // 有意义的命名示例 double discountPercentage = 0.15; // 避免歧义:明确区分开始和结束时间 long startTime = System.currentTimeMillis(); long endTime = startTime + 1000; // ... 方法逻辑 ... } // 常量:全大写+下划线,final 修饰 private static final double TAX_RATE = 0.07; // 错误示例(仅用于对比) // private int 1stValue; // 错误:数字开头 // private String class; // 错误:使用关键字 // public static int maxsize; // 错误:未使用驼峰命名 } public class NamingExample { ... } private int studentAge; public static int maxRetries = 3; public static final int MAX_CONNECTIONS = 10; int temporaryResult = 0; double discountPercentage = 0.15; public void processData(String inputData) { ... } private static final double TAX_RATE = 0.07;
16.修饰符
// 文件名:ModifiersExample.java// public类(访问修饰符)public class ModifiersExample {// 访问修饰符示例public int publicVar = 1; // 公有变量private int privateVar = 2; // 私有变量protected int protectedVar = 3; // 受保护变量int defaultVar = 4; // 默认访问变量// static修饰符public static int staticVar = 5; // 类变量private static int instanceCount = 0; // 静态私有计数器// final修饰符public static final double PI = 3.1415; // 常量// volatile修饰符(多线程可见性)private volatile boolean active = true;// synchronized方法(线程安全)public synchronized void increment() {instanceCount++;}// 构造方法public ModifiersExample() {instanceCount++;}// private方法private void privateMethod() {System.out.println("私有方法被调用");}// protected方法protected void protectedMethod() {System.out.println("受保护的方法被调用");}// 默认访问方法void defaultMethod() {System.out.println("默认访问方法被调用");}// 公有方法访问私有变量(封装性)public int getPrivateVar() {return privateVar;}// 内部抽象类(abstract修饰符)public abstract static class AbstractExample {public abstract void abstractMethod(); // 抽象方法}// 内部具体类继承抽象类public static class ConcreteExample extends AbstractExample {@Overridepublic void abstractMethod() {System.out.println("抽象方法实现");}}// transient变量(不参与序列化)private transient String transientData = "临时数据";public static void main(String[] args) {// 实例化主类ModifiersExample example = new ModifiersExample();// 访问不同修饰符的变量example.publicVar = 10; // 直接访问公有变量System.out.println("publicVar: " + example.publicVar);// 访问私有变量需通过公共方法System.out.println("privateVar via getter: " + example.getPrivateVar());// 调用不同访问权限的方法example.protectedMethod();example.defaultMethod();// 访问静态变量System.out.println("staticVar: " + ModifiersExample.staticVar);// 访问final常量System.out.println("PI: " + ModifiersExample.PI);// 调用synchronized方法example.increment();System.out.println("instanceCount: " + instanceCount);// 实例化内部类ConcreteExample concrete = new ConcreteExample();concrete.abstractMethod();// volatile变量操作example.active = false;System.out.println("active状态已更新: " + example.active);}}// 文件名:ModifiersExample.java // public类(访问修饰符) public class ModifiersExample { // 访问修饰符示例 public int publicVar = 1; // 公有变量 private int privateVar = 2; // 私有变量 protected int protectedVar = 3; // 受保护变量 int defaultVar = 4; // 默认访问变量 // static修饰符 public static int staticVar = 5; // 类变量 private static int instanceCount = 0; // 静态私有计数器 // final修饰符 public static final double PI = 3.1415; // 常量 // volatile修饰符(多线程可见性) private volatile boolean active = true; // synchronized方法(线程安全) public synchronized void increment() { instanceCount++; } // 构造方法 public ModifiersExample() { instanceCount++; } // private方法 private void privateMethod() { System.out.println("私有方法被调用"); } // protected方法 protected void protectedMethod() { System.out.println("受保护的方法被调用"); } // 默认访问方法 void defaultMethod() { System.out.println("默认访问方法被调用"); } // 公有方法访问私有变量(封装性) public int getPrivateVar() { return privateVar; } // 内部抽象类(abstract修饰符) public abstract static class AbstractExample { public abstract void abstractMethod(); // 抽象方法 } // 内部具体类继承抽象类 public static class ConcreteExample extends AbstractExample { @Override public void abstractMethod() { System.out.println("抽象方法实现"); } } // transient变量(不参与序列化) private transient String transientData = "临时数据"; public static void main(String[] args) { // 实例化主类 ModifiersExample example = new ModifiersExample(); // 访问不同修饰符的变量 example.publicVar = 10; // 直接访问公有变量 System.out.println("publicVar: " + example.publicVar); // 访问私有变量需通过公共方法 System.out.println("privateVar via getter: " + example.getPrivateVar()); // 调用不同访问权限的方法 example.protectedMethod(); example.defaultMethod(); // 访问静态变量 System.out.println("staticVar: " + ModifiersExample.staticVar); // 访问final常量 System.out.println("PI: " + ModifiersExample.PI); // 调用synchronized方法 example.increment(); System.out.println("instanceCount: " + instanceCount); // 实例化内部类 ConcreteExample concrete = new ConcreteExample(); concrete.abstractMethod(); // volatile变量操作 example.active = false; System.out.println("active状态已更新: " + example.active); } }
17.运算符
/*** JavaOperatorsExample 类演示了 Java 中各种运算符的使用方法。* 包括:算术、关系、位运算、逻辑、赋值、条件运算符等。*/public class JavaOperatorsExample {public static void main(String[] args) {// --------------------- 1. 算术运算符示例 ---------------------int a = 10;int b = 20;int c = 25;int d = 25;System.out.println("a + b = " + (a + b)); // 30System.out.println("a - b = " + (a - b)); // -10System.out.println("a * b = " + (a * b)); // 200System.out.println("b / a = " + (b / a)); // 2System.out.println("b % a = " + (b % a)); // 0System.out.println("c % a = " + (c % a)); // 5System.out.println("a++ = " + (a++)); // 10(先返回原值再自增)System.out.println("a-- = " + (a--)); // 11(先返回当前值再自减)System.out.println("d++ = " + (d++)); // 25System.out.println("++d = " + (++d)); // 27// --------------------- 2. 自增自减运算符示例 ---------------------int x = 5;int y = 2 * ++x; // 前缀自增:x先+1=6,再参与运算int z = 2 * x++; // 后缀自增:x先参与运算,再+1=7System.out.println("前缀自增后 x=" + x + ", y=" + y); // x=7, y=12System.out.println("后缀自增后 x=" + x + ", z=" + z); // x=7, z=12// --------------------- 3. 关系运算符示例 ---------------------System.out.println("a == b = " + (a == b)); // falseSystem.out.println("a != b = " + (a != b)); // trueSystem.out.println("a > b = " + (a > b)); // falseSystem.out.println("a < b = " + (a < b)); // true// --------------------- 4. 位运算符示例 ---------------------int bitA = 60; // 二进制:0011 1100int bitB = 13; // 二进制:0000 1101System.out.println("bitA & bitB = " + (bitA & bitB)); // 12(0000 1100)System.out.println("bitA | bitB = " + (bitA | bitB)); // 61(0011 1101)System.out.println("bitA ^ bitB = " + (bitA ^ bitB)); // 49(0011 0001)System.out.println("~bitA = " + (~bitA)); // -61(1100 0011补码)System.out.println("bitA << 2 = " + (bitA << 2)); // 240(1111 0000)System.out.println("bitA >> 2 = " + (bitA >> 2)); // 15(0000 1111)// --------------------- 5. 逻辑运算符示例 ---------------------boolean boolA = true;boolean boolB = false;System.out.println("boolA && boolB = " + (boolA && boolB)); // falseSystem.out.println("boolA || boolB = " + (boolA || boolB)); // trueSystem.out.println("!(boolA && boolB) = " + !(boolA && boolB)); // true// 短路逻辑运算符示例int num = 5;boolean result = (num < 4) && (num++ < 10); // 第一个条件为 false,不会执行第二个条件System.out.println("result = " + result + ", num = " + num); // false, num=5// --------------------- 6. 赋值运算符示例 ---------------------int assignVar = 10;assignVar += 5; // 等价于 assignVar = assignVar + 5System.out.println("assignVar += 5 → " + assignVar); // 15assignVar %= 3; // 等价于 assignVar = assignVar % 3System.out.println("assignVar %= 3 → " + assignVar); // 0// --------------------- 7. 条件运算符(三元运算符)示例 ---------------------int score = 80;String grade = (score >= 60) ? "及格" : "不及格";System.out.println("成绩结果:" + grade); // 及格// --------------------- 8. instanceof 运算符示例 ---------------------Vehicle vehicle = new Car();System.out.println("vehicle 是 Car 的实例吗?" + (vehicle instanceof Car)); // true}// 定义内部类用于 instanceof 示例static class Vehicle {}static class Car extends Vehicle {}}/** * JavaOperatorsExample 类演示了 Java 中各种运算符的使用方法。 * 包括:算术、关系、位运算、逻辑、赋值、条件运算符等。 */ public class JavaOperatorsExample { public static void main(String[] args) { // --------------------- 1. 算术运算符示例 --------------------- int a = 10; int b = 20; int c = 25; int d = 25; System.out.println("a + b = " + (a + b)); // 30 System.out.println("a - b = " + (a - b)); // -10 System.out.println("a * b = " + (a * b)); // 200 System.out.println("b / a = " + (b / a)); // 2 System.out.println("b % a = " + (b % a)); // 0 System.out.println("c % a = " + (c % a)); // 5 System.out.println("a++ = " + (a++)); // 10(先返回原值再自增) System.out.println("a-- = " + (a--)); // 11(先返回当前值再自减) System.out.println("d++ = " + (d++)); // 25 System.out.println("++d = " + (++d)); // 27 // --------------------- 2. 自增自减运算符示例 --------------------- int x = 5; int y = 2 * ++x; // 前缀自增:x先+1=6,再参与运算 int z = 2 * x++; // 后缀自增:x先参与运算,再+1=7 System.out.println("前缀自增后 x=" + x + ", y=" + y); // x=7, y=12 System.out.println("后缀自增后 x=" + x + ", z=" + z); // x=7, z=12 // --------------------- 3. 关系运算符示例 --------------------- System.out.println("a == b = " + (a == b)); // false System.out.println("a != b = " + (a != b)); // true System.out.println("a > b = " + (a > b)); // false System.out.println("a < b = " + (a < b)); // true // --------------------- 4. 位运算符示例 --------------------- int bitA = 60; // 二进制:0011 1100 int bitB = 13; // 二进制:0000 1101 System.out.println("bitA & bitB = " + (bitA & bitB)); // 12(0000 1100) System.out.println("bitA | bitB = " + (bitA | bitB)); // 61(0011 1101) System.out.println("bitA ^ bitB = " + (bitA ^ bitB)); // 49(0011 0001) System.out.println("~bitA = " + (~bitA)); // -61(1100 0011补码) System.out.println("bitA << 2 = " + (bitA << 2)); // 240(1111 0000) System.out.println("bitA >> 2 = " + (bitA >> 2)); // 15(0000 1111) // --------------------- 5. 逻辑运算符示例 --------------------- boolean boolA = true; boolean boolB = false; System.out.println("boolA && boolB = " + (boolA && boolB)); // false System.out.println("boolA || boolB = " + (boolA || boolB)); // true System.out.println("!(boolA && boolB) = " + !(boolA && boolB)); // true // 短路逻辑运算符示例 int num = 5; boolean result = (num < 4) && (num++ < 10); // 第一个条件为 false,不会执行第二个条件 System.out.println("result = " + result + ", num = " + num); // false, num=5 // --------------------- 6. 赋值运算符示例 --------------------- int assignVar = 10; assignVar += 5; // 等价于 assignVar = assignVar + 5 System.out.println("assignVar += 5 → " + assignVar); // 15 assignVar %= 3; // 等价于 assignVar = assignVar % 3 System.out.println("assignVar %= 3 → " + assignVar); // 0 // --------------------- 7. 条件运算符(三元运算符)示例 --------------------- int score = 80; String grade = (score >= 60) ? "及格" : "不及格"; System.out.println("成绩结果:" + grade); // 及格 // --------------------- 8. instanceof 运算符示例 --------------------- Vehicle vehicle = new Car(); System.out.println("vehicle 是 Car 的实例吗?" + (vehicle instanceof Car)); // true } // 定义内部类用于 instanceof 示例 static class Vehicle {} static class Car extends Vehicle {} }
18.循环
import java.util.*;import java.util.concurrent.*;import java.util.stream.*;public class AllLoopsDemo {public static void main(String[] args) {List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry", "Date");Map<Integer, String> map = Map.of(1, "A", 2, "B", 3, "C");// ========================// 基础循环结构 (JDK 1.0+)// ========================System.out.println("\n=== 传统 for 循环 ===");for (int i = 0; i < fruits.size(); i++) {System.out.println(fruits.get(i));}System.out.println("\n=== while 循环 ===");int count = 0;while (count < fruits.size()) {System.out.println(fruits.get(count++));}System.out.println("\n=== do..while 循环 ===");int index = 0;do {System.out.println(fruits.get(index++));} while (index < fruits.size());// ========================// 增强型循环 (JDK 5+)// ========================System.out.println("\n=== 增强型 for 循环 ===");for (String fruit : fruits) {System.out.println(fruit);}// ========================// 迭代器模式 (JDK 1.2+)// ========================System.out.println("\n=== 迭代器循环 ===");Iterator<String> it = fruits.iterator();while (it.hasNext()) {System.out.println(it.next());}// ========================// JDK 8+ 新特性循环// ========================System.out.println("\n=== Stream forEach ===");fruits.stream().forEach(System.out::println);System.out.println("\n=== 并行流循环 (JDK8) ===");fruits.parallelStream().forEach(System.out::println);System.out.println("\n=== forEach 方法 (JDK8) ===");fruits.forEach(fruit -> System.out.println(fruit.toUpperCase()));System.out.println("\n=== 方法引用循环 (JDK8) ===");fruits.forEach(System.out::println);// ========================// JDK 9+ 新特性循环// ========================System.out.println("\n=== takeWhile 循环 (JDK9) ===");Stream.of("A", "B", "C", "", "D").takeWhile(s -> !s.isEmpty()).forEach(System.out::println);System.out.println("\n=== dropWhile 循环 (JDK9) ===");Stream.of(2, 4, 6, 8, 9, 10).dropWhile(n -> n % 2 == 0).forEach(System.out::println);// ========================// JDK 16+ 新特性// ========================System.out.println("\n=== Stream.mapMulti (JDK16) ===");record Pair(String k, int v) {}List<Pair> pairs = List.of(new Pair("A", 1), new Pair("B", 2));pairs.stream().mapMulti((pair, consumer) -> {consumer.accept(pair.k());consumer.accept(pair.v());}).forEach(System.out::println);// ========================// 特殊数据结构循环// ========================System.out.println("\n=== Map 遍历 (JDK8+) ===");map.forEach((k, v) -> System.out.println(k + ":" + v));System.out.println("\n=== 枚举遍历 ===");Vector<String> vector = new Vector<>(fruits);Enumeration<String> en = vector.elements();while (en.hasMoreElements()) {System.out.println(en.nextElement());}// ========================// 异步循环 (JDK8+)// ========================System.out.println("\n=== CompletableFuture 循环 (JDK8) ===");List<CompletableFuture<Void>> futures = fruits.stream().map(fruit -> CompletableFuture.runAsync(() ->System.out.println("Async: " + fruit))).toList();CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();}}import java.util.*; import java.util.concurrent.*; import java.util.stream.*; public class AllLoopsDemo { public static void main(String[] args) { List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry", "Date"); Map<Integer, String> map = Map.of(1, "A", 2, "B", 3, "C"); // ======================== // 基础循环结构 (JDK 1.0+) // ======================== System.out.println("\n=== 传统 for 循环 ==="); for (int i = 0; i < fruits.size(); i++) { System.out.println(fruits.get(i)); } System.out.println("\n=== while 循环 ==="); int count = 0; while (count < fruits.size()) { System.out.println(fruits.get(count++)); } System.out.println("\n=== do..while 循环 ==="); int index = 0; do { System.out.println(fruits.get(index++)); } while (index < fruits.size()); // ======================== // 增强型循环 (JDK 5+) // ======================== System.out.println("\n=== 增强型 for 循环 ==="); for (String fruit : fruits) { System.out.println(fruit); } // ======================== // 迭代器模式 (JDK 1.2+) // ======================== System.out.println("\n=== 迭代器循环 ==="); Iterator<String> it = fruits.iterator(); while (it.hasNext()) { System.out.println(it.next()); } // ======================== // JDK 8+ 新特性循环 // ======================== System.out.println("\n=== Stream forEach ==="); fruits.stream().forEach(System.out::println); System.out.println("\n=== 并行流循环 (JDK8) ==="); fruits.parallelStream().forEach(System.out::println); System.out.println("\n=== forEach 方法 (JDK8) ==="); fruits.forEach(fruit -> System.out.println(fruit.toUpperCase())); System.out.println("\n=== 方法引用循环 (JDK8) ==="); fruits.forEach(System.out::println); // ======================== // JDK 9+ 新特性循环 // ======================== System.out.println("\n=== takeWhile 循环 (JDK9) ==="); Stream.of("A", "B", "C", "", "D") .takeWhile(s -> !s.isEmpty()) .forEach(System.out::println); System.out.println("\n=== dropWhile 循环 (JDK9) ==="); Stream.of(2, 4, 6, 8, 9, 10) .dropWhile(n -> n % 2 == 0) .forEach(System.out::println); // ======================== // JDK 16+ 新特性 // ======================== System.out.println("\n=== Stream.mapMulti (JDK16) ==="); record Pair(String k, int v) {} List<Pair> pairs = List.of(new Pair("A", 1), new Pair("B", 2)); pairs.stream() .mapMulti((pair, consumer) -> { consumer.accept(pair.k()); consumer.accept(pair.v()); }) .forEach(System.out::println); // ======================== // 特殊数据结构循环 // ======================== System.out.println("\n=== Map 遍历 (JDK8+) ==="); map.forEach((k, v) -> System.out.println(k + ":" + v)); System.out.println("\n=== 枚举遍历 ==="); Vector<String> vector = new Vector<>(fruits); Enumeration<String> en = vector.elements(); while (en.hasMoreElements()) { System.out.println(en.nextElement()); } // ======================== // 异步循环 (JDK8+) // ======================== System.out.println("\n=== CompletableFuture 循环 (JDK8) ==="); List<CompletableFuture<Void>> futures = fruits.stream() .map(fruit -> CompletableFuture.runAsync(() -> System.out.println("Async: " + fruit))) .toList(); CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); } }
19.涵盖条件语句、switch-case
、Number/Math
类、Character
类、String
类、StringBuilder
类
import java.util.Locale;/*** 综合示例类:整合条件语句、switch-case、Number/Math、Character、String、StringBuilder 的使用*/public class IntegrationExample {// 示例1:条件语句(链接1) + switch-case(链接2)public static void evaluateGrade(int score) {// if-else 条件分支(链接1)if (score < 0 || score > 100) {System.out.println("无效分数");return;}// switch-case 判断等级(链接2)String grade;switch (score / 10) {case 10:case 9:grade = "A";break;case 8:grade = "B";break;case 7:grade = "C";break;case 6:grade = "D";break;default:grade = "F";}System.out.println("得分等级: " + grade);}// 示例2:Number/Math 类(链接3) + Character 类(链接4)public static void numberAndCharDemo() {// 装箱拆箱(链接3)Integer numObj = 42; // 自动装箱int num = numObj; // 自动拆箱// Math 类方法(链接3)double sqrtVal = Math.sqrt(num);long rounded = Math.round(3.6);// Character 类方法(链接4)char ch = 'A';boolean isLetter = Character.isLetter(ch);boolean isDigit = Character.isDigit('7');System.out.printf("Math.sqrt(%d)=%.2f, 字符'%c'是字母:%b\n", num, sqrtVal, ch, isLetter);}// 示例3:String 类(链接5)操作public static void stringOperations() {// 字符串创建与连接String s1 = "Hello";String s2 = new String(" World");String combined = s1.concat(s2).toUpperCase();// 字符串格式化(链接5)String formatted = String.format(Locale.US, "格式化示例:%s 长度=%d", combined, combined.length());// 子字符串操作String substring = combined.substring(0, 5);System.out.println(formatted + " | 子串: " + substring);}// 示例4:StringBuilder(链接6)高效操作public static void stringBuilderDemo() {StringBuilder sb = new StringBuilder();sb.append("初始内容") // 追加内容.insert(2, "[插入]") // 在索引2处插入.delete(5, 7) // 删除索引5-7.reverse(); // 反转字符串System.out.println("StringBuilder结果: " + sb);}public static void main(String[] args) {// 执行所有示例evaluateGrade(85);numberAndCharDemo();stringOperations();stringBuilderDemo();}}import java.util.Locale; /** * 综合示例类:整合条件语句、switch-case、Number/Math、Character、String、StringBuilder 的使用 */ public class IntegrationExample { // 示例1:条件语句(链接1) + switch-case(链接2) public static void evaluateGrade(int score) { // if-else 条件分支(链接1) if (score < 0 || score > 100) { System.out.println("无效分数"); return; } // switch-case 判断等级(链接2) String grade; switch (score / 10) { case 10: case 9: grade = "A"; break; case 8: grade = "B"; break; case 7: grade = "C"; break; case 6: grade = "D"; break; default: grade = "F"; } System.out.println("得分等级: " + grade); } // 示例2:Number/Math 类(链接3) + Character 类(链接4) public static void numberAndCharDemo() { // 装箱拆箱(链接3) Integer numObj = 42; // 自动装箱 int num = numObj; // 自动拆箱 // Math 类方法(链接3) double sqrtVal = Math.sqrt(num); long rounded = Math.round(3.6); // Character 类方法(链接4) char ch = 'A'; boolean isLetter = Character.isLetter(ch); boolean isDigit = Character.isDigit('7'); System.out.printf("Math.sqrt(%d)=%.2f, 字符'%c'是字母:%b\n", num, sqrtVal, ch, isLetter); } // 示例3:String 类(链接5)操作 public static void stringOperations() { // 字符串创建与连接 String s1 = "Hello"; String s2 = new String(" World"); String combined = s1.concat(s2).toUpperCase(); // 字符串格式化(链接5) String formatted = String.format(Locale.US, "格式化示例:%s 长度=%d", combined, combined.length()); // 子字符串操作 String substring = combined.substring(0, 5); System.out.println(formatted + " | 子串: " + substring); } // 示例4:StringBuilder(链接6)高效操作 public static void stringBuilderDemo() { StringBuilder sb = new StringBuilder(); sb.append("初始内容") // 追加内容 .insert(2, "[插入]") // 在索引2处插入 .delete(5, 7) // 删除索引5-7 .reverse(); // 反转字符串 System.out.println("StringBuilder结果: " + sb); } public static void main(String[] args) { // 执行所有示例 evaluateGrade(85); numberAndCharDemo(); stringOperations(); stringBuilderDemo(); } }
20.涵盖数组、日期时间、正则表达式、方法、构造方法、文件 IO、Scanner 和异常处理
import java.io.*;import java.text.SimpleDateFormat;import java.util.*;import java.util.regex.*;/*** 综合示例类,涵盖以下知识点:* 1. 数组(链接1) 2. 日期时间(链接2) 3. 正则表达式(链接3)* 4. 方法(链接4) 5. 构造方法(链接5) 6. 文件IO(链接6)* 7. Scanner(链接7) 8. 异常处理(链接8)*/public class IntegratedExamples {// 自定义异常(对应链接8)static class InvalidEmailException extends Exception {public InvalidEmailException(String message) {super(message);}}// 示例方法:数组操作(对应链接1)public static void arrayExample() {int[] numbers = {10, 20, 30, 40, 50};System.out.println("数组遍历:");for (int num : numbers) {System.out.print(num + " ");}System.out.println("\n数组总和:" + calculateSum(numbers));}// 示例方法:计算数组总和(对应链接4的方法定义)private static int calculateSum(int[] arr) {int sum = 0;for (int num : arr) {sum += num;}return sum;}// 示例方法:日期时间处理(对应链接2)public static void dateTimeExample() {Date now = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("当前时间:" + sdf.format(now));Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DAY_OF_MONTH, 7);System.out.println("7天后日期:" + sdf.format(calendar.getTime()));}// 示例方法:正则表达式验证邮箱(对应链接3)public static void validateEmail(String email) throws InvalidEmailException {String regex = "^[A-Za-z0-9+_.-]+@(.+)$";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(email);if (!matcher.matches()) {throw new InvalidEmailException("无效邮箱格式:" + email);}System.out.println("邮箱验证通过:" + email);}// 示例方法:文件读写(对应链接6)public static void fileIOExample() throws IOException {String fileName = "demo.txt";try (FileWriter writer = new FileWriter(fileName)) {writer.write("Hello, File IO!\n");writer.write("当前时间:" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()));}System.out.println("\n文件内容:");try (Scanner fileScanner = new Scanner(new File(fileName))) {while (fileScanner.hasNextLine()) {System.out.println(fileScanner.nextLine());}}}// 主方法(整合所有功能)public static void main(String[] args) {Scanner scanner = new Scanner(System.in);try {// 1. 数组操作示例arrayExample();// 2. 日期时间示例dateTimeExample();// 3. 邮箱验证(用户输入)System.out.print("\n请输入邮箱地址:");String email = scanner.nextLine();validateEmail(email);// 4. 文件IO操作fileIOExample();// 5. 构造方法示例:处理自定义异常if (!email.contains("@company.com")) {throw new InvalidEmailException("仅支持公司邮箱");}} catch (ArrayIndexOutOfBoundsException e) {System.err.println("数组越界错误:" + e.getMessage());} catch (InvalidEmailException e) {System.err.println("邮箱错误:" + e.getMessage());} catch (IOException e) {System.err.println("文件操作失败:" + e.getMessage());} catch (InputMismatchException e) {System.err.println("输入类型不匹配");} finally {scanner.close();System.out.println("\n程序执行完毕,资源已释放");}}}import java.io.*; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.*; /** * 综合示例类,涵盖以下知识点: * 1. 数组(链接1) 2. 日期时间(链接2) 3. 正则表达式(链接3) * 4. 方法(链接4) 5. 构造方法(链接5) 6. 文件IO(链接6) * 7. Scanner(链接7) 8. 异常处理(链接8) */ public class IntegratedExamples { // 自定义异常(对应链接8) static class InvalidEmailException extends Exception { public InvalidEmailException(String message) { super(message); } } // 示例方法:数组操作(对应链接1) public static void arrayExample() { int[] numbers = {10, 20, 30, 40, 50}; System.out.println("数组遍历:"); for (int num : numbers) { System.out.print(num + " "); } System.out.println("\n数组总和:" + calculateSum(numbers)); } // 示例方法:计算数组总和(对应链接4的方法定义) private static int calculateSum(int[] arr) { int sum = 0; for (int num : arr) { sum += num; } return sum; } // 示例方法:日期时间处理(对应链接2) public static void dateTimeExample() { Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("当前时间:" + sdf.format(now)); Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DAY_OF_MONTH, 7); System.out.println("7天后日期:" + sdf.format(calendar.getTime())); } // 示例方法:正则表达式验证邮箱(对应链接3) public static void validateEmail(String email) throws InvalidEmailException { String regex = "^[A-Za-z0-9+_.-]+@(.+)$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(email); if (!matcher.matches()) { throw new InvalidEmailException("无效邮箱格式:" + email); } System.out.println("邮箱验证通过:" + email); } // 示例方法:文件读写(对应链接6) public static void fileIOExample() throws IOException { String fileName = "demo.txt"; try (FileWriter writer = new FileWriter(fileName)) { writer.write("Hello, File IO!\n"); writer.write("当前时间:" + new SimpleDateFormat("yyyy-MM-dd").format(new Date())); } System.out.println("\n文件内容:"); try (Scanner fileScanner = new Scanner(new File(fileName))) { while (fileScanner.hasNextLine()) { System.out.println(fileScanner.nextLine()); } } } // 主方法(整合所有功能) public static void main(String[] args) { Scanner scanner = new Scanner(System.in); try { // 1. 数组操作示例 arrayExample(); // 2. 日期时间示例 dateTimeExample(); // 3. 邮箱验证(用户输入) System.out.print("\n请输入邮箱地址:"); String email = scanner.nextLine(); validateEmail(email); // 4. 文件IO操作 fileIOExample(); // 5. 构造方法示例:处理自定义异常 if (!email.contains("@company.com")) { throw new InvalidEmailException("仅支持公司邮箱"); } } catch (ArrayIndexOutOfBoundsException e) { System.err.println("数组越界错误:" + e.getMessage()); } catch (InvalidEmailException e) { System.err.println("邮箱错误:" + e.getMessage()); } catch (IOException e) { System.err.println("文件操作失败:" + e.getMessage()); } catch (InputMismatchException e) { System.err.println("输入类型不匹配"); } finally { scanner.close(); System.out.println("\n程序执行完毕,资源已释放"); } } }
21.继承、多态、封装、抽象类、接口、枚举、反射、包 等特性
=================包结构与枚举定义=============// 文件路径: com/example/enums/AnimalType.javapackage com.example.enums;// 枚举:动物类型public enum AnimalType {MAMMAL, BIRD, REPTILE;}==================抽象类与封装===========// 文件路径: com/example/model/Animal.javapackage com.example.model;import com.example.enums.AnimalType;// 抽象类 + 封装public abstract class Animal {// 封装属性private String name;private int age;private AnimalType type;public Animal(String name, int age, AnimalType type) {this.name = name;this.age = age;this.type = type;}// Getter/Setterpublic String getName() { return name; }public int getAge() { return age; }public AnimalType getType() { return type; }// 抽象方法public abstract void makeSound();// 通用方法(可被重写)public void eat() {System.out.println(name + " is eating.");}}=============接口定义=========// 文件路径: com/example/interfaces/Swimmable.javapackage com.example.interfaces;// 接口public interface Swimmable {void swim();}=============具体子类实现(继承、多态、重写、接口)========// 文件路径: com/example/model/Dog.javapackage com.example.model;import com.example.enums.AnimalType;import com.example.interfaces.Swimmable;// 继承 + 实现接口 + 重写public class Dog extends Animal implements Swimmable {public Dog(String name, int age) {super(name, age, AnimalType.MAMMAL);}@Overridepublic void makeSound() {System.out.println(getName() + " says: Woof!");}@Overridepublic void swim() {System.out.println(getName() + " is swimming.");}}// 文件路径: com/example/model/Penguin.javapackage com.example.model;import com.example.enums.AnimalType;public class Penguin extends Animal {public Penguin(String name, int age) {super(name, age, AnimalType.BIRD);}@Overridepublic void makeSound() {System.out.println(getName() + " says: Honk!");}// 方法重载public void eat(String food) {System.out.println(getName() + " is eating " + food);}}===============反射操作类=========// 文件路径: com/example/util/ReflectionDemo.javapackage com.example.util;import com.example.model.Animal;import java.lang.reflect.Constructor;import java.lang.reflect.Method;// 反射操作public class ReflectionDemo {public static void demoReflection() throws Exception {// 通过类名获取Class对象Class<?> clazz = Class.forName("com.example.model.Dog");// 创建实例Constructor<?> constructor = clazz.getConstructor(String.class, int.class);Animal dog = (Animal) constructor.newInstance("Buddy", 3);// 调用方法Method makeSound = clazz.getMethod("makeSound");makeSound.invoke(dog);}}================= 主类(多态、包、枚举使用===============// 文件路径: com/example/MainApp.javapackage com.example;import com.example.enums.AnimalType;import com.example.model.Animal;import com.example.model.Dog;import com.example.model.Penguin;import com.example.util.ReflectionDemo;public class MainApp {public static void main(String[] args) throws Exception {// 多态Animal animal1 = new Dog("Rex", 2);Animal animal2 = new Penguin("Pingu", 5);// 调用重写方法animal1.makeSound(); // 输出: Rex says: Woof!animal2.makeSound(); // 输出: Pingu says: Honk!// 接口方法调用((Dog) animal1).swim(); // 输出: Rex is swimming.// 枚举使用System.out.println(animal2.getType()); // 输出: BIRD// 反射演示ReflectionDemo.demoReflection();}}=================包结构与枚举定义============= // 文件路径: com/example/enums/AnimalType.java package com.example.enums; // 枚举:动物类型 public enum AnimalType { MAMMAL, BIRD, REPTILE; } ==================抽象类与封装=========== // 文件路径: com/example/model/Animal.java package com.example.model; import com.example.enums.AnimalType; // 抽象类 + 封装 public abstract class Animal { // 封装属性 private String name; private int age; private AnimalType type; public Animal(String name, int age, AnimalType type) { this.name = name; this.age = age; this.type = type; } // Getter/Setter public String getName() { return name; } public int getAge() { return age; } public AnimalType getType() { return type; } // 抽象方法 public abstract void makeSound(); // 通用方法(可被重写) public void eat() { System.out.println(name + " is eating."); } } =============接口定义========= // 文件路径: com/example/interfaces/Swimmable.java package com.example.interfaces; // 接口 public interface Swimmable { void swim(); } =============具体子类实现(继承、多态、重写、接口)======== // 文件路径: com/example/model/Dog.java package com.example.model; import com.example.enums.AnimalType; import com.example.interfaces.Swimmable; // 继承 + 实现接口 + 重写 public class Dog extends Animal implements Swimmable { public Dog(String name, int age) { super(name, age, AnimalType.MAMMAL); } @Override public void makeSound() { System.out.println(getName() + " says: Woof!"); } @Override public void swim() { System.out.println(getName() + " is swimming."); } } // 文件路径: com/example/model/Penguin.java package com.example.model; import com.example.enums.AnimalType; public class Penguin extends Animal { public Penguin(String name, int age) { super(name, age, AnimalType.BIRD); } @Override public void makeSound() { System.out.println(getName() + " says: Honk!"); } // 方法重载 public void eat(String food) { System.out.println(getName() + " is eating " + food); } } ===============反射操作类========= // 文件路径: com/example/util/ReflectionDemo.java package com.example.util; import com.example.model.Animal; import java.lang.reflect.Constructor; import java.lang.reflect.Method; // 反射操作 public class ReflectionDemo { public static void demoReflection() throws Exception { // 通过类名获取Class对象 Class<?> clazz = Class.forName("com.example.model.Dog"); // 创建实例 Constructor<?> constructor = clazz.getConstructor(String.class, int.class); Animal dog = (Animal) constructor.newInstance("Buddy", 3); // 调用方法 Method makeSound = clazz.getMethod("makeSound"); makeSound.invoke(dog); } } ================= 主类(多态、包、枚举使用=============== // 文件路径: com/example/MainApp.java package com.example; import com.example.enums.AnimalType; import com.example.model.Animal; import com.example.model.Dog; import com.example.model.Penguin; import com.example.util.ReflectionDemo; public class MainApp { public static void main(String[] args) throws Exception { // 多态 Animal animal1 = new Dog("Rex", 2); Animal animal2 = new Penguin("Pingu", 5); // 调用重写方法 animal1.makeSound(); // 输出: Rex says: Woof! animal2.makeSound(); // 输出: Pingu says: Honk! // 接口方法调用 ((Dog) animal1).swim(); // 输出: Rex is swimming. // 枚举使用 System.out.println(animal2.getType()); // 输出: BIRD // 反射演示 ReflectionDemo.demoReflection(); } }
22.结构实现、集合操作、新特性
// 导入所有需要的Java集合类和特性import java.util.*;import java.util.concurrent.ConcurrentHashMap;import java.time.LocalDate;import java.util.stream.Collectors;/*** 本类演示Java集合框架核心组件及JDK 1-24关键特性* 包含数据结构实现、集合操作、新特性应用示例* 每个操作均包含详细注释说明*/public class CollectionExamples {public static void main(String[] args) {// ==================== 基础数据结构示例 ====================// ArrayList示例(JDK 1.2引入)List<String> arrayList = new ArrayList<>(); // JDK7+ 菱形语法arrayList.add("Java"); // 添加元素arrayList.add(0, "Python"); // 在指定位置插入(JDK1.2)System.out.println("ArrayList: " + arrayList);// LinkedList示例(JDK 1.2)Deque<String> linkedList = new LinkedList<>(); // 实现Deque接口(JDK6+)linkedList.addFirst("First"); // 头部插入(JDK1.6)linkedList.addLast("Last"); // 尾部插入System.out.println("LinkedList: " + linkedList);// HashSet示例(JDK 1.2)Set<Integer> hashSet = new HashSet<>();hashSet.add(10);hashSet.add(10); // 重复元素自动过滤System.out.println("HashSet: " + hashSet);// HashMap示例(JDK 1.2)Map<String, Integer> hashMap = new HashMap<>();hashMap.put("Apple", 10); // 添加键值对hashMap.putIfAbsent("Apple", 20); // JDK8+ 方法System.out.println("HashMap: " + hashMap);// ==================== 迭代器与遍历 ====================// 传统迭代器(JDK1.2)Iterator<String> it = arrayList.iterator();while(it.hasNext()) {String element = it.next();if(element.equals("Python")) {it.remove(); // 安全删除元素}}// 增强for循环(JDK5+)for(String s : arrayList) {System.out.println("ForEach: " + s);}// ==================== JDK新特性示例 ====================// JDK8+ Lambda表达式arrayList.forEach(element ->System.out.println("Lambda: " + element));// JDK8+ Stream APIList<String> filtered = arrayList.stream().filter(s -> s.length() > 3) // 过滤.map(String::toUpperCase) // 转换.collect(Collectors.toList()); // 收集结果System.out.println("Stream处理: " + filtered);// JDK10+ 局部变量类型推断var varList = List.of("A", "B", "C"); // JDK9+ List.of// JDK16+ Record类(不可变数据载体)record Person(String name, int age) {} // 自动生成equals/hashCodePerson p = new Person("Alice", 30);System.out.println("Record: " + p);// JDK14+ Switch表达式String result = switch(p.age()) {case 30 -> "Young"; // 箭头语法default -> "Other";};System.out.println("Switch表达式: " + result);// JDK15+ 文本块String json = """{"name": "%s","age": %d}""".formatted(p.name(), p.age()); // JDK15+ formattedSystem.out.println("文本块JSON:\n" + json);// JDK21+ 虚拟线程(预览特性)Runnable task = () -> System.out.println(Thread.currentThread().isVirtual() ? "虚拟线程" : "平台线程");Thread.ofVirtual().start(task); // 创建虚拟线程// ==================== 并发集合示例 ====================// ConcurrentHashMap(JDK5+)Map<String, Integer> concurrentMap = new ConcurrentHashMap<>();concurrentMap.computeIfAbsent("key", k -> 100); // JDK8+方法// CopyOnWriteArrayList(JDK5+)List<String> cowList = new CopyOnWriteArrayList<>();cowList.addAll(List.of("线程安全", "写时复制"));// ==================== 其他重要特性 ====================// Optional避免空指针(JDK8+)Optional<String> opt = Optional.ofNullable(null);System.out.println("Optional: " + opt.orElse("默认值"));// 时间API(JDK8+)LocalDate today = LocalDate.now();System.out.println("当前日期: " + today);// 模块化系统(JDK9+)// module-info.java中需要声明: requires java.base;// 模式匹配instanceof(JDK16+预览,JDK21正式)Object obj = "字符串";if(obj instanceof String s && s.length() > 2) {System.out.println("模式匹配: " + s.toUpperCase());}}}// 导入所有需要的Java集合类和特性 import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.time.LocalDate; import java.util.stream.Collectors; /** * 本类演示Java集合框架核心组件及JDK 1-24关键特性 * 包含数据结构实现、集合操作、新特性应用示例 * 每个操作均包含详细注释说明 */ public class CollectionExamples { public static void main(String[] args) { // ==================== 基础数据结构示例 ==================== // ArrayList示例(JDK 1.2引入) List<String> arrayList = new ArrayList<>(); // JDK7+ 菱形语法 arrayList.add("Java"); // 添加元素 arrayList.add(0, "Python"); // 在指定位置插入(JDK1.2) System.out.println("ArrayList: " + arrayList); // LinkedList示例(JDK 1.2) Deque<String> linkedList = new LinkedList<>(); // 实现Deque接口(JDK6+) linkedList.addFirst("First"); // 头部插入(JDK1.6) linkedList.addLast("Last"); // 尾部插入 System.out.println("LinkedList: " + linkedList); // HashSet示例(JDK 1.2) Set<Integer> hashSet = new HashSet<>(); hashSet.add(10); hashSet.add(10); // 重复元素自动过滤 System.out.println("HashSet: " + hashSet); // HashMap示例(JDK 1.2) Map<String, Integer> hashMap = new HashMap<>(); hashMap.put("Apple", 10); // 添加键值对 hashMap.putIfAbsent("Apple", 20); // JDK8+ 方法 System.out.println("HashMap: " + hashMap); // ==================== 迭代器与遍历 ==================== // 传统迭代器(JDK1.2) Iterator<String> it = arrayList.iterator(); while(it.hasNext()) { String element = it.next(); if(element.equals("Python")) { it.remove(); // 安全删除元素 } } // 增强for循环(JDK5+) for(String s : arrayList) { System.out.println("ForEach: " + s); } // ==================== JDK新特性示例 ==================== // JDK8+ Lambda表达式 arrayList.forEach(element -> System.out.println("Lambda: " + element)); // JDK8+ Stream API List<String> filtered = arrayList.stream() .filter(s -> s.length() > 3) // 过滤 .map(String::toUpperCase) // 转换 .collect(Collectors.toList()); // 收集结果 System.out.println("Stream处理: " + filtered); // JDK10+ 局部变量类型推断 var varList = List.of("A", "B", "C"); // JDK9+ List.of // JDK16+ Record类(不可变数据载体) record Person(String name, int age) {} // 自动生成equals/hashCode Person p = new Person("Alice", 30); System.out.println("Record: " + p); // JDK14+ Switch表达式 String result = switch(p.age()) { case 30 -> "Young"; // 箭头语法 default -> "Other"; }; System.out.println("Switch表达式: " + result); // JDK15+ 文本块 String json = """ { "name": "%s", "age": %d } """.formatted(p.name(), p.age()); // JDK15+ formatted System.out.println("文本块JSON:\n" + json); // JDK21+ 虚拟线程(预览特性) Runnable task = () -> System.out.println( Thread.currentThread().isVirtual() ? "虚拟线程" : "平台线程"); Thread.ofVirtual().start(task); // 创建虚拟线程 // ==================== 并发集合示例 ==================== // ConcurrentHashMap(JDK5+) Map<String, Integer> concurrentMap = new ConcurrentHashMap<>(); concurrentMap.computeIfAbsent("key", k -> 100); // JDK8+方法 // CopyOnWriteArrayList(JDK5+) List<String> cowList = new CopyOnWriteArrayList<>(); cowList.addAll(List.of("线程安全", "写时复制")); // ==================== 其他重要特性 ==================== // Optional避免空指针(JDK8+) Optional<String> opt = Optional.ofNullable(null); System.out.println("Optional: " + opt.orElse("默认值")); // 时间API(JDK8+) LocalDate today = LocalDate.now(); System.out.println("当前日期: " + today); // 模块化系统(JDK9+) // module-info.java中需要声明: requires java.base; // 模式匹配instanceof(JDK16+预览,JDK21正式) Object obj = "字符串"; if(obj instanceof String s && s.length() > 2) { System.out.println("模式匹配: " + s.toUpperCase()); } } }
23.泛型示例代码
================有界类型参数 来限制泛型类型==============class A {String name;public A(String name) {this.name = name;}@Overridepublic String toString() {return "A{name='" + name + "'}";}}class B extends A {public B(String name) {super(name);}}public class RestrictedGenericMethod {// 泛型方法,限制只有 A 类或其子类可以调用public static <T extends A> void process(T obj) {System.out.println("Processing object: " + obj);}public static void main(String[] args) {A a = new A("Object A");B b = new B("Object B");// 调用方法process(a); // 合法:A 是 T 的上限process(b); // 合法:B 是 A 的子类// 如果尝试传入非 A 类型的对象,编译器会报错// String str = "Hello";// process(str); // 编译错误:String 不是 A 的子类}}//如果 A 实现了某个接口(如 Comparable<A>),你还可以进一步限制泛型类型:public static <T extends A & Comparable<T>> void process(T obj) {System.out.println("Processing object: " + obj);}====================泛型=================// 引入Java 5新特性:泛型(Generics)public class GenericDemo<T> { // 泛型类定义,T为类型参数(JDK5新特性)private T data; // 泛型字段,类型由实例化时指定(JDK5)public GenericDemo(T data) { // 泛型构造方法(JDK5)this.data = data;}// 泛型方法,E为独立类型参数(JDK5)public static <E> void printElements(E[] elements) {// 增强for循环(JDK5新特性)for (E element : elements) {System.out.print(element + " ");}System.out.println();}// 有界类型参数:T必须实现Comparable接口(JDK5)public static <T extends Comparable<T>> T findMax(T a, T b) {return a.compareTo(b) > 0 ? a : b;}// 类型通配符示例(JDK5)public static void printWildcardList(List<?> list) {System.out.println("List Content: " + list.get(0));}public static void main(String[] args) {// 泛型类实例化(JDK5)GenericDemo<Integer> intDemo = new GenericDemo<>(100);// 钻石操作符类型推断(JDK7新特性)System.out.println("Integer Data: " + intDemo.data);// 泛型方法调用String[] strArr = {"A", "B", "C"};printElements(strArr); // 类型自动推断(JDK5)// 有界泛型方法调用System.out.println("Max Value: " + findMax(15, 25));// 类型通配符使用List<Double> doubleList = List.of(3.14); // List.of(JDK9新特性)printWildcardList(doubleList);// var局部变量类型推断(JDK10新特性)var stringDemo = new GenericDemo<>("Hello Generics");System.out.println("String Data: " + stringDemo.data);}}================有界类型参数 来限制泛型类型============== class A { String name; public A(String name) { this.name = name; } @Override public String toString() { return "A{name='" + name + "'}"; } } class B extends A { public B(String name) { super(name); } } public class RestrictedGenericMethod { // 泛型方法,限制只有 A 类或其子类可以调用 public static <T extends A> void process(T obj) { System.out.println("Processing object: " + obj); } public static void main(String[] args) { A a = new A("Object A"); B b = new B("Object B"); // 调用方法 process(a); // 合法:A 是 T 的上限 process(b); // 合法:B 是 A 的子类 // 如果尝试传入非 A 类型的对象,编译器会报错 // String str = "Hello"; // process(str); // 编译错误:String 不是 A 的子类 } } //如果 A 实现了某个接口(如 Comparable<A>),你还可以进一步限制泛型类型: public static <T extends A & Comparable<T>> void process(T obj) { System.out.println("Processing object: " + obj); } ====================泛型================= // 引入Java 5新特性:泛型(Generics) public class GenericDemo<T> { // 泛型类定义,T为类型参数(JDK5新特性) private T data; // 泛型字段,类型由实例化时指定(JDK5) public GenericDemo(T data) { // 泛型构造方法(JDK5) this.data = data; } // 泛型方法,E为独立类型参数(JDK5) public static <E> void printElements(E[] elements) { // 增强for循环(JDK5新特性) for (E element : elements) { System.out.print(element + " "); } System.out.println(); } // 有界类型参数:T必须实现Comparable接口(JDK5) public static <T extends Comparable<T>> T findMax(T a, T b) { return a.compareTo(b) > 0 ? a : b; } // 类型通配符示例(JDK5) public static void printWildcardList(List<?> list) { System.out.println("List Content: " + list.get(0)); } public static void main(String[] args) { // 泛型类实例化(JDK5) GenericDemo<Integer> intDemo = new GenericDemo<>(100); // 钻石操作符类型推断(JDK7新特性) System.out.println("Integer Data: " + intDemo.data); // 泛型方法调用 String[] strArr = {"A", "B", "C"}; printElements(strArr); // 类型自动推断(JDK5) // 有界泛型方法调用 System.out.println("Max Value: " + findMax(15, 25)); // 类型通配符使用 List<Double> doubleList = List.of(3.14); // List.of(JDK9新特性) printWildcardList(doubleList); // var局部变量类型推断(JDK10新特性) var stringDemo = new GenericDemo<>("Hello Generics"); System.out.println("String Data: " + stringDemo.data); } }
24.序列化
// 导入序列化相关类import java.io.Serializable;import java.io.ObjectOutputStream;import java.io.ObjectInputStream;import java.io.FileOutputStream;import java.io.FileInputStream;import java.io.IOException;/*** 示例类:实现Serializable接口以支持序列化* JDK 1.1+ 支持基础序列化功能*/public class SerializationExample implements Serializable {// 普通字段,默认支持序列化private String name;// transient字段:不参与序列化(JDK 1.1+)private transient int sensitiveData;// 静态字段:不会被序列化(属于类级别)private static String staticField = "Class-Level Data";/*** 构造函数*/public SerializationExample(String name, int sensitiveData) {this.name = name;this.sensitiveData = sensitiveData;}/*** 序列化对象到文件*/public void serialize(String filename) {try (// 文件输出流(JDK 1.1+)FileOutputStream fileOut = new FileOutputStream(filename);// 对象输出流(JDK 1.1+)ObjectOutputStream out = new ObjectOutputStream(fileOut)) {out.writeObject(this); // 将当前对象写入流} catch (IOException e) {e.printStackTrace();}}/*** 从文件反序列化对象*/public static SerializationExample deserialize(String filename) {try (// 文件输入流(JDK 1.1+)FileInputStream fileIn = new FileInputStream(filename);// 对象输入流(JDK 1.1+)ObjectInputStream in = new ObjectInputStream(fileIn)) {// 强制类型转换(JDK 1.5+ 泛型可优化此处)return (SerializationExample) in.readObject();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();return null;}}/*** 重写toString方法(JDK 1.0+)*/@Overridepublic String toString() {return "Name: " + name + ", SensitiveData: " + sensitiveData;}/*** 主方法测试序列化与反序列化*/public static void main(String[] args) {// 创建对象SerializationExample obj = new SerializationExample("Test", 12345);// 序列化到文件obj.serialize("example.ser");// 反序列化后输出SerializationExample restored = deserialize("example.ser");System.out.println(restored);// 输出:Name: Test, SensitiveData: 0(transient字段丢失)}}//JDK 8的Lambda序列化// Lambda表达式需满足函数式接口且捕获变量可序列化Serializable lambda = (Serializable & Runnable) () -> System.out.println("Serializable Lambda");//JDK 17的反序列化过滤器// 设置反序列化过滤器(阻止特定类)ObjectInputFilter filter = info -> info.serialClass() == Dangerous.class ? Status.REJECTED : Status.ALLOWED;ObjectInputStream in = new ObjectInputStream(fileIn).setObjectInputFilter(filter);//JDK 16的记录类序列化// 记录类默认可序列化public record User(String name, int age) implements Serializable {}// 导入序列化相关类 import java.io.Serializable; import java.io.ObjectOutputStream; import java.io.ObjectInputStream; import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.IOException; /** * 示例类:实现Serializable接口以支持序列化 * JDK 1.1+ 支持基础序列化功能 */ public class SerializationExample implements Serializable { // 普通字段,默认支持序列化 private String name; // transient字段:不参与序列化(JDK 1.1+) private transient int sensitiveData; // 静态字段:不会被序列化(属于类级别) private static String staticField = "Class-Level Data"; /** * 构造函数 */ public SerializationExample(String name, int sensitiveData) { this.name = name; this.sensitiveData = sensitiveData; } /** * 序列化对象到文件 */ public void serialize(String filename) { try ( // 文件输出流(JDK 1.1+) FileOutputStream fileOut = new FileOutputStream(filename); // 对象输出流(JDK 1.1+) ObjectOutputStream out = new ObjectOutputStream(fileOut) ) { out.writeObject(this); // 将当前对象写入流 } catch (IOException e) { e.printStackTrace(); } } /** * 从文件反序列化对象 */ public static SerializationExample deserialize(String filename) { try ( // 文件输入流(JDK 1.1+) FileInputStream fileIn = new FileInputStream(filename); // 对象输入流(JDK 1.1+) ObjectInputStream in = new ObjectInputStream(fileIn) ) { // 强制类型转换(JDK 1.5+ 泛型可优化此处) return (SerializationExample) in.readObject(); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); return null; } } /** * 重写toString方法(JDK 1.0+) */ @Override public String toString() { return "Name: " + name + ", SensitiveData: " + sensitiveData; } /** * 主方法测试序列化与反序列化 */ public static void main(String[] args) { // 创建对象 SerializationExample obj = new SerializationExample("Test", 12345); // 序列化到文件 obj.serialize("example.ser"); // 反序列化后输出 SerializationExample restored = deserialize("example.ser"); System.out.println(restored); // 输出:Name: Test, SensitiveData: 0(transient字段丢失) } } //JDK 8的Lambda序列化 // Lambda表达式需满足函数式接口且捕获变量可序列化 Serializable lambda = (Serializable & Runnable) () -> System.out.println("Serializable Lambda"); //JDK 17的反序列化过滤器 // 设置反序列化过滤器(阻止特定类) ObjectInputFilter filter = info -> info.serialClass() == Dangerous.class ? Status.REJECTED : Status.ALLOWED; ObjectInputStream in = new ObjectInputStream(fileIn).setObjectInputFilter(filter); //JDK 16的记录类序列化 // 记录类默认可序列化 public record User(String name, int age) implements Serializable {}
25.网络编程
==============客户端实现===========import java.io.*;import java.net.*;import java.util.concurrent.*;/**** 支持实时通信的客户端实现* 启动命令: java ChatClient [主机] [端口]*/public class ChatClient {private static volatile boolean connected = true;public static void main(String[] args) {String host = args.length > 0 ? args[0] : "localhost";int port = parsePort(args);try (Socket socket = new Socket(host, port);DataInputStream in = new DataInputStream(socket.getInputStream());DataOutputStream out = new DataOutputStream(socket.getOutputStream())) {System.out.printf("""🟢 连接成功▶ 服务器地址: %s▶ 输入消息回车发送▶ 输入 exit 退出%n""", socket.getRemoteSocketAddress());// JDK 7 新特性:ForkJoinPool 实现消息并行处理ForkJoinPool.commonPool().execute(() -> receiveMessages(in));sendMessages(out);} catch (ConnectException e) {System.err.println("🔴 连接被拒绝,请检查:");System.err.println("1. 服务端是否启动");System.err.println("2. 防火墙设置");System.err.println("3. 地址是否正确 (" + host + ":" + port + ")");} catch (IOException e) {System.err.println("⚠️ 通信异常: " + e.getMessage());}}private static int parsePort(String[] args) {try {return args.length > 1 ? Integer.parseInt(args[1]) : 8080;} catch (NumberFormatException e) {System.out.println("❗ 使用默认端口 8080");return 8080;}}private static void sendMessages(DataOutputStream out) {try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in))) {while (connected) {System.out.print("↘ 输入消息: ");String message = consoleReader.readLine();out.writeUTF(message);out.flush();if ("exit".equalsIgnoreCase(message)) {connected = false;System.out.println("⛔ 已断开连接");}}} catch (IOException e) {System.err.println("消息发送失败: " + e.getMessage());}}private static void receiveMessages(DataInputStream in) {try {while (connected) {String serverMsg = in.readUTF();System.out.printf("\n[服务器消息] << %s%n↘ 输入消息: ", serverMsg);}} catch (EOFException e) {System.err.println("\n⛔ 连接被服务器关闭");} catch (IOException e) {if (connected) {System.err.println("\n⚠️ 接收消息异常: " + e.getMessage());}}}}========================服务端===========import java.io.*;import java.net.*;import java.util.concurrent.*;/**** 支持实时通信的服务端实现* 启动命令: java ChatServer [端口]*/public class ChatServer {private static final int MAX_CLIENTS = 100;private static final ExecutorService threadPool = Executors.newFixedThreadPool(MAX_CLIENTS);public static void main(String[] args) {int port = parsePort(args);try (ServerSocket serverSocket = new ServerSocket(port)) {System.out.printf("""🚀 服务端已启动▶ 监听端口: %d▶ 等待客户端连接...%n""", port);while (true) {Socket clientSocket = serverSocket.accept();System.out.printf("✅ 新客户端接入: %s%n",clientSocket.getRemoteSocketAddress());// 为每个客户端创建独立会话threadPool.execute(new ClientHandler(clientSocket));}} catch (IOException e) {System.err.println("⚠️ 服务端异常: " + e.getMessage());}}private static int parsePort(String[] args) {try {return args.length > 0 ? Integer.parseInt(args[0]) : 8080;} catch (NumberFormatException e) {System.out.println("❗ 使用默认端口 8080");return 8080;}}/**** JDK 5 新特性:通过实现Runnable处理并发连接*/private static class ClientHandler implements Runnable {private final Socket socket;private boolean running = true;ClientHandler(Socket socket) {this.socket = socket;}@Overridepublic void run() {try (DataInputStream in = new DataInputStream(socket.getInputStream());DataOutputStream out = new DataOutputStream(socket.getOutputStream())) {// JDK 8 新特性:CompletableFuture 实现双工通信CompletableFuture.runAsync(() -> handleOutput(out));handleInput(in);} catch (IOException e) {System.err.println("客户端连接异常: " + e.getMessage());} finally {closeResources();}}private void handleInput(DataInputStream in) throws IOException {while (running) {String message = in.readUTF();if ("exit".equalsIgnoreCase(message)) {System.out.printf("⛔ 客户端 %s 断开连接%n",socket.getRemoteSocketAddress());break;}System.out.printf("[客户端消息] %s >> %s%n",socket.getRemoteSocketAddress(), message);}}private void handleOutput(DataOutputStream out) {try (BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in))) {while (running) {System.out.print("↘ 输入服务端消息: ");String serverMsg = consoleReader.readLine();out.writeUTF(serverMsg);out.flush();}} catch (IOException e) {System.err.println("服务端消息发送失败: " + e.getMessage());}}private void closeResources() {try {running = false;if (!socket.isClosed()) socket.close();} catch (IOException e) {System.err.println("资源关闭异常: " + e.getMessage());}}}}==============客户端实现=========== import java.io.*; import java.net.*; import java.util.concurrent.*; /*** * 支持实时通信的客户端实现 * 启动命令: java ChatClient [主机] [端口] */ public class ChatClient { private static volatile boolean connected = true; public static void main(String[] args) { String host = args.length > 0 ? args[0] : "localhost"; int port = parsePort(args); try (Socket socket = new Socket(host, port); DataInputStream in = new DataInputStream(socket.getInputStream()); DataOutputStream out = new DataOutputStream(socket.getOutputStream())) { System.out.printf(""" 🟢 连接成功 ▶ 服务器地址: %s ▶ 输入消息回车发送 ▶ 输入 exit 退出 %n""", socket.getRemoteSocketAddress()); // JDK 7 新特性:ForkJoinPool 实现消息并行处理 ForkJoinPool.commonPool().execute(() -> receiveMessages(in)); sendMessages(out); } catch (ConnectException e) { System.err.println("🔴 连接被拒绝,请检查:"); System.err.println("1. 服务端是否启动"); System.err.println("2. 防火墙设置"); System.err.println("3. 地址是否正确 (" + host + ":" + port + ")"); } catch (IOException e) { System.err.println("⚠️ 通信异常: " + e.getMessage()); } } private static int parsePort(String[] args) { try { return args.length > 1 ? Integer.parseInt(args[1]) : 8080; } catch (NumberFormatException e) { System.out.println("❗ 使用默认端口 8080"); return 8080; } } private static void sendMessages(DataOutputStream out) { try (BufferedReader consoleReader = new BufferedReader( new InputStreamReader(System.in))) { while (connected) { System.out.print("↘ 输入消息: "); String message = consoleReader.readLine(); out.writeUTF(message); out.flush(); if ("exit".equalsIgnoreCase(message)) { connected = false; System.out.println("⛔ 已断开连接"); } } } catch (IOException e) { System.err.println("消息发送失败: " + e.getMessage()); } } private static void receiveMessages(DataInputStream in) { try { while (connected) { String serverMsg = in.readUTF(); System.out.printf("\n[服务器消息] << %s%n↘ 输入消息: ", serverMsg); } } catch (EOFException e) { System.err.println("\n⛔ 连接被服务器关闭"); } catch (IOException e) { if (connected) { System.err.println("\n⚠️ 接收消息异常: " + e.getMessage()); } } } } ========================服务端=========== import java.io.*; import java.net.*; import java.util.concurrent.*; /*** * 支持实时通信的服务端实现 * 启动命令: java ChatServer [端口] */ public class ChatServer { private static final int MAX_CLIENTS = 100; private static final ExecutorService threadPool = Executors.newFixedThreadPool(MAX_CLIENTS); public static void main(String[] args) { int port = parsePort(args); try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.printf(""" 🚀 服务端已启动 ▶ 监听端口: %d ▶ 等待客户端连接... %n""", port); while (true) { Socket clientSocket = serverSocket.accept(); System.out.printf("✅ 新客户端接入: %s%n", clientSocket.getRemoteSocketAddress()); // 为每个客户端创建独立会话 threadPool.execute(new ClientHandler(clientSocket)); } } catch (IOException e) { System.err.println("⚠️ 服务端异常: " + e.getMessage()); } } private static int parsePort(String[] args) { try { return args.length > 0 ? Integer.parseInt(args[0]) : 8080; } catch (NumberFormatException e) { System.out.println("❗ 使用默认端口 8080"); return 8080; } } /*** * JDK 5 新特性:通过实现Runnable处理并发连接 */ private static class ClientHandler implements Runnable { private final Socket socket; private boolean running = true; ClientHandler(Socket socket) { this.socket = socket; } @Override public void run() { try (DataInputStream in = new DataInputStream(socket.getInputStream()); DataOutputStream out = new DataOutputStream(socket.getOutputStream())) { // JDK 8 新特性:CompletableFuture 实现双工通信 CompletableFuture.runAsync(() -> handleOutput(out)); handleInput(in); } catch (IOException e) { System.err.println("客户端连接异常: " + e.getMessage()); } finally { closeResources(); } } private void handleInput(DataInputStream in) throws IOException { while (running) { String message = in.readUTF(); if ("exit".equalsIgnoreCase(message)) { System.out.printf("⛔ 客户端 %s 断开连接%n", socket.getRemoteSocketAddress()); break; } System.out.printf("[客户端消息] %s >> %s%n", socket.getRemoteSocketAddress(), message); } } private void handleOutput(DataOutputStream out) { try (BufferedReader consoleReader = new BufferedReader( new InputStreamReader(System.in))) { while (running) { System.out.print("↘ 输入服务端消息: "); String serverMsg = consoleReader.readLine(); out.writeUTF(serverMsg); out.flush(); } } catch (IOException e) { System.err.println("服务端消息发送失败: " + e.getMessage()); } } private void closeResources() { try { running = false; if (!socket.isClosed()) socket.close(); } catch (IOException e) { System.err.println("资源关闭异常: " + e.getMessage()); } } } }
26.发送邮件
import javax.activation.DataHandler;import javax.activation.FileDataSource;import javax.mail.*;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeBodyPart;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMultipart;import java.util.Properties;import com.sun.mail.util.MailSSLSocketFactory;import java.security.GeneralSecurityException;/*** 邮件发送工具类* 功能:支持文本邮件、HTML邮件、带附件邮件发送* 支持SMTP服务器认证和SSL加密(适用于QQ邮箱等需要SSL的服务器)* 依赖:mail.jar 和 activation.jar(需添加到项目构建路径)*/public class EmailSender {// 邮件会话对象private Session session;// 发件人邮箱private String from;/*** 构造方法* @param smtpHost SMTP服务器地址 如"smtp.qq.com"* @param from 发件邮箱地址* @param authCode 授权码/密码(QQ邮箱使用授权码)* @param sslEnabled 是否启用SSL加密*/public EmailSender(String smtpHost, String from, String authCode, boolean sslEnabled)throws GeneralSecurityException {this.from = from;Properties props = new Properties();// 基础配置props.setProperty("mail.smtp.host", smtpHost);props.put("mail.smtp.auth", "true"); // 启用认证// SSL加密配置if (sslEnabled) {MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);props.put("mail.smtp.ssl.enable", "true");props.put("mail.smtp.ssl.socketFactory", sf);props.setProperty("mail.smtp.port", "465"); // QQ邮箱SSL端口}// 创建认证器Authenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(from, authCode);}};// 创建邮件会话this.session = Session.getInstance(props, authenticator);session.setDebug(true); // 启用调试模式(生产环境建议关闭)}/*** 发送文本邮件* @param to 收件人地址* @param subject 邮件主题* @param content 文本内容*/public void sendTextEmail(String to, String subject, String content)throws MessagingException {MimeMessage message = new MimeMessage(session);configureBaseMessage(message, to, subject);message.setText(content); // 设置纯文本内容Transport.send(message);}/*** 发送HTML邮件* @param to 收件人地址* @param subject 邮件主题* @param htmlContent HTML内容*/public void sendHtmlEmail(String to, String subject, String htmlContent)throws MessagingException {MimeMessage message = new MimeMessage(session);configureBaseMessage(message, to, subject);message.setContent(htmlContent, "text/html;charset=utf-8"); // 设置HTML内容Transport.send(message);}/*** 发送带附件的邮件* @param to 收件人地址* @param subject 邮件主题* @param textContent 正文内容* @param filePath 附件文件路径*/public void sendAttachmentEmail(String to, String subject, String textContent, String filePath)throws MessagingException {MimeMessage message = new MimeMessage(session);configureBaseMessage(message, to, subject);// 创建多重消息容器MimeMultipart multipart = new MimeMultipart();// 添加文本内容MimeBodyPart textPart = new MimeBodyPart();textPart.setText(textContent);multipart.addBodyPart(textPart);// 添加附件MimeBodyPart attachmentPart = new MimeBodyPart();FileDataSource source = new FileDataSource(filePath);attachmentPart.setDataHandler(new DataHandler(source));attachmentPart.setFileName(source.getName());multipart.addBodyPart(attachmentPart);// 设置完整消息message.setContent(multipart);Transport.send(message);}/*** 配置基础邮件信息(发件人、收件人、主题)*/private void configureBaseMessage(MimeMessage message, String to, String subject)throws MessagingException {message.setFrom(new InternetAddress(this.from));message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));message.setSubject(subject);}}import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util.Properties; import com.sun.mail.util.MailSSLSocketFactory; import java.security.GeneralSecurityException; /** * 邮件发送工具类 * 功能:支持文本邮件、HTML邮件、带附件邮件发送 * 支持SMTP服务器认证和SSL加密(适用于QQ邮箱等需要SSL的服务器) * 依赖:mail.jar 和 activation.jar(需添加到项目构建路径) */ public class EmailSender { // 邮件会话对象 private Session session; // 发件人邮箱 private String from; /** * 构造方法 * @param smtpHost SMTP服务器地址 如"smtp.qq.com" * @param from 发件邮箱地址 * @param authCode 授权码/密码(QQ邮箱使用授权码) * @param sslEnabled 是否启用SSL加密 */ public EmailSender(String smtpHost, String from, String authCode, boolean sslEnabled) throws GeneralSecurityException { this.from = from; Properties props = new Properties(); // 基础配置 props.setProperty("mail.smtp.host", smtpHost); props.put("mail.smtp.auth", "true"); // 启用认证 // SSL加密配置 if (sslEnabled) { MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); props.put("mail.smtp.ssl.enable", "true"); props.put("mail.smtp.ssl.socketFactory", sf); props.setProperty("mail.smtp.port", "465"); // QQ邮箱SSL端口 } // 创建认证器 Authenticator authenticator = new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(from, authCode); } }; // 创建邮件会话 this.session = Session.getInstance(props, authenticator); session.setDebug(true); // 启用调试模式(生产环境建议关闭) } /** * 发送文本邮件 * @param to 收件人地址 * @param subject 邮件主题 * @param content 文本内容 */ public void sendTextEmail(String to, String subject, String content) throws MessagingException { MimeMessage message = new MimeMessage(session); configureBaseMessage(message, to, subject); message.setText(content); // 设置纯文本内容 Transport.send(message); } /** * 发送HTML邮件 * @param to 收件人地址 * @param subject 邮件主题 * @param htmlContent HTML内容 */ public void sendHtmlEmail(String to, String subject, String htmlContent) throws MessagingException { MimeMessage message = new MimeMessage(session); configureBaseMessage(message, to, subject); message.setContent(htmlContent, "text/html;charset=utf-8"); // 设置HTML内容 Transport.send(message); } /** * 发送带附件的邮件 * @param to 收件人地址 * @param subject 邮件主题 * @param textContent 正文内容 * @param filePath 附件文件路径 */ public void sendAttachmentEmail(String to, String subject, String textContent, String filePath) throws MessagingException { MimeMessage message = new MimeMessage(session); configureBaseMessage(message, to, subject); // 创建多重消息容器 MimeMultipart multipart = new MimeMultipart(); // 添加文本内容 MimeBodyPart textPart = new MimeBodyPart(); textPart.setText(textContent); multipart.addBodyPart(textPart); // 添加附件 MimeBodyPart attachmentPart = new MimeBodyPart(); FileDataSource source = new FileDataSource(filePath); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(source.getName()); multipart.addBodyPart(attachmentPart); // 设置完整消息 message.setContent(multipart); Transport.send(message); } /** * 配置基础邮件信息(发件人、收件人、主题) */ private void configureBaseMessage(MimeMessage message, String to, String subject) throws MessagingException { message.setFrom(new InternetAddress(this.from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject(subject); } }
27.多线程编程
/**** Java多线程编程综合演示类* 本类演示了三种创建线程的方式及常用线程方法的使用*/public class MultiThreadingDemo {/**** 一、通过实现Runnable接口创建线程(推荐方式)* 优点:* 1. 避免Java单继承的限制* 2. 便于多个线程共享资源* 3. 符合面向接口编程原则*/static class RunnableExample implements Runnable {private final String threadName;public RunnableExample(String name) {this.threadName = name;System.out.println("创建Runnable线程: " + threadName);}@Overridepublic void run() {System.out.println("运行中: " + threadName);try {for (int i = 3; i > 0; i--) {System.out.println(threadName + " 倒计时: " + i);Thread.sleep(500); // 阻塞状态示例}} catch (InterruptedException e) {System.out.println(threadName + " 被中断");}System.out.println(threadName + " 退出");}}/**** 二、通过继承Thread类创建线程* 注意:* 1. Java不支持多继承,因此限制了扩展能力* 2. 直接调用run()只是普通方法,必须通过start()启动线程*/static class ThreadSubclassExample extends Thread {public ThreadSubclassExample(String name) {super(name);System.out.println("创建Thread子类线程: " + getName());}@Overridepublic void run() {System.out.println("运行中: " + getName());try {for (int i = 3; i > 0; i--) {System.out.println(getName() + " 倒计时: " + i);Thread.sleep(500);}} catch (InterruptedException e) {System.out.println(getName() + " 被中断");}System.out.println(getName() + " 退出");}}/**** 三、通过Callable和Future创建线程(可获取返回值)* 特点:* 1. 可以返回执行结果* 2. 可以抛出异常* 3. 配合线程池使用更高效*/static class CallableExample implements java.util.concurrent.Callable<Integer> {private final String taskName;public CallableExample(String name) {this.taskName = name;}@Overridepublic Integer call() throws Exception {System.out.println(taskName + " 开始执行");int sum = 0;for (int i = 1; i <= 3; i++) {sum += i;System.out.println(taskName + " 计算中: " + i);Thread.sleep(500);}return sum;}}/**** 主方法 - 线程调度演示*/public static void main(String[] args) {// 演示线程优先级(1-10,默认5)final int MIN_PRIORITY = Thread.MIN_PRIORITY; // 1final int NORM_PRIORITY = Thread.NORM_PRIORITY;// 5final int MAX_PRIORITY = Thread.MAX_PRIORITY; // 10// 1. 使用Runnable方式创建线程Runnable runnableDemo = new RunnableExample("Runnable线程-1");Thread thread1 = new Thread(runnableDemo);thread1.setPriority(MAX_PRIORITY); // 设置最高优先级// 2. 使用Thread子类方式创建线程ThreadSubclassExample thread2 = new ThreadSubclassExample("Thread子类-2");thread2.setPriority(MIN_PRIORITY); // 设置最低优先级// 3. 使用Callable方式创建线程java.util.concurrent.FutureTask<Integer> futureTask =new java.util.concurrent.FutureTask<>(new CallableExample("Callable任务"));Thread thread3 = new Thread(futureTask);// 启动所有线程thread1.start();thread2.start();thread3.start();try {// 等待thread3执行完成thread3.join(2000); // 最多等待2秒if (futureTask.isDone()) {System.out.println("\nCallable任务结果: " + futureTask.get());}// 中断演示thread1.interrupt();// 判断线程状态System.out.println("\n线程状态:");System.out.println("thread1 存活状态: " + thread1.isAlive());System.out.println("thread2 存活状态: " + thread2.isAlive());System.out.println("thread3 存活状态: " + thread3.isAlive());} catch (Exception e) {e.printStackTrace();}// 守护线程示例(当所有非守护线程结束时自动终止)Thread daemonThread = new Thread(() -> {while (true) {System.out.println("守护线程运行中...");try {Thread.sleep(1000);} catch (InterruptedException e) {break;}}});daemonThread.setDaemon(true);daemonThread.start();}/**** 线程生命周期说明:* 1. 新建状态(New):线程对象被创建* 2. 就绪状态(Runnable):调用start()后进入就绪队列* 3. 运行状态(Running):获得CPU时间片开始执行run()* 4. 阻塞状态(Blocked):遇到sleep()/wait()/同步锁等情况* 5. 终止状态(Terminated):run()执行结束或发生异常** 重要方法说明:* - start(): 启动线程进入就绪状态* - sleep(): 使线程暂停指定时间(不释放锁)* - join(): 等待目标线程终止* - yield(): 让出当前CPU时间片* - interrupt(): 中断线程* - setDaemon(): 设置为守护线程*/}/*** * Java多线程编程综合演示类 * 本类演示了三种创建线程的方式及常用线程方法的使用 */ public class MultiThreadingDemo { /*** * 一、通过实现Runnable接口创建线程(推荐方式) * 优点: * 1. 避免Java单继承的限制 * 2. 便于多个线程共享资源 * 3. 符合面向接口编程原则 */ static class RunnableExample implements Runnable { private final String threadName; public RunnableExample(String name) { this.threadName = name; System.out.println("创建Runnable线程: " + threadName); } @Override public void run() { System.out.println("运行中: " + threadName); try { for (int i = 3; i > 0; i--) { System.out.println(threadName + " 倒计时: " + i); Thread.sleep(500); // 阻塞状态示例 } } catch (InterruptedException e) { System.out.println(threadName + " 被中断"); } System.out.println(threadName + " 退出"); } } /*** * 二、通过继承Thread类创建线程 * 注意: * 1. Java不支持多继承,因此限制了扩展能力 * 2. 直接调用run()只是普通方法,必须通过start()启动线程 */ static class ThreadSubclassExample extends Thread { public ThreadSubclassExample(String name) { super(name); System.out.println("创建Thread子类线程: " + getName()); } @Override public void run() { System.out.println("运行中: " + getName()); try { for (int i = 3; i > 0; i--) { System.out.println(getName() + " 倒计时: " + i); Thread.sleep(500); } } catch (InterruptedException e) { System.out.println(getName() + " 被中断"); } System.out.println(getName() + " 退出"); } } /*** * 三、通过Callable和Future创建线程(可获取返回值) * 特点: * 1. 可以返回执行结果 * 2. 可以抛出异常 * 3. 配合线程池使用更高效 */ static class CallableExample implements java.util.concurrent.Callable<Integer> { private final String taskName; public CallableExample(String name) { this.taskName = name; } @Override public Integer call() throws Exception { System.out.println(taskName + " 开始执行"); int sum = 0; for (int i = 1; i <= 3; i++) { sum += i; System.out.println(taskName + " 计算中: " + i); Thread.sleep(500); } return sum; } } /*** * 主方法 - 线程调度演示 */ public static void main(String[] args) { // 演示线程优先级(1-10,默认5) final int MIN_PRIORITY = Thread.MIN_PRIORITY; // 1 final int NORM_PRIORITY = Thread.NORM_PRIORITY;// 5 final int MAX_PRIORITY = Thread.MAX_PRIORITY; // 10 // 1. 使用Runnable方式创建线程 Runnable runnableDemo = new RunnableExample("Runnable线程-1"); Thread thread1 = new Thread(runnableDemo); thread1.setPriority(MAX_PRIORITY); // 设置最高优先级 // 2. 使用Thread子类方式创建线程 ThreadSubclassExample thread2 = new ThreadSubclassExample("Thread子类-2"); thread2.setPriority(MIN_PRIORITY); // 设置最低优先级 // 3. 使用Callable方式创建线程 java.util.concurrent.FutureTask<Integer> futureTask = new java.util.concurrent.FutureTask<>(new CallableExample("Callable任务")); Thread thread3 = new Thread(futureTask); // 启动所有线程 thread1.start(); thread2.start(); thread3.start(); try { // 等待thread3执行完成 thread3.join(2000); // 最多等待2秒 if (futureTask.isDone()) { System.out.println("\nCallable任务结果: " + futureTask.get()); } // 中断演示 thread1.interrupt(); // 判断线程状态 System.out.println("\n线程状态:"); System.out.println("thread1 存活状态: " + thread1.isAlive()); System.out.println("thread2 存活状态: " + thread2.isAlive()); System.out.println("thread3 存活状态: " + thread3.isAlive()); } catch (Exception e) { e.printStackTrace(); } // 守护线程示例(当所有非守护线程结束时自动终止) Thread daemonThread = new Thread(() -> { while (true) { System.out.println("守护线程运行中..."); try { Thread.sleep(1000); } catch (InterruptedException e) { break; } } }); daemonThread.setDaemon(true); daemonThread.start(); } /*** * 线程生命周期说明: * 1. 新建状态(New):线程对象被创建 * 2. 就绪状态(Runnable):调用start()后进入就绪队列 * 3. 运行状态(Running):获得CPU时间片开始执行run() * 4. 阻塞状态(Blocked):遇到sleep()/wait()/同步锁等情况 * 5. 终止状态(Terminated):run()执行结束或发生异常 * * 重要方法说明: * - start(): 启动线程进入就绪状态 * - sleep(): 使线程暂停指定时间(不释放锁) * - join(): 等待目标线程终止 * - yield(): 让出当前CPU时间片 * - interrupt(): 中断线程 * - setDaemon(): 设置为守护线程 */ }
28.基础Applet程序
/** 示例:基础Applet程序 - HelloWorldApplet* 功能:在浏览器中显示"Hello World"文本,演示Applet基础结构*/// 导入必要的包import java.applet.Applet; // Applet基类import java.awt.Graphics; // 图形绘制类/**** HelloWorldApplet类继承自java.applet.Applet* 这是所有Applet程序的基类,提供生命周期管理和浏览器交互能力*/public class HelloWorldApplet extends Applet {/**** paint方法(重写自Container类)* 作用:执行图形界面绘制,当以下情况会自动调用:* 1. Applet首次加载* 2.浏览器窗口调整大小* 3.repaint()方法被调用时/** @param g 图形上下文对象,由浏览器自动创建并传递* 包含绘制区域、颜色、字体等图形状态信息*/@Overridepublic void paint(Graphics g) {/** 使用Graphics对象的drawString方法绘制文本* 参数说明:* 第1个参数:"Hello World" - 要显示的字符串* 第2个参数:25 - 文本基线起始X坐标(像素)* 第3个参数:50 - 文本基线起始Y坐标(像素)** 坐标系说明:* 原点(0,0)位于Applet显示区域的左上角* X轴向右延伸,Y轴向下延伸*/g.drawString("Hello World", 25, 50);}/** Applet生命周期方法说明(未在本示例中重写的方法):** 1. init():* - 首次加载时调用* - 用于初始化变量、加载资源、设置布局等* - 在param标签处理完成后执行** 2. start():* - init()之后自动调用* - 每次页面获得焦点时调用(如浏览器切换回页面)* - 启动动画、线程等需要持续运行的功能** 3. stop():* - 当页面失去焦点时调用(如切换浏览器标签)* - 暂停消耗资源的操作以节省系统资源** 4. destroy():* - 浏览器正常关闭时调用* - 释放系统资源、保存状态等收尾操作*/}/** 配套HTML文件示例(需与.class文件同目录):** <html>* <head>* <title>Hello World Applet Demo</title>* </head>* <body>* <hr>* <applet* code="HelloWorldApplet.class"* width="300"* height="100"* >* 您的浏览器不支持Java Applet,请使用支持Java的浏览器查看* </applet>* <hr>* </body>* </html>** HTML参数说明:* code - 指定主类文件名(需包含.class扩展名)* width - Applet显示区域宽度(像素)* height - Applet显示区域高度(像素)*//* * 示例:基础Applet程序 - HelloWorldApplet * 功能:在浏览器中显示"Hello World"文本,演示Applet基础结构 */ // 导入必要的包 import java.applet.Applet; // Applet基类 import java.awt.Graphics; // 图形绘制类 /*** * HelloWorldApplet类继承自java.applet.Applet * 这是所有Applet程序的基类,提供生命周期管理和浏览器交互能力 */ public class HelloWorldApplet extends Applet { /*** * paint方法(重写自Container类) * 作用:执行图形界面绘制,当以下情况会自动调用: * 1. Applet首次加载 * 2.浏览器窗口调整大小 * 3.repaint()方法被调用时 /* * @param g 图形上下文对象,由浏览器自动创建并传递 * 包含绘制区域、颜色、字体等图形状态信息 */ @Override public void paint(Graphics g) { /* * 使用Graphics对象的drawString方法绘制文本 * 参数说明: * 第1个参数:"Hello World" - 要显示的字符串 * 第2个参数:25 - 文本基线起始X坐标(像素) * 第3个参数:50 - 文本基线起始Y坐标(像素) * * 坐标系说明: * 原点(0,0)位于Applet显示区域的左上角 * X轴向右延伸,Y轴向下延伸 */ g.drawString("Hello World", 25, 50); } /* * Applet生命周期方法说明(未在本示例中重写的方法): * * 1. init(): * - 首次加载时调用 * - 用于初始化变量、加载资源、设置布局等 * - 在param标签处理完成后执行 * * 2. start(): * - init()之后自动调用 * - 每次页面获得焦点时调用(如浏览器切换回页面) * - 启动动画、线程等需要持续运行的功能 * * 3. stop(): * - 当页面失去焦点时调用(如切换浏览器标签) * - 暂停消耗资源的操作以节省系统资源 * * 4. destroy(): * - 浏览器正常关闭时调用 * - 释放系统资源、保存状态等收尾操作 */ } /* * 配套HTML文件示例(需与.class文件同目录): * * <html> * <head> * <title>Hello World Applet Demo</title> * </head> * <body> * <hr> * <applet * code="HelloWorldApplet.class" * width="300" * height="100" * > * 您的浏览器不支持Java Applet,请使用支持Java的浏览器查看 * </applet> * <hr> * </body> * </html> * * HTML参数说明: * code - 指定主类文件名(需包含.class扩展名) * width - Applet显示区域宽度(像素) * height - Applet显示区域高度(像素) */
29.注释
/*** <p>项目名称: JavaDocDemo</p>* <p>文件名称: Student.java</p>* <p>描述: [学生信息模型类,用于管理学生基本数据和操作]</p>* <p>创建时间: 2023-10-10</p>* <p>公司信息: XXX公司 技术部</p>* @author <a href="mailto:author@example.com">张三</a>* @version v1.0* @update [1][2023-10-11][李四][新增年龄验证逻辑]*/public class Student {// 类实现...}/** 学生姓名 */private String name;/** 学生年龄(需大于0) */private int age;/*** @Title: Student* @Description: [构造方法,初始化学生姓名和年龄]* @Param: name 学生姓名* @Param: age 学生年龄* @exception IllegalArgumentException 当年龄小于0时抛出* @author <a href="mailto:author@example.com">张三</a>* @CreateDate: 2023-10-10 14:30:00*/public Student(String name, int age) {if (age < 0) throw new IllegalArgumentException("年龄无效");this.name = name;this.age = age;}/*** @Title: getAge* @Description: [获取学生年龄]* @Return: int 学生年龄* @author <a href="mailto:author@example.com">张三</a>* @CreateDate: 2023-10-10 14:30:00*/public int getAge() {return age;}/*** @Title: setAge* @Description: [设置学生年龄,年龄必须大于0]* @Param: age 学生年龄* @exception IllegalArgumentException 当年龄小于0时抛出* @author <a href="mailto:author@example.com">张三</a>* @CreateDate: 2023-10-10 14:30:00* @update [1][2023-10-11][李四][新增年龄验证逻辑]*/public void setAge(int age) {if (age < 0) throw new IllegalArgumentException("年龄无效");this.age = age;}/** * <p>项目名称: JavaDocDemo</p> * <p>文件名称: Student.java</p> * <p>描述: [学生信息模型类,用于管理学生基本数据和操作]</p> * <p>创建时间: 2023-10-10</p> * <p>公司信息: XXX公司 技术部</p> * @author <a href="mailto:author@example.com">张三</a> * @version v1.0 * @update [1][2023-10-11][李四][新增年龄验证逻辑] */ public class Student { // 类实现... } /** 学生姓名 */ private String name; /** 学生年龄(需大于0) */ private int age; /** * @Title: Student * @Description: [构造方法,初始化学生姓名和年龄] * @Param: name 学生姓名 * @Param: age 学生年龄 * @exception IllegalArgumentException 当年龄小于0时抛出 * @author <a href="mailto:author@example.com">张三</a> * @CreateDate: 2023-10-10 14:30:00 */ public Student(String name, int age) { if (age < 0) throw new IllegalArgumentException("年龄无效"); this.name = name; this.age = age; } /** * @Title: getAge * @Description: [获取学生年龄] * @Return: int 学生年龄 * @author <a href="mailto:author@example.com">张三</a> * @CreateDate: 2023-10-10 14:30:00 */ public int getAge() { return age; } /** * @Title: setAge * @Description: [设置学生年龄,年龄必须大于0] * @Param: age 学生年龄 * @exception IllegalArgumentException 当年龄小于0时抛出 * @author <a href="mailto:author@example.com">张三</a> * @CreateDate: 2023-10-10 14:30:00 * @update [1][2023-10-11][李四][新增年龄验证逻辑] */ public void setAge(int age) { if (age < 0) throw new IllegalArgumentException("年龄无效"); this.age = age; }
30.MySQL 连接工具类实现
package com.example.dbutils;import java.sql.*;/*** MySQL数据库连接工具类* 功能说明:* 1. 封装MySQL数据库连接、查询、资源释放等操作* 2. 支持MySQL 8.0+版本的特殊配置* 3. 提供基本查询执行和结果处理功能*/public class MySQLConnector {// 数据库连接参数配置private static final String DEFAULT_DRIVER = "com.mysql.cj.jdbc.Driver"; // MySQL 8.0+驱动类private final String jdbcUrl; // 数据库连接URLprivate final String username; // 数据库用户名private final String password; // 数据库密码private Connection connection; // 数据库连接对象private Statement statement; // SQL执行对象private ResultSet resultSet; // 结果集对象/*** 构造方法* @param jdbcUrl 数据库连接URL,格式示例:* jdbc:mysql://localhost:3306/dbname?useSSL=false&serverTimezone=UTC* @param username 数据库用户名* @param password 数据库密码*/public MySQLConnector(String jdbcUrl, String username, String password) {this.jdbcUrl = jdbcUrl;this.username = username;this.password = password;}/*** 初始化数据库连接* @throws ClassNotFoundException 驱动类未找到异常* @throws SQLException 数据库连接失败异常*/public void connect() throws ClassNotFoundException, SQLException {// 1. 加载JDBC驱动(MySQL 8.0+需要显式指定)Class.forName(DEFAULT_DRIVER);// 2. 建立数据库连接System.out.println("正在连接数据库...");connection = DriverManager.getConnection(jdbcUrl, username, password);// 3. 创建Statement对象(后续执行SQL使用)statement = connection.createStatement();}/*** 执行查询SQL语句* @param sql 需要执行的SELECT语句* @return ResultSet 查询结果集* @throws SQLException SQL执行异常*/public ResultSet executeQuery(String sql) throws SQLException {if (statement == null) {throw new SQLException("Statement未初始化,请先调用connect()方法");}System.out.println("正在执行查询: " + sql);resultSet = statement.executeQuery(sql);return resultSet;}/*** 打印查询结果(示例方法)* @throws SQLException 结果集处理异常*/public void printResults() throws SQLException {if (resultSet == null) {System.out.println("没有可用的结果集");return;}// 获取结果集元数据(用于获取列信息)ResultSetMetaData metaData = resultSet.getMetaData();int columnCount = metaData.getColumnCount();// 遍历结果集while (resultSet.next()) {for (int i = 1; i <= columnCount; i++) {String columnName = metaData.getColumnName(i);Object value = resultSet.getObject(i);System.out.printf("%s: %s\t", columnName, value);}System.out.println();}}/*** 关闭数据库资源*/public void close() {try {if (resultSet != null) resultSet.close();if (statement != null) statement.close();if (connection != null) connection.close();System.out.println("数据库连接已关闭");} catch (SQLException e) {System.err.println("关闭连接时发生错误:");e.printStackTrace();}}/*** 使用示例*/public static void main(String[] args) {// 配置连接参数(根据实际环境修改)String url = "jdbc:mysql://localhost:3306/RUNOOB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";String user = "root";String pass = "123456";MySQLConnector dbConnector = new MySQLConnector(url, user, pass);try {// 1. 建立连接dbConnector.connect();// 2. 执行查询String query = "SELECT id, name, url FROM websites";dbConnector.executeQuery(query);// 3. 处理结果(这里演示打印结果)System.out.println("查询结果:");dbConnector.printResults();} catch (ClassNotFoundException e) {System.err.println("JDBC驱动加载失败,请检查驱动包是否存在");e.printStackTrace();} catch (SQLException e) {System.err.println("数据库操作异常:");e.printStackTrace();} finally {// 4. 确保关闭连接dbConnector.close();}}}package com.example.dbutils; import java.sql.*; /** * MySQL数据库连接工具类 * 功能说明: * 1. 封装MySQL数据库连接、查询、资源释放等操作 * 2. 支持MySQL 8.0+版本的特殊配置 * 3. 提供基本查询执行和结果处理功能 */ public class MySQLConnector { // 数据库连接参数配置 private static final String DEFAULT_DRIVER = "com.mysql.cj.jdbc.Driver"; // MySQL 8.0+驱动类 private final String jdbcUrl; // 数据库连接URL private final String username; // 数据库用户名 private final String password; // 数据库密码 private Connection connection; // 数据库连接对象 private Statement statement; // SQL执行对象 private ResultSet resultSet; // 结果集对象 /** * 构造方法 * @param jdbcUrl 数据库连接URL,格式示例: * jdbc:mysql://localhost:3306/dbname?useSSL=false&serverTimezone=UTC * @param username 数据库用户名 * @param password 数据库密码 */ public MySQLConnector(String jdbcUrl, String username, String password) { this.jdbcUrl = jdbcUrl; this.username = username; this.password = password; } /** * 初始化数据库连接 * @throws ClassNotFoundException 驱动类未找到异常 * @throws SQLException 数据库连接失败异常 */ public void connect() throws ClassNotFoundException, SQLException { // 1. 加载JDBC驱动(MySQL 8.0+需要显式指定) Class.forName(DEFAULT_DRIVER); // 2. 建立数据库连接 System.out.println("正在连接数据库..."); connection = DriverManager.getConnection(jdbcUrl, username, password); // 3. 创建Statement对象(后续执行SQL使用) statement = connection.createStatement(); } /** * 执行查询SQL语句 * @param sql 需要执行的SELECT语句 * @return ResultSet 查询结果集 * @throws SQLException SQL执行异常 */ public ResultSet executeQuery(String sql) throws SQLException { if (statement == null) { throw new SQLException("Statement未初始化,请先调用connect()方法"); } System.out.println("正在执行查询: " + sql); resultSet = statement.executeQuery(sql); return resultSet; } /** * 打印查询结果(示例方法) * @throws SQLException 结果集处理异常 */ public void printResults() throws SQLException { if (resultSet == null) { System.out.println("没有可用的结果集"); return; } // 获取结果集元数据(用于获取列信息) ResultSetMetaData metaData = resultSet.getMetaData(); int columnCount = metaData.getColumnCount(); // 遍历结果集 while (resultSet.next()) { for (int i = 1; i <= columnCount; i++) { String columnName = metaData.getColumnName(i); Object value = resultSet.getObject(i); System.out.printf("%s: %s\t", columnName, value); } System.out.println(); } } /** * 关闭数据库资源 */ public void close() { try { if (resultSet != null) resultSet.close(); if (statement != null) statement.close(); if (connection != null) connection.close(); System.out.println("数据库连接已关闭"); } catch (SQLException e) { System.err.println("关闭连接时发生错误:"); e.printStackTrace(); } } /** * 使用示例 */ public static void main(String[] args) { // 配置连接参数(根据实际环境修改) String url = "jdbc:mysql://localhost:3306/RUNOOB?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; String user = "root"; String pass = "123456"; MySQLConnector dbConnector = new MySQLConnector(url, user, pass); try { // 1. 建立连接 dbConnector.connect(); // 2. 执行查询 String query = "SELECT id, name, url FROM websites"; dbConnector.executeQuery(query); // 3. 处理结果(这里演示打印结果) System.out.println("查询结果:"); dbConnector.printResults(); } catch (ClassNotFoundException e) { System.err.println("JDBC驱动加载失败,请检查驱动包是否存在"); e.printStackTrace(); } catch (SQLException e) { System.err.println("数据库操作异常:"); e.printStackTrace(); } finally { // 4. 确保关闭连接 dbConnector.close(); } } }
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...