Java基础——常用类

本文介绍了Java中的包装类,如Double,以及日期相关类如Date、SimpleDateFormat、Calendar,并对比了JDK1.8新增的日期API,包括LocalDateTime和ZonedDateTime。此外,还讨论了Math类的常用数学运算以及Random类的随机数生成。最后提到了String和StringBuilder的使用及其区别。
摘要由CSDN通过智能技术生成

常用类

1、包装类

包装类:对基本数据类型再一次封装。

在基本数据的基础上,添加了属性、方法和构造器,便于开发人员使用。

基本数据类型对应的包装类:

基本数据类型对应包装类继承关系
byteByte继承自Number再继承自Object
shortShort继承自Number再继承自Object
intInteger继承自Number再继承自Object
longLong继承自Number再继承自Object
floatFloat继承自Number再继承自Object
doubleDouble继承自Number再继承自Object
booleanBooleanObject
charCharaterObject

为啥要用包装类:

  1. Java是面向对象编程,最为擅长操作类和对象,所以要封装为包装类。
  2. 集合使用的需要,集合只能使用包装类型。

1.1、Double

这里以Double举例。(JDK1.0就有了)

  • Doublejava.lang下,无需导包,直接使用
  • 继承关系
    在这里插入图片描述
  • 实现了SerializableComparable接口
  • 同时Doublefinal修饰,无法被继承
  • Doouble类是对基本数据类型double的封装
  • 有诸多的属性和方法,如MAX_VALUEparseDouble(String s)
  • 两个有参构造器,分别为:Double(double value)Double(String s)
  • 自动装/拆箱(JDK1.5之后)

2、日期相关的类

2.1、java.util.Date

2.1.1、介绍
  • 在JDK 1.1之前, Date有两个附加功能。 它允许将日期解释为年,月,日,小时,分钟和第二个值。 它还允许格式化和解析日期字符串。 不幸的是,这些功能的API不适合国际化。 从JDK 1.1开始, Calendar类应该用于在日期和时间字段之间进行转换,并且DateFormat类应用于格式化和解析日期字符串。 在相应的方法Date被弃用。
  • 尽管Date类旨在反映协调的世界时间(UTC),但根据Java虚拟机的主机环境的不同,可能不会这样做。 几乎所有的现代操作系统都假设在所有情况下1天= 24×60×60 = 86400秒。 然而,在UTC的时候,大概每一两年会有一秒钟的时间,叫做“闰秒”。 闰秒总是作为一天的最后一秒,总是在12月31日或6月30日。例如,1995年的最后一分钟是61秒,由于增加了闰秒。 大多数计算机时钟不够准确,不能反映出闰秒的区别。
2.1.2、常用方法

2.2、java.sql.Date

2.2.1、介绍

java.util.Date的子类

2.2.2、常用方法

与java.util.Date类似

在这里插入图片描述

2.3、SimpleDateFormat

  • SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。 它允许格式化(日期文本),解析(文本日期)和归一化(把不同的时间日期格式情况统一成一种情况)。
  • SimpleDateFormat允许您从选择日期时间格式化的任何用户定义的模式开始。 不过,建议您创建一个日期-时间格式有两种getTimeInstance , getDateInstance ,或getDateTimeInstance在DateFormat 。 这些类方法中的每一个都可以返回使用默认格式模式初始化的日期/时间格式化程序。 您可以根据需要使用applyPattern方法修改格式模式。 有关使用这些方法的更多信息,请参见DateFormat 。
2.3.1、解析日期字符串和格式化日期

在这里插入图片描述

2.3.2、日期格式

在这里插入图片描述

2.4、Calendar

以2023.6.4日为例:

