常用类
1、包装类
包装类:对基本数据类型再一次封装。
在基本数据的基础上,添加了属性、方法和构造器,便于开发人员使用。
基本数据类型对应的包装类:
基本数据类型 | 对应包装类 | 继承关系 |
---|---|---|
byte | Byte | 继承自Number再继承自Object |
short | Short | 继承自Number再继承自Object |
int | Integer | 继承自Number再继承自Object |
long | Long | 继承自Number再继承自Object |
float | Float | 继承自Number再继承自Object |
double | Double | 继承自Number再继承自Object |
boolean | Boolean | Object |
char | Charater | Object |
为啥要用包装类:
- Java是面向对象编程,最为擅长操作类和对象,所以要封装为包装类。
- 集合使用的需要,集合只能使用包装类型。
1.1、Double
这里以Double
举例。(JDK1.0就有了)
Double
在java.lang
下,无需导包,直接使用- 继承关系
- 实现了
Serializable
,Comparable
接口 - 同时
Double
被final
修饰,无法被继承 Doouble
类是对基本数据类型double的封装- 有诸多的属性和方法,如
MAX_VALUE
、parseDouble(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、isBefore
、isAfter
、isEqual
方法
判断此日期时间是否在指定日期时间之前、之后或者相等。
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常用方法
ZonedDateTime
与LocalDateTime
相似,多了个指定时区的功能。
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、构造器创建字符串
5.2、equals
5.3、compareTo
5.4、常用方法
5.4.1、replace、replaceAll
将指定字符串替换成特定字符串。
将正则匹配的内容替换成指定内容。
5.4.2、toUpperCase、toLowerCase
转为全大写,转为全小写。
5.4.3、substring
从指定下标到指定下标截取字符串。
5.4.4、concat
拼接字符串。
5.4.5、indexOf
获取指定字符下标。
5.4.6、charAt
获取指定下标的字符。
5.4.7、startsWith、endsWith
判断字符串是否以指定字符串开始或结束。
5.4.8、format
格式化字符串。
5.4.9、String.valueOf
将
基础数据类型
转为String类型
。
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());
}
输出效果:
7、String、StringBuffer、StringBuilder区别与联系
-
String
类是不可变的,即一旦一个String
对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。 -
StringBuffer
类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength
等方法改变其内容。一旦生成了最终的字符串,调用toString
方法将其转变为String
。 -
JDK1.5
新增了一个StringBuilder
类,与StringBuffer
相似,构造方法和方法基本相同。不同是StringBuffer
是线程安全的,而StringBuilder
是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder
。