欢迎光临
我们一直在努力

Java自学-03常用类型

一、枚举

如果一个变量的取值只可能是固定的值,就可使用枚举类型

枚举由一组预定义的常量构成

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。
赞(0)
未经允许不得转载:171主机测评 » Java自学-03常用类型
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址