@Test
public void test() {
    // 两种创建方式:
    Calendar calendar = new GregorianCalendar();
    Calendar calendar1 = Calendar.getInstance();
    System.out.println("calendar = " + calendar);

    // 常用方法
    // get方法,传入参数:Calender定义的常量
    System.out.println("calendar.get(Calendar.YEAR) = " + calendar.get(Calendar.YEAR));
    // 从0开始
    System.out.println("calendar.get(Calendar.MONTH) = " + calendar.get(Calendar.MONTH));
    System.out.println("calendar.get(Calendar.DATE) = " + calendar.get(Calendar.DATE));
    // 外国是周日为第一天,星期一为第二天。
    System.out.println("calendar.get(Calendar.DAY_OF_WEEK) = " + calendar.get(Calendar.DAY_OF_WEEK));
    // getActualMaximum获取当月最大的天数,比如2022年12月 最大是31天
    System.out.println("calendar.getActualMaximum(Calendar.DATE) = " + calendar.getActualMaximum(Calendar.DATE));
    // getActualMinimum获取当月最小的天数,比如2022年12月 最小是1天
    System.out.println("calendar.getActualMinimum(Calendar.DATE) = " + calendar.getActualMinimum(Calendar.DATE));

    System.out.println("=====================================");

    // set方法:可以改变 Calender中的内容
    calendar.set(Calendar.YEAR, 1990);
    calendar.set(Calendar.MONTH, 3);
    calendar.set(Calendar.DATE, 16);
    System.out.println("calendar.get(Calendar.YEAR) = " + calendar.get(Calendar.YEAR));
    // 从0开始
    System.out.println("calendar.get(Calendar.MONTH) = " + calendar.get(Calendar.MONTH));
    System.out.println("calendar.get(Calendar.DATE) = " + calendar.get(Calendar.DATE));

    System.out.println("=====================================");

    // String ---> Calender
    // 分解:
    // String ---> java.sql.Date
    java.sql.Date date = java.sql.Date.valueOf("2022-12-25");

    // java.sql.Date ---> Calender
    calendar.setTime(date);
    System.out.println("calendar.get(Calendar.YEAR) = " + calendar.get(Calendar.YEAR));
    // 从0开始
    System.out.println("calendar.get(Calendar.MONTH) = " + calendar.get(Calendar.MONTH));
    System.out.println("calendar.get(Calendar.DATE) = " + calendar.get(Calendar.DATE));
}

在这里插入图片描述

2.5、JDK1.8新增日期API

2.5.1、引入

JDK1.0中使用java.util.Date类 → 第一批日期时间API
JDK1.1引入Calendar类 → 第二批日期时间API

缺陷:

  • 可变性 : 像日期和时间这样的类应该是不可变的。
  • 偏移性 : Date中 的年份是从1900开始的,而月份都从0开始。
  • 格式化 : 格式化只对Date有用,Calendar则不行。

JDK1.8新增日期时间API → 第三批日期时间API

2.5.2、LocalDateTime简介

LocalDateTime是一个不可变的日期-时间对象,表示日期-时间,通常被视为年月日时分秒或其他日期和时间字段。

例如:一年中的某一天、一周中的某几天和一年中某几周,也可以访问。

时间以纳秒的精度表示。

2.5.3、LocalDateTime常用方法
2.5.2.1、now()

从默认时区的系统时钟获取当前日期时间。(包括日期和时间)

在这里插入图片描述

2.5.2.2、now(ZoneId zone)

从指定时区的系统时钟获取当前日期时间。(包括日期和时间)

在这里插入图片描述

2.5.2.3、of方法

获取指定年份、月份、月中天数、小时、分钟、秒和纳秒的LocalDateTime实例。

日期必须对年份和月份有效,否则将引发DateTimeException异常。

在这里插入图片描述

2.5.2.4、get方法

获取日期有关的值。

在这里插入图片描述

2.5.2.5、with方法

设置指定的年份、月份、月中天数、小时、分钟、秒和纳秒

在这里插入图片描述

2.5.2.6、plus方法

加上指定的年份、月份、月中天数、小时、分钟、秒和纳秒

在这里插入图片描述

2.5.2.7、minus方法

减去指定的年份、月份、月中天数、小时、分钟、秒和纳秒

在这里插入图片描述

