第六章---常用API与补充语法
一、Java API概述二、Object
1、说明2、常用方法3、toString方法4、equals方法 三、Objects
1、说明2、常用方法 四、StringBuilder
1、说明2、StringBuilder构造器3、常用方法4、String与StringBuilder比较 五、Math
1、说明2、常用方法 六、System
1、说明2、常用方法 七、BigDecimal
1、说明2、使用3、常用方法 八、日期与时间
1、Date2、SimpleDateFormat3、Calendar4、JDK8新增日期类
1)新增日期和时间API说明2)LocalDate、LocalTime、LocalDateTime3)Instant4)DateTimeFormatter5)Period6)Duration7)ChronoUnit 九、包装类
1、说明2、自动装箱与自动拆箱 十、正则表达式
1、说明2、规则3、应用 十一、Arrays类
1、说明2、常用方法3、自定义排序规则 十二、Lambda表达式
1、说明2、格式3、简化 Java笔记系列
第六章—常用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 |
开发中直接输出对象,默认输出对象的地址其实是毫无意义的,更多的时候是希望看到对象的内容数据而不是对象的地址信息。
开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息。
父类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是一个可变的字符串类,我们可以把它看成是一个对象容器。
作用:提高字符串的操作效率,如拼接、修改等。
2、StringBuilder构造器| 名称 | 说明 |
|---|---|
| public StringBuilder() | 创建一个空白的可变的字符串对象,不包含任何内容 |
| public StringBuilder(String str) | 创建一个指定字符串内容的可变字符串对象 |
| 方法名称 | 说明 |
|---|---|
| public StringBuilder append(任意类型) | 添加数据并返回StringBuilder对象本身 |
| public StringBuilder reverse() | 将对象的内容反转 |
| public int length() | 返回对象内容长度 |
| public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
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也是一个工具类,代表了当前系统,提供了一些与系统相关的方法。
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类代表当前所在系统的日期时间信息。
2)构造器
| 名称 | 说明 |
|---|---|
| public Date() | 创建一个Date对象,代表的是系统当前此刻日期时间。 |
| public Date(long time) | 把时间毫秒值转换成Date日期对象。 |
3)常用方法
| 名称 | 说明 |
|---|---|
| public long getTime() | 返回从1970年1月1日 00:00:00走到此刻的总的毫秒数 |
| public void setTime(long time) | 设置日期对象的时间为当前时间毫秒值对应的时间 |
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、Calendar1)说明
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());//两个时间差的纳秒数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));
九、包装类
1、说明
包装类就是8中基本数据类型对应的引用类型。
Java为了实现一切皆对象,为8种基本类型提供了对应的引用类型。集合和泛型只能支持包装类型,不支持基本数据类型。
| 基本数据类型 | 引用数据类型 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| char | Character |
| float | Float |
| double | Double |
| boolean | Boolean |
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 | 一个空白字符: [ tnx0Bfr] |
| 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): | 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。 |
数组操作工具类,专门用于操作数组元素的。
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 |
设置Comparator接口对应的比较器对象,来定制比较规则。
如果认为左边数据 大于 右边数据 返回正整数
如果认为左边数据 小于 右边数据 返回负整数
如果认为左边数据 等于 右边数据 返回0
Arrays.sort(students, new Comparator十二、Lambda表达式 1、说明() { @Override public int compare(Student o1, Student o2) { //自己指定比较规则 return o1.getAge() - o2.getAge(); } });
Lambda表达式是JDK 8开始后的一种新语法形式。是为了简化匿名内部类的代码写法。
2、格式(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码。
}
//注:-> 是语法形式,无实际含义
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式。必须是接口的匿名内部类,接口中只能有一个抽象方法。
3、简化1)Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化)
①参数类型可以省略不写。
②如果只有一个参数,参数类型可以省略,同时()也可以省略。
③如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
④如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
2)简化举例一:多参数
①正常写法
Arrays.sort(students, new Comparator() { @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("登录") );
Java笔记系列
Java:(学习笔记)一、简介
Java:(学习笔记)二、基础语法
Java:(学习笔记)三、面向对象-基础
Java:(学习笔记)四、面向对象-三大基本特征
Java:(学习笔记)五、常用API与补充语法
Java:(学习笔记)六、集合



