日期和时间
Date
- Date类代表当前所在系统的日期时间信息
获取时间毫秒值
无参构造器:
public Date()
,创建一个Data对象,代表的是系统当前时刻的日期时间调用方法:
public long getTime()
,返回从1970年1月1日00:00:00走到此刻的总的毫秒数
时间毫秒值到日期
- 有参构造器:
public Date(long time)
,把时间毫秒值转换成Date日期对象 - 使用无参构造器对象的方法:
public long setTime()
,设置日期对象的时间为当前时间毫秒值对应的时间
SimpleDateFormat
- 代表简单日期格式化,可以用来把日期时间格式化成为我们想要的形式,也可以把字符串的时间形式解析成Date日期对象
格式化
- 构造器:
public SimpleDateFormat(String pattern)
,创建简单日期格式化对象,并封装格式化的形式信息,对应设置pattern的格式如下
2020-11-11 13:27:06
$\Rightarrow$yyyy-MM-dd HH:mm:ss
2020年11月11日 13:27:06
$\Rightarrow$yyyy年MM月dd日 HH:mm:ss
- 常用方法:①
public final String format(Date date)
,将日期格式化成日期/时间字符串;②public final String format(Object time)
,将时间毫秒值格式化成日期/时间字符串
解析方法:public Date parse(String source)
,从给定字符串的开始解析文本以生成日期,字符串的格式要和定义的pattern相同,否则会报错
Calendar
定义:Calendar代表了系统此刻日期对应的日历对象。Calendar是一个抽象类,不能直接创建对象。Calendar是可变日期对象,一旦修改后其对象本身表示的时间将产生变化
创建日历对象的方法:public static Calendar getInstance()-->Calendar cal = Calendar.getInstance()
,获取当前日历对象
常用方法:
方法名 | 说明 |
---|---|
public int get(int field) | 取日期中的某个字段信息。 |
public void set(int field,int value) | 修改日历的某个字段信息。 |
public void add(int field,int amount) | 为某个字段增加/减少指定的值 |
public final Date getTime() | 拿到此刻日期对象。 |
public long getTimeInMillis() | 拿到此刻时间毫秒值 |
JDK8新增日期类
从Java 8开始,java.time包提供了新的日期和时间API,主要涉及的类型有以下几个,具体使用请查找Java API文档。

新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。其次,新API的类型几乎全部是不变类型(和String的使用类似),可以放心使用不必担心被修改。
包装类
定义:包装类其实就是8种基本数据类型对应的引用数据类型
基本数据类型 | 引用数据类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
提供包装类的原因:
Java为了实现一切皆对象,为8种基本类型提供了对应的引用类型
后面的集合和泛型其实也只能支持包装类型,不支持基本数据类型
自动装箱:基本类型的数据和变量可以直接赋值给包装类型的变量
自动拆箱:包装类型的变量可以直接赋值给基本数据类型的变量
包装类特有功能:①包装类的变量的默认值可以是null,容错率更高。②可以把基本类型的数据转换成字符串类型(用处不大)。③可以把字符串类型的数值转换成真实的数据类型
- 方法:调用
toString()
方法得到字符串结果,也调用Integer.toString(基本类型的数据)
;调用Integer.parseInt()
得到“字符串类型的整数”;调用Double.parseDouble()
得到“字符串类型的小数”。
正则表达式
作用:可以用一些规定的字符来制定规则,并用来校验数据格式的合法性
字符串对象提供了匹配正则表达式的方法:public boolean matches(String regex)
,判断是否匹配正则表达式,匹配返回true,不匹配返回false
语法:这里就列举一些常用的,具体可以查看API文档
字符 | 说明 |
---|---|
[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 |
. | 任何字符 |
\d | 一个数字:[0-9] |
\D | 非数字:[^0-9] |
\s | 一个空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | [a-zA-Z_0-9] 英文、数字、下划线 |
\W | [^\w] 一个非单词字符 |
X? | X , 一次或根本不 |
X* | X,零次或多次 |
X+ | X , 一次或多次 |
X {n} | X,正好n次 |
X {n, } | X,至少n次 |
X {n,m} | X,至少n但不超过m次 |
如:
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
正则表达式在字符串方法中的使用:
方法名 | 说明 |
---|---|
public String replaceAll(String regex,String newStr) | 按照正则表达式匹配的内容进行替换 |
public String[] split(String regex): | 按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组 |
Arrays类
定义:数组操作工具类,专门用于操作数组元素的
Arrays类的常用API:
方法名 | 说明 |
---|---|
public static String toString(类型[] a) | 返回数组的内容(字符串形式) |
public static void sort(类型[] a) | 对数组进行默认升序排序 |
public static <T> void sort(类型[] a, Comparator<? super T> c) | 使用比较器对象自定义排序 |
public static int binarySearch(int[] a, int key) | 二分搜索数组中的数据,存在返回索引,不存在返回-1,使用该方法数组需先排好序 |
自定义排序规则:设置Comparator接口对应的比较器对象,来定制比较规则
如果认为左边数据 大于 右边数据 返回正整数
如果认为左边数据 小于 右边数据 返回负整数
如果认为左边数据 等于 右边数据 返回0
常见算法
冒泡排序
思想:每次依次从数组第一个位置开始比较,若当前位置大于后一个位置则交换数据,依次进行到后面,这样每次结束后都将最大值放到数组的后面去。
规则:假定数组长度为n
- 总共需要做多少轮:n-1
- 比较的总次数:$(n-1)+(n-2)+…+1=\frac{n(n-1)}{2}$

选择排序
思想:每轮选择当前位置,开始找出后面的更小值与该位置交换
规则:假定数组长度为n
- 总共需要做多少轮:n-1
- 控制每轮从以前位置为基准,与后面元素选择几次

二分查找
需求:用于数组元素的基本查询,查询数组中的元素在哪个索引
规则:
- 二分查找性能好,二分查找的前提是必须是排好序的数据
- 二分查找相当于每次去掉一半的查找范围
实现步骤:
定义变量记录左边和右边位置。
使用while循环控制查询(条件是左边位置<=右边位置)
循环内部获取中间元素索引
判断当前要找的元素如果大于中间元素,左边位置=中间索引+1
判断当前要找的元素如果小于中间元素,右边位置=中间索引-1
判断当前要找的元素如果等于中间元素,返回当前中间元素索引
Lambda表达式
定义:Lambda表达式是JDK 8开始后的一种新语法形式
作用:简化匿名内部类的代码写法
简化格式:
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码;
}
// 注:-> 是语法形式,无实际含义
注意:Lambda表达式只能简化函数式接口的匿名内部类的写法形式
函数式接口:首先必须是接口,其次接口中有且仅有一个抽象方法的形式
public class LambdaDemo1 {
public static void main(String[] args) {
goSwimming( new Swimming() {
@Override
public void swim() {
System.out.println("铁汁, 我们去游泳吧~");
}
} );
}
public static void goSwimming(Swimming swimming) {
swimming.swim();
}
}
// 使用Lambda表达式之后,可以看出代码更少,关注点更加明确了
public class LambdaDemo1 {
public static void main(String[] args) {
goSwimming( () -> {
System.out.println("铁汁, 我们去游泳吧~")
} );
}
public static void goSwimming(Swimming swimming) {
swimming.swim();
}
}
进一步在Lambda表达式的基础上继续简化:
参数类型可以省略不写。
如果只有一个参数,参数类型可以省略,同时()也可以省略。
如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略”;”不写