2.5.2.8、format方法

使用指定的格式,格式化此日期时间。

在这里插入图片描述

2.5.2.9、parse方法

使用指定的格式,将String类型的日期时间字符串解析为LocalDateTime

在这里插入图片描述

2.5.2.10、isBeforeisAfterisEqual方法

判断此日期时间是否在指定日期时间之前、之后或者相等。

在这里插入图片描述

2.5.4、ZonedDateTime简介

ZonedDateTime是带有时区的日期时间的不可变表示,以纳秒的精度存储所有日期和时间字段以及时区,其中区域偏移用于处理不明确的本地日期时间。

例如:2007年10月2日13:45.30.123456789+02:00(欧洲/巴黎时区),可以存储在ZonedDateTime中。

ZonedDateTime处理从 LocalDateTime的本地时间行的转换到Instant的即时时间行,两条时间线之间的差异是:UTC/Greenwich的偏移,由ZoneOffset表示。在两条时间线之间转换包括使用从ZoneId访问的ZoneRules规则。

2.5.5、ZonedDateTime常用方法

ZonedDateTimeLocalDateTime相似,多了个指定时区的功能。

2.5.6、ZonedDateTime配合DateTimeFormatter使用
@Test
public void test02() {
    String dateTimeStr = "2023-05-09 08:00:00";
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault());
    ZonedDateTime parse = ZonedDateTime.parse(dateTimeStr, formatter);
    System.out.println("parse = " + parse);

    DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneId.systemDefault());
    String format = formatter1.format(parse);
    System.out.println("format = " + format);
}

在这里插入图片描述

2.5.7、DateTimeFormatter
public static void main(String[] args) {
        
    // 方式 1:预定义标准 如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME   
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    // LocalDatetime --> String
    LocalDateTime now = LocalDateTime.now();
    String formatStr = dateTimeFormatter.format(now);
    System.out.println("formatStr = " + formatStr);
    
    // String --> LocalDateTime
    TemporalAccessor parse = dateTimeFormatter.parse("2022-12-25T15:44:25.481");
    System.out.println("parse = " + parse);
    
    System.out.println("==========================================================");
    
    // 方式 2:本地化相关格式,如 ofLocalizedDateTime
    // FormatStyle.LONG:2022年12月25日 下午04时26分55秒
    // FormatStyle.MEDIUM:2022-12-25 16:27:38
    // FormatStyle.SHORT:22-12-25 下午4:28
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
    // LocalDateTime --> String
    LocalDateTime now1 = LocalDateTime.now();
    String format = formatter.format(now1);
    System.out.println("format = " + format);
    
    // String --> LocalDateTime
    TemporalAccessor parse1 = formatter.parse("2022-12-25 16:27:38");
    System.out.println("parse1.get(ChronoField.DAY_OF_YEAR) = " + parse1.get(ChronoField.DAY_OF_YEAR));
    System.out.println("parse1 = " + parse1);

    System.out.println("==========================================================");

    
    // 方式3:自定义的格式。如: ofPattern( "yyyy-MM-dd hh:mm:ss") ---》重点,以后常用
    DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    //LocalDateTime-->String:
    LocalDateTime now2 = LocalDateTime.now();
    String formatDate = df3.format(now2);
    System.out.println("formatDate = " + formatDate);//2020-06-15 03:22:03
    //String--->LocalDateTime
    // 方式1:
    LocalDateTime dateTime = LocalDateTime.parse("2020-06-15 03:22:03", df3);
    System.out.println("dateTime = " + dateTime);
    // 方式2:
    TemporalAccessor parse2 = df3.parse("2020-06-15 03:22:03");
    LocalDateTime from = LocalDateTime.from(parse2);
    System.out.println("from = " + from);
    
}

在这里插入图片描述

3、Math

  • package java.lang;下的类无需导包
  • 类名被final修饰,代表该类没有子类,不可以被继承
  • 构造器私有化,不能创建Math类的对象
  • 该类的所有属性和方法都被static修饰,可直接通过类名.的形式调用

