一、枚举
如果一个变量的取值只可能是固定的值,就可使用枚举类型
枚举由一组预定义的常量构成
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
枚举的高级用法
1. 枚举可以包含字段和方法
枚举可以像普通类一样定义字段、方法和构造函数。
public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6);
private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double getMass() { return mass; }
public double getRadius() { return radius; }
}
2. 枚举可以实现接口
枚举可以实现接口,使得枚举类型具备接口定义的行为。
public interface Greeting {
void greet();
}
public enum GreetingType implements Greeting {
HELLO {
@Override
public void greet() {
System.out.println("Hello!");
}
},
GOODBYE {
@Override
public void greet() {
System.out.println("Goodbye!");
}
};
}
3. 枚举可用于 switch 语句
枚举类型可以与 switch 语句结合使用,提供更清晰的逻辑分支。
Day day = Day.MONDAY;
switch (day) {
case MONDAY:
System.out.println("Start of the week");
break;
case FRIDAY:
System.out.println("End of the week");
break;
default:
System.out.println("Midweek");
}
枚举的常用方法
- values():返回枚举的所有常量数组。
- valueOf(String name):根据名称返回对应的枚举常量。
- ordinal():返回枚举常量的序号(从 0 开始)。
Day[] days = Day.values(); // [MONDAY, TUESDAY, …, SUNDAY]
Day monday = Day.valueOf("MONDAY"); // Day.MONDAY
int ordinal = Day.TUESDAY.ordinal(); // 1
枚举的使用注意
- 枚举的本质是类,所有枚举类型最终都隐式继承自java.lang.Enum
- 枚举定义完常量后,可以再定义成员变量、方法等内容(这时最后一个常量要以分号结束)
- 枚举的构造方法权限必须是无修饰符或者private
- Java 会主动调用构造方法初始化每一个常量,你不能主动调用构造方法
二、包装类
基本类型的缺陷
1、无法表示不存在的值(null值)
2、不能利用面向对象的方式去操作基本类型(比如直接用基本类型调用方法)
3、当方法参数是引用类型时,基本类型无法传递
解决方案:可以自己将基本类型包装成引用类型
public class IntObject{
public int value;
public IntObject(int value){
this.value = value;
}
}
IntObject[] data={new IntObject(-100),new InctObject(100),null,new IntObject(0)};
for (IntObject intObject:data){
if (intObject==null){
System.out.println("没有值");
}else{
System.out.println(intObject.value);
}
}
java中已经内置了基本类型的包装类(都在java.lang包中),其中数字类型的的包装类最终都来自java.lang.Number
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
自动装箱,拆箱
自动装箱:Java编译器会自动调用valueOf方法,将基本类型转换为包装类
自动拆箱:Java编译器会自动调用XxxValue 方法,将包装类转换为基本类型
基本类型数组 与 包装类数组 之间是不能自动装箱,拆箱的
Integer num = 10; // 自动装箱:int → Integer
int value = num; // 自动拆箱:Integer → int
包装类的判等
包装类的判等,不要使用==、!=运算符,应该使用equals方法
Integer i1=11;
Integer i2=11;
Integer i3=888;
Integer i4=888;
//不推荐
System.out.println(i1==i2);//true
System.out.println(i3==i4);//false,因为数据太大
//推荐
System.out.println(i1.equals(i2));//true
System.out.println(i3.equals(i4));//true
IntegerCache 类中缓存了[-128,127]范围的Integer 对象,Integer.valueOf方法会优先去IntegerCache缓存中获取Integer对象
三、Math
public static final double E=2.71;
public static final double PI=3.14;
Math.abs(-100)//求绝对值:100
Math.max(100,200)//求最大值:200
Math.min(100,200)//求最小值:100
Math.floor(3.9)//向下取整:3.0
Math.ceil(3.1)//向上取整:4.0
Math.round(3.5)//四舍五入:4
Math.pow(4,2)//4的2次方:16.0
Math.sqrt(16)//16的平方根:4.0
//角度转为弧度
double degree=90;
double radian=Math.toRadians(degree);
//三角函数
Math.sin(radian)
Math.cos(radian)
Math.tan(radian)
//随机数
Math.random()//生成[0.0,1.0)范围的随机数
四、Random
//输出4位的大写字母验证码
Random r = new Random();
for (int i=0;i<4;i++){
char c=(char) (r.nextInt(26)+'A');
System.out.print(c);
}
System.out.println();
function generateCaptcha(length = 6) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let captcha = '';
for (let i = 0; i < length; i++) {
captcha += chars.charAt(Math.floor(Math.random() * chars.length));
}
return captcha;
}
console.log(generateCaptcha());
五、UUID
UUID(Universally Unique Identifier)是一个128位的全局唯一标识符,通常以32位十六进制字符串表示,由5组连字符分隔(如 550e8400-e29b-41d4-a716-446655440000)。Java 中通过 java.util.UUID 类实现生成和操作。
生成 UUID
Java 提供两种生成 UUID 的方式:
随机生成(版本4)
UUID uuid = UUID.randomUUID();
System.out.println(uuid); // 示例输出: f47ac10b-58cc-4372-a567-0e02b2c3d479
基于名称和命名空间生成(版本3或5)
UUID namespace = UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8"); // DNS命名空间
UUID uuid = UUID.nameUUIDFromBytes("example.com".getBytes());
System.out.println(uuid); // 示例输出: 9073926b-929f-31c2-abc9-fad77ae3e8eb
常见应用场景
- 分布式系统唯一标识(如数据库主键)。
- 临时文件名或会话ID生成。
- 避免冲突的随机标识符需求。
六、数字格式化
可以使用System.out.printf 或者System.out.format输出格式化的字符串
可以使用String.format创建格式化的字符串
控制小数位数
使用DecimalFormat可以精确控制小数位数:
DecimalFormat df = new DecimalFormat("0.000");
df.format(3.14159); // 输出 "3.142"(自动四舍五入)
设置舍入模式:
df.setRoundingMode(RoundingMode.DOWN);
df.format(3.14159); // 输出 "3.141"
货币格式化
NumberFormat的货币实例:
NumberFormat cf = NumberFormat.getCurrencyInstance(Locale.US);
cf.format(1234.56); // 输出 "$1,234.56"
自定义货币符号:
DecimalFormat df = new DecimalFormat("¤#,##0.00");
df.setCurrency(Currency.getInstance("EUR"));
df.format(1234.56); // 输出 "€1,234.56"
百分比格式化
使用NumberFormat的百分比实例:
NumberFormat pf = NumberFormat.getPercentInstance();
pf.format(0.85); // 输出 "85%"
科学计数法格式化
使用DecimalFormat的模式字符:
DecimalFormat df = new DecimalFormat("0.###E0");
df.format(12345); // 输出 "1.235E4"
填充数字位数
使用String.format()补零:
String s = String.format("%08d", 123); // 输出 "00000123"
DecimalFormat补零:
DecimalFormat df = new DecimalFormat("00000.000");
df.format(12.3); // 输出 "00012.300"
格式化负数和正数
自定义正负数格式:
DecimalFormat df = new DecimalFormat("#,##0.00;(#,##0.00)");
df.format(-1234.56); // 输出 "(1,234.56)"
数字解析
将格式化字符串转回数字:
DecimalFormat df = new DecimalFormat("#,###.##");
Number num = df.parse("1,234.56"); // 返回 1234.56
字符串转数字
使用包装类的valueOf、parseXX方法
// 12
Integer i1 = Integer.valueOf("12");
//12
int i2 = Integer.parseInt("12");
//255(十六进制解析FF)
int i3 = Integer.parseInt("FF",16);
// 12.34
Float f1 = Float.valueOf("12.34");
//12.34
float f2 = Float.parseFloat("12.34");
数字转字符串
使用字符串的valueOf方法、包装类的toString方法
// 12.34
String str1 = String.value0f(12.34);
// 255
String str2=Integer.toString(255);
//ff
String str3=Integer.toString(255, 16);
高精度计算
float、double存储的只是小数的近似值,并非精确值。因此不适合用来进行高精度计算
Java 提供了 BigDecimal 和 BigInteger 类来处理高精度计算,适用于需要精确结果的场景,如金融计算或大数运算。
import java.math.BigDecimal;
import java.math.RoundingMode;
// 初始化 BigDecimal
BigDecimal num1 = new BigDecimal("0.1");
BigDecimal num2 = new BigDecimal("0.2");
// 加法
BigDecimal sum = num1.add(num2); // 结果为 0.3
// 减法
BigDecimal difference = num1.subtract(num2); // 结果为 -0.1
// 乘法
BigDecimal product = num1.multiply(num2); // 结果为 0.02
// 除法(需指定精度和舍入模式)
BigDecimal quotient = num1.divide(num2, 10, RoundingMode.HALF_UP); // 结果为 0.5
// 比较
int compareResult = num1.compareTo(num2); // -1 (小于), 0 (等于), 1 (大于)
七、String
Java中用java.lang.String 类代表字符串
底层使用char[]存储字符数据,从Java 9开始,底层使用byte[]存储字符数据
所有字符串字面量(比如"abc")都是String类的实例
String对象一旦创建完毕,它的字符内容是不可以修改的,任何修改操作(如拼接、替换)都会生成新的字符串对象。
intern方法
intern方法的作用 :如果SCP(常量池)中存在与A内容一样的字符串对象C时,就返回0 ,否则,将A加入到SCP中,返回A
int a=1,b=2,c=3;
String s1=String.format("%d%d%d",a,b,c);
String s2=String.format("%d%d%d",a,b,c);
String s3=s1.intern();
String s4=s2.intern();
String s5="123";
System.out.println(s1==s2);//false
System.out.println(s1==s3);//true
System.out.println(s1==s4);//true
System.out.println(s1==s5);//true
字符串的常用方法
//去除左右的空格:"123 456"
"123 456".trim()
//转为大写字母:ABC
"abc".toUpperCase()
//转为小写字母:abc
"ABC".toLowerCase()
//是否包含某个字符串:true
"123456".contains("34")
//是否以某个字符串开头:true
"123456".startsWith("123")
//是否以某个字符串结尾:true
"123456".endsWith("456")
//将字符串分割为数组:[1,2,3,4]
"1_2_3_4".split("_")
//比较字符串的大小:< 0
"abc".compareTo("adc")
//忽略大小写比较字符串的大小:<0
"abc".compareToIgnoreCase("ADC")
String s1 ="abc";
String s2 = new String("abc");
//查看字符串的内容是否相等:true
s1.equals(s2)
//忽略大小写查看字符串的内容是否相等:true
"abc".equalsIgnoreCase("aBc")
StringBuilder
在进行大量字符串的改动操作时(比如拼接、替换),使用String会非常消耗内存、降低程序性能,使用StringBuilder可以节省内存、提高程序性能。
StringBuilder的常用方法有:append、insert、delete、replace、reverse等
StringBuilder 并不是String的子类或者父类,但StringBuilder、String都实现了CharSequence接口
八、Date
Date常用方法
获取当前日期和时间
使用 java.util.Date 的默认构造函数可以获取当前日期和时间:
Date currentDate = new Date();
System.out.println(currentDate); // 输出当前日期和时间
日期格式化
通过 SimpleDateFormat 将 Date 格式化为字符串:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String formattedDate = sdf.format(new Date());
System.out.println(formattedDate); // 输出如:2023-10-05 14:30:45
解析字符串为日期
使用 SimpleDateFormat 将字符串解析为 Date 对象:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date parsedDate = sdf.parse("2023-10-05");
System.out.println(parsedDate);
获取时间戳
Date 对象可以通过 getTime() 方法获取时间戳(毫秒数):
long timestamp = new Date().getTime();
System.out.println(timestamp); // 输出从1970-01-01至今的毫秒数
日期比较
使用 compareTo 方法比较两个 Date 对象的先后:
Date date1 = new Date();
Date date2 = new Date(System.currentTimeMillis() + 1000);
int result = date1.compareTo(date2);
// result < 0: date1在date2之前;result = 0: 相同;result > 0: date1在date2之后
日期加减
Date 本身不支持直接加减,需通过 Calendar 实现:
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_MONTH, 5); // 加5天
Date newDate = calendar.getTime();
System.out.println(newDate);
注意
Date 的许多方法(如 getYear()、setMonth())已废弃,推荐使用 Calendar 或 java.time(Java 8+)替代。
替代方案(Java 8+)
建议优先使用 java.time.LocalDateTime 或 java.time.Instant:
LocalDateTime now = LocalDateTime.now();
System.out.println(now); // 输出:2023-10-05T14:30:45.123
Calendar
获取当前日期和时间
使用 Calendar.getInstance() 获取当前系统时间的实例。
Calendar calendar = Calendar.getInstance();
设置特定日期和时间
通过 set 方法设置年、月、日、时、分、秒等字段。
calendar.set(Calendar.YEAR, 2023);
calendar.set(Calendar.MONTH, Calendar.JANUARY); // 月份从0开始(0-11)
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
获取日期和时间字段
使用 get 方法获取年、月、日等字段的值。
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH); // 返回0-11
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
日期和时间的加减操作
通过 add 方法对日期或时间字段进行加减操作。
calendar.add(Calendar.DAY_OF_MONTH, 5); // 增加5天
calendar.add(Calendar.MONTH, -1); // 减少1个月
比较两个 Calendar 对象
使用 before、after 或 equals 方法比较日期。
Calendar otherCalendar = Calendar.getInstance();
otherCalendar.add(Calendar.DAY_OF_MONTH, 1);
boolean isBefore = calendar.before(otherCalendar);
boolean isAfter = calendar.after(otherCalendar);
boolean isEqual = calendar.equals(otherCalendar);
获取一周的第几天
使用 Calendar.DAY_OF_WEEK 获取星期几(1-7,Calendar.SUNDAY 为1)。
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
String[] weekDays = {"", "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
System.out.println(weekDays[dayOfWeek]);
注意事项
- Calendar.MONTH 从 0 开始(0 表示一月,11 表示十二月)。
- Calendar.DAY_OF_WEEK 中,Calendar.SUNDAY 是 1,Calendar.SATURDAY 是 7。
- 推荐使用 java.time(Java 8+)替代 Calendar,如 LocalDate、LocalDateTime。





