Java:(学习笔记)五、常用API与补充语法
第六章—常用API与补充语法
一、Java API概述
API ( Application Programming Interface )应用程序编程接口 ,是对java预先定义的类或接口功能和函数功能的说明文档,目的是提供给开发人员进行使用帮助说明. 简单来说,就是Java帮我们已经写好的一些方法,我们直接拿过来用就可以了。
二、Object
1、说明
Object类的方法是一切子类对象都可以直接使用的,一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类。
2、常用方法
方法名 | 说明 |
---|---|
public String toString() | 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址 |
public boolean equals(Object o) | 默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false |
3、toString方法
开发中直接输出对象,默认输出对象的地址其实是毫无意义的,更多的时候是希望看到对象的内容数据而不是对象的地址信息。
开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息。
父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息
4、equals方法
没有被重写的时候,默认比较的是两个对象的地址,所以 “ == ” 与 equals 的作用重复了。
父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则。
三、Objects
1、说明
Objects是一个工具类,提供了一些方法去完成一些功能。使用Objects的equals方法在进行对象的比较会更安全。
2、常用方法
方法名 | 说明 |
---|---|
public static boolean equals(Object a, Object b) | 比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常。再进行equals比较 |
public static boolean isNull(Object obj) | 判断变量是否为null ,为null返回true ,反之 |
四、StringBuilder
1、说明
StringBuilder是一个可变的字符串类,我们可以把它看成是一个对象容器。
作用:提高字符串的操作效率,如拼接、修改等。
2、StringBuilder构造器
名称 | 说明 |
---|---|
public StringBuilder() | 创建一个空白的可变的字符串对象,不包含任何内容 |
public StringBuilder(String str) | 创建一个指定字符串内容的可变字符串对象 |
3、常用方法
方法名称 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据并返回StringBuilder对象本身 |
public StringBuilder reverse() | 将对象的内容反转 |
public int length() | 返回对象内容长度 |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
4、String与StringBuilder比较
String :内容是不可变的、拼接字符串性能差。
StringBuilder:内容是可变的、拼接字符串性能好、代码优雅。
定义字符串使用String;拼接、修改等操作字符串使用StringBuilder
五、Math
1、说明
包含执行基本数字运算的方法,Math类没有提供公开的构造器。如果类的成员是否都是静态的,,通过类名就可以直接调用
2、常用方法
方法名 | 说明 |
---|---|
public static int abs(int a) | 获取参数绝对值 |
public static double ceil(double a) | 向上取整 |
public static double floor(double a) | 向下取整 |
public static int round(float a) | 四舍五入 |
public static int max(int a,int b) | 获取两个int值中的较大值 |
public static double pow(double a,double b) | 返回a的b次幂的值 |
public static double random() | 返回值为double的随机值,范围[0.0,1.0) |
六、System
1、说明
System也是一个工具类,代表了当前系统,提供了一些与系统相关的方法。
2、常用方法
方法名 | 说明 |
---|---|
public static void exit(int status) | 终止当前运行的 Java 虚拟机,非零表示异常终止 |
public static long currentTimeMillis() | 返回当前系统的时间毫秒值形式 |
public static void arraycopy(数据源数组, 起始索引, 目的地数组, 起始索引, 拷贝个数) | 数组拷贝 |
注:计算机认为时间是有起点的,起始时间: 1970年1月1日 00:00:00。时间毫秒值:指的是从1970年1月1日 00:00:00走到此刻的总的毫秒数,
七、BigDecimal
1、说明
用于解决浮点型运算精度失真的问题
2、使用
创建对象BigDecimal封装浮点型数据(最好的方式是调用方法)
//包装浮点数成为BigDecimal对象。
public static BigDecimal valueOf(double val);
3、常用方法
方法名 | 说明 |
---|---|
public BigDecimal add(BigDecimal b) | 加法 |
public BigDecimal subtract(BigDecimal b) | 减法 |
public BigDecimal multiply(BigDecimal b) | 乘法 |
public BigDecimal divide(BigDecimal b) | 除法 |
public BigDecimal divide (另一个BigDecimal对象,精确几位,舍入模式) | 除法 |
八、日期与时间
1、Date
1)说明
Date类代表当前所在系统的日期时间信息。
2)构造器
名称 | 说明 |
---|---|
public Date() | 创建一个Date对象,代表的是系统当前此刻日期时间。 |
public Date(long time) | 把时间毫秒值转换成Date日期对象。 |
3)常用方法
名称 | 说明 |
---|---|
public long getTime() | 返回从1970年1月1日 00:00:00走到此刻的总的毫秒数 |
public void setTime(long time) | 设置日期对象的时间为当前时间毫秒值对应的时间 |
2、SimpleDateFormat
1)说明
可以去完成日期时间的格式化操作
2)构造器
构造器 | 说明 |
---|---|
public SimpleDateFormat(String pattern) | 构造一个SimpleDateFormat,使用指定的格式 |
3)常用方法
方法 | 说明 |
---|---|
public final String format(Date date) | 将日期格式化成日期/时间字符串 |
public final String format(Object time) | 将时间毫秒值式化成日期/时间字符串 |
public Date parse(String source) | 从给定字符串的开始解析文本以生成日期 |
4)格式化的时间形式的常用的模式对应关系
年 | 月 | 日 | 时 | 分 | 秒 |
---|---|---|---|---|---|
y | M | d | H | m | s |
举例:
2020-11-11 13:27:06 —— yyyy-MM-dd HH:mm:ss
2020年11月11日 13:27:06 —— yyyy年MM月dd日 HH:mm:ss
3、Calendar
1)说明
Calendar代表了系统此刻日期对应的日历对象。
Calendar是一个抽象类,不能直接创建对象。
2)常用方法
public int get(int field) | 取日期中的某个字段信息。 |
---|---|
public static Calendar getInstance() | 获取当前日历对象 |
public void set(int field,int value) | 修改日历的某个字段信息。 |
public void add(int field,int amount) | 为某个字段增加/减少指定的值 |
public final Date getTime() | 拿到此刻日期对象。 |
public long getTimeInMillis() | 拿到此刻时间毫秒值 |
注意:calendar是可变日期对象,一旦修改后其对象本身表示的时间将产生变化。
4、JDK8新增日期类
1)新增日期和时间API说明
新增日期和时间API | 说明 |
---|---|
LocalDate | 不包含具体时间的日期。 |
LocalTime | 不含日期的时间。 |
LocalDateTime | 包含了日期及时间。 |
Instant | 代表的是时间戳。 |
DateTimeFormatter | 用于做时间的格式化和解析的 |
Duration | 用于计算两个“时间”间隔 |
Period | 用于计算两个“日期”间隔 |
新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改。
2)LocalDate、LocalTime、LocalDateTime
①说明
他们分别表示日期,时间,日期时间对象,他们的类的实例是不可变的对象。他们三者构建对象和API都是通用的
②方法
方法名 | 说明 | |
---|---|---|
public static Xxxx now(); | 静态方法,根据当前时间创建对象 | LocaDate localDate = LocalDate.now(); LocalTime llocalTime = LocalTime.now(); LocalDateTime localDateTime = LocalDateTime.now(); |
public static Xxxx of(…); | 静态方法,指定日期/时间创建对象 | LocalDate localDate1 = LocalDate.of(2099 , 11,11); LocalTime localTime1 = LocalTime.of(11, 11, 11); LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43); |
public int geYear() | 获取年 | |
public int getMonthValue() | 获取月份(1-12) | |
Public int getDayOfMonth() | 获取月中第几天 | |
Public int getDayOfYear() | 获取年中第几天 | |
Public DayOfWeek getDayOfWeek() | 获取星期 |
③LocalDateTime的转换API
方法名 | 说明 |
---|---|
public LocalDate toLocalDate() | 转换成一个LocalDate对象 |
public LocalTime toLocalTime() | 转换成一个LocalTime对象 |
④修改API
方法名 | 说明 |
---|---|
plusDays, plusWeeks, plusMonths, plusYears | 向当前 LocalDate 对象添加几天、 几周、几个月、几年 |
minusDays, minusWeeks, minusMonths, minusYears | 从当前 LocalDate 对象减去几天、 几周、几个月、几年 |
withDayOfMonth, withDayOfYear, withMonth, withYear | 将月份天数、年份天数、月份、年 份 修 改 为 指 定 的 值 并 返 回 新 的 LocalDate 对象 |
isBefore, isAfter | 比较两个 LocalDate |
注:LocalDateTime 综合了 LocalDate 和 LocalTime 里面的方法,这些方法返回的是一个新的实例引用,因为LocalDateTime 、LocalDate 、LocalTime 都是不可变的。
3)Instant
Instant类由一个静态的工厂方法now()可以返回当前时间戳。
时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类似JDK8 以前的Date。
Instant和Date这两个类可以进行转换。
Instant instant = Instant.now();
System.out.println("当前时间戳是:" + instant);
Date date = Date.from(instant);
System.out.println("当前时间戳是:" + date);
instant = date.toInstant();
System.out.println(instant);
4)DateTimeFormatter
一个全新的日期与时间格式器DateTimeFormatter。正反都能调用format方法。
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt);
//2022-02-12T10:45:02.485
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String ldtStr = ldt.format(dtf);
System.out.println(ldtStr);
//2022-02-12 10:45:02
String ldtStr1 = dtf.format(ldt);
System.out.println(ldtStr1);
//2022-02-12 10:45:02
5)Period
计算日期间隔差异,主要是 Period 类方法 getYears(),getMonths() 和 getDays() 来计算,只能精确到年月日。
用于 LocalDate 之间的比较。
LocalDate today = LocalDate.now();
System.out.println(today);
// 2022-02-12
LocalDate birthDate = LocalDate.of(1995, 1, 11);
System.out.println(birthDate);
// 1995-01-11
Period period = Period.between(birthDate, today);
System.out.printf("年龄 : %d 年 %d 月 %d 日", period.getYears(), period.getMonths(), period.getDays());
// 年龄 : 27 年 1 月 1 日
6)Duration
计算时间间隔差异,Duration提供了使用基于时间的值测量时间量的方法。用于 LocalDateTime 之间的比较。也可用于 Instant 之间的比较。
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
LocalDateTime birthDate = LocalDateTime.of(1990,10,1,10,50,30);
System.out.println(birthDate);
Duration duration = Duration.between(birthDate, today);//第二个参数减第一个参数
System.out.println(duration.toDays());//两个时间差的天数
System.out.println(duration.toHours());//两个时间差的小时数
System.out.println(duration.toMinutes());//两个时间差的分钟数
System.out.println(duration.toMillis());//两个时间差的毫秒数
System.out.println(duration.toNanos());//两个时间差的纳秒数
/*
2022-02-12T10:54:11.830
1990-10-01T10:50:30
11457
274968
16498083
989885021830
989885021830000000
*/
7)ChronoUnit
ChronoUnit类可用于在单个时间单位内测量一段时间,这个工具类是最全的了,可以用于比较所有的时间单位
LocalDateTime today = LocalDateTime.now();
System.out.println(today);
LocalDateTime birthDate = LocalDateTime.of(1990,10,1,10,50,30);
System.out.println(birthDate);
System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));
System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));
System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));
System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));
System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));
/*
2022-02-12T10:53:39.171
1990-10-01T10:50:30
相差的年数:31
相差的月数:376
相差的周数:1636
相差的天数:11457
相差的时数:274968
相差的分数:16498083
相差的秒数:989884989
相差的毫秒数:989884989171
相差的微秒数:989884989171000
相差的纳秒数:989884989171000000
相差的半天数:22914
相差的十年数:3
相差的世纪(百年)数:0
相差的千年数:0
相差的纪元数:0
*/
九、包装类
1、说明
包装类就是8中基本数据类型对应的引用类型。
Java为了实现一切皆对象,为8种基本类型提供了对应的引用类型。集合和泛型只能支持包装类型,不支持基本数据类型。
基本数据类型 | 引用数据类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
2、自动装箱与自动拆箱
1)自动装箱
基本类型的数据和变量可以直接赋值给包装类型的变量。
2)自动拆箱
包装类型的变量可以直接赋值给基本数据类型的变量。
3)包装类的特有功能
①包装类的变量的默认值可以是null,容错率更高。
②把基本类型的数据转换成字符串类型。调用 toString() 方法得到字符串结果 与 调用 Integer.toString (基本类型的数据)作用一致。
③把字符串类型的数值转换成真实的数据类型。Integer.parseInt(“字符串类型的整数”)、Double.parseDouble(“字符串类型的小数”)。
十、正则表达式
1、说明
正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。
2、规则
1)字符类(默认匹配一个字符)
正则表达式 | 说明 |
---|---|
[abc] | 只能是a, b, 或c |
[^abc] | 除了a, b, c之外的任何字符 |
[a-zA-Z] | a到z A到Z,包括(范围) |
[a-d[m-p]] | a到d,或m通过p:([a-dm-p]联合) |
[a-z&&[def]] | d, e, 或f(交集) |
[a-z&&[^bc]] | a到z,除了b和c: |
[a-z&&[^m-p]] | a到z,除了m到p:([a-lq-z]减法) |
2)预定义的字符类(默认匹配一个字符)
正则表达式 | 说明 |
---|---|
. | 任何字符 |
\d | 一个数字: [0-9] |
\D | 非数字: [^0-9] |
\s | 一个空白字符: [ \t\n\x0B\f\r] |
\S | 非空白字符: [^\s] |
\w | [a-zA-Z_0-9] 英文、数字、下划线 |
\W | [^\w] 一个非单词字符 |
3)贪婪的两次(配合匹配多个字符)
正则表达式 | 说明 |
---|---|
X? | X ,一次或根本不 |
X* | X ,零次或多次 |
X+ | X ,一次或多次 |
X {n} | X ,正好n次 |
X {n, } | X ,至少n次 |
X {n,m} | X ,至少n但不超过m次 |
4)举例
System.out.println("a".matches("[abc]")); // true
System.out.println("z".matches("[abc]")); // false
System.out.println("ab".matches("[abc]")); // false
System.out.println("ab".matches("[abc]+")); //true
3、应用
方法名 | 说明 |
---|---|
public String replaceAll(String regex,String newStr) | 按照正则表达式匹配的内容进行替换 |
public String[] split(String regex): | 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。 |
十一、Arrays类
1、说明
数组操作工具类,专门用于操作数组元素的。
2、常用方法
方法名 | 说明 |
---|---|
public static String toString(类型[] a) | 返回数组的内容(字符串形式) |
public static void sort(类型[] a) | 对数组进行默认升序排序 |
public static void sort(类型[] a, Comparator<? super T> c) | 使用比较器对象自定义排序 |
public static int binarySearch(int[] a, int key) | 二分搜索数组中的数据,存在返回索引,不存在返回-1 |
3、自定义排序规则
设置Comparator接口对应的比较器对象,来定制比较规则。
如果认为左边数据 大于 右边数据 返回正整数
如果认为左边数据 小于 右边数据 返回负整数
如果认为左边数据 等于 右边数据 返回0
/**
* student 表示待排序的数组
* new Comparator<Student>(Student) 表示Comparator接口对应的比较器对象,来定制比较规则。
* return o1.getAge() - o2.getAge(); 表示依照年龄升序,返回(对象o1的年龄 减去 对象o2的年龄)
*/
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//自己指定比较规则
return o1.getAge() - o2.getAge();
}
});
十二、Lambda表达式
1、说明
Lambda表达式是JDK 8开始后的一种新语法形式。是为了简化匿名内部类的代码写法。
2、格式
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码。
}
//注:-> 是语法形式,无实际含义
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式。必须是接口的匿名内部类,接口中只能有一个抽象方法。
3、简化
1)Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化)
①参数类型可以省略不写。
②如果只有一个参数,参数类型可以省略,同时()也可以省略。
③如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
④如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
2)简化举例一:多参数
①正常写法
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
②简化为匿名形式
Arrays.sort(students, (Student o1, Student o2) -> {
return o1.getAge() - o2.getAge();
});
③省略参数类型
Arrays.sort(students, (o1, o2) -> {
return o1.getAge() - o2.getAge();
});
3)简化举例二:单参数
①正常写法
JButton btn = new JButton("登录");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("登录");
}
});
②简化为匿名形式
JButton btn = new JButton("登录");
Arrays.sort(students, (Student o1, Student o2) -> {
return o1.getAge() - o2.getAge();
});
③省略参数类型和小括号
JButton btn = new JButton("登录");
btn.addActionListener( e -> {
System.out.println("登录");
});
④省略大括号和分号
JButton btn = new JButton("登录");
btn.addActionListener( e -> System.out.println("登录") );