3.1、常用方法

public static void main(String[] args) {
    // 常用属性:
    System.out.println("Math.PI = " + Math.PI);
    // 常用方法:
    System.out.println("随机数 = " + Math.random());
    System.out.println("绝对值 = " + Math.abs(-89));
    System.out.println("向上取整 = " + Math.ceil(9.2));
    System.out.println("向下取整 = " + Math.floor(9.9));
    System.out.println("四舍五入 = " + Math.round(5.5));
    System.out.println("取最大值 = " + Math.max(2,5));
    System.out.println("取最小值 = " + Math.min(2,5)); 
}

在这里插入图片描述

3.2、静态导入

通过静态导入,直接使用Math的静态属性和方法

在这里插入图片描述

4、Random

该类的实例用于生成伪随机数的流。 该类使用48位种子,其使用线性同余公式进行修改。

4.1、利用有参构造器创建

//(1)利用带参数的构造器创建对象:
Random r1 = new Random(System.currentTimeMillis());
System.out.println("r1.nextInt() = " + r1.nextInt());

在这里插入图片描述

4.2、利用无参构造器创建

//(2)利用空参构造器创建对象:
Random r2 = new Random();//表面是在调用无参数构造器,实际底层还是调用了带参构造器
System.out.println("r2.nextInt(10) = " + r2.nextInt(10));//在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
System.out.println("r2.nextDouble() = " + r2.nextDouble());//在 0.0 和 1.0 之间均匀分布的 double 值。

在这里插入图片描述

5、String

  • package java.lang;下的类无需导包
  • 类名被final修饰,代表该类没有子类,不可以被继承
  • String底层是一个被final修饰的char类型的数组(JDK11之后是被final修饰的byte类型的数组)
  • String是不可变的(底层是被final修饰的char类型的数组)

5.1、构造器创建字符串

String

5.2、equals

String_compareTo

5.3、compareTo

在这里插入图片描述

5.4、常用方法

5.4.1、replace、replaceAll

将指定字符串替换成特定字符串。
将正则匹配的内容替换成指定内容。

replace、replaceAll

5.4.2、toUpperCase、toLowerCase

转为全大写,转为全小写。

toUpperCase、toLowerCase

5.4.3、substring

从指定下标到指定下标截取字符串。

substring

5.4.4、concat

拼接字符串。

concat

5.4.5、indexOf

获取指定字符下标。

indexOf

5.4.6、charAt

获取指定下标的字符。

charAt

5.4.7、startsWith、endsWith

判断字符串是否以指定字符串开始或结束。

startsWith、endsWith

5.4.8、format

格式化字符串。

format

5.4.9、String.valueOf

基础数据类型转为String类型

String.valueOf

5.5、不可变

不可变性

6、StringBuilder

  • package java.lang;下的类无需导包
  • StringBuilder底层是一个char类型的数组
  • StringBuilder是可变的
  • 一旦生成了最终的字符串,需调用toString方法将其转变为String

StringBuilder:JDK1.5开始、效率高、线程不安全
StringBuffer:JDK1.0开始、效率低、线程安全

6.1、常用方法

@Test
public void test01() {
    StringBuilder sb = new StringBuilder("123");
    System.out.println("sb.append(\"456789\") = " + sb.append("456789"));
    System.out.println("sb.delete(6,9) = " + sb.delete(6, 9));
    System.out.println("sb.deleteCharAt(5) = " + sb.deleteCharAt(5));
    System.out.println("sb.insert(6, \"678\") = " + sb.insert(5, "678"));
    System.out.println("sb.replace(5, 8, \"876\") = " + sb.replace(5, 8, "876"));
    System.out.println("sb.substring(5) = " + sb.substring(5));
    System.out.println("sb.reverse() = " + sb.reverse());
}

输出效果:

StringBuilder

7、String、StringBuffer、StringBuilder区别与联系

  1. String类是不可变的,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。

  2. StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String

  3. JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值