工具类
Math
-
static double max(double x,double y)
:返回xy的最大值,有int、long、float、double数据类型的重载
-
static double min(double x,double y)
:返回xy的最小值,有int、long、float、double数据类型的重载
-
static double abs(double num)
:取绝对值,有int、long、float、double数据类型的重载
-
static double ceil(double num)
:向上取整
-
static double floor(double num)
:向下取整
-
static long round(double num)
:四舍五入
-
static double random()
:无参,返回[0,1)的double数
Math.random();
b*Math.random();
(int)(b*Math.random())
a+(int)((b+1-a)*Math.random());
Random random = new Random();
int randomNumber = random.nextInt();
int randomNumber = random.nextInt(b);
int randomNumber = random.nextInt(b+1)+a;
时间工具类
定时器
- 由TimerTask类(定时任务)和Timer类(定时器)构成。
- TimerTask类是Runnable的实现类,需要重写run()方法,run方法就是定时任务。
- 而Timer类是调用TimerTask计划任务的定时器
- 这两个方法的区别在于,当有多个定时任务时,固定定时器是抢占式执行调用时机会跟加准确,简单定时器是礼让执行可能会稍有延迟
方法名 |
描述 |
void schedule(TimerTask task, long delay, long period) |
简单定时器(单位毫秒) |
void scheduleAtFixedRate(TimerTask task, long delay, long period) |
固定时间定时器(单位毫秒) |
Date时间对象
实现时间和long类型数字的互相转换
构造方法
方法名 |
描述 |
Date() |
创建当前时间的时间对象 |
Date(long date) |
创建指定时间的时间对象 |
成员方法
方法名 |
描述 |
long getTime() |
获取该时间对象的时间戳 |
void setTime(long time) |
修改时间对象的时间 |
Date date = new Date();
Date date = new Date(0L);
long s = new Date().getTime();
s = System.currentTimeMillis();
String str = new Date().toLocaleString();
实现时间和字符串之间的转换
构造方法
- yyyy-MM-dd HH:mm:ss:SSS:标准24小时制时间
- yyyy-MM-dd hh:mm:ss:SSS: 标准12小时制时间
- 默认格式是本地默认时间格式
方法名 |
描述 |
SimpleDateFormat() |
获取默认格式的转换日期对象 |
SimpleDateFormat(String pattern) |
获取指定转化的日期格式对象 |
成员方法
方法名 |
描述 |
String format(Date date) |
将日期对象转化为指定格式字符串 |
Date parse(String source) |
将指定格式字符串转换为日期对象,线程不安全 |
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = simpleDateFormat.format(new Date);
Date date = simpleDateFormat.parse("1970-01-01 00:00:00");
date = simpleDateFormat.parse("1970-99-99 99:99:99");
Calendar(日历对象)
主要实现日期的运算处理,是个抽象类,可以使用该类中的静态方法getInstance()或GregorianCalendar子类实例化
静态方法和静态属性
方法名 |
描述 |
static Calendar getInstance() |
获取当前时间的日历对象 |
YEAR |
年 |
MONTH |
月(从0开始的) |
DAY_OF_MONTH |
日 |
DAY_OF_WEEK |
星期(1是周日,以此类推) |
HOUR |
时 |
MINUTE |
分 |
SECOND |
秒 |
成员方法
方法名 |
描述 |
int get(int field) |
根据指定字段获取内容 |
void set(int field, int value) |
修改指定字段的内容(其他重载的set方法可以直接设置年月日时分秒) |
void add(int field, int amount) |
对指定字段加减运算操作 |
Date getTime() |
返回当前日历对象转换为的Date对象 |
void setTime(Date date) |
将Date对象转换为日历对象 |
Calendar calendar = Calendar.getInstance();
Calendar calendar = new GregorianCalendar();
Calendar calendar = new GregorianCalendar(1970,1,1);
Calendar calendar = new GregorianCalendar(1970,1,1,0,0,0);
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int week = calendar.get(Calendar.DAY_OF_WEEK);
calendar.set(Calendar.MONTH,10);
calendar.add(Calendar.MONTH,-2);
Date date = calendar.getTime();
Calendar c = calendar.setTime(new Date());
time包
jdk1.8后新增的time包,解决了星期一是周日和月从零开始问题,更符合中国人的习惯,更加方便的对时间进行处理,其中LocalDate(日期)、LocalTime(时间)、LocalDateTime(日期时间)都相差不大
包装类
继承关系
所有包装类都无法被继承,String类和System类也无法被继承

对应关系表
基本类型 |
对应包装类 |
byte |
Byte |
short |
Short |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
boolean |
Boolean |
装箱与拆箱
Integer integer = new Integer("1");
Integer integer = new Integer(1);
Integer integer = Integer.valueOf(1);
Integer integer = Integer.valueOf("1");
int i = integer.intValue();
double i = doubleI.doubleValue();
Integer integer = 1;
int i = integer;
Integer a = 128;
Integer b = 128;
System.out.println(a==b);
System.out.println(a.equals(b));
Integer a = 127;
Integer b = 127;
Integer c = new Integer(127);
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a.equals(b));
字符串转换基本数据类型
除了Character外,每个包装类都有对应static xxx parseXxx(String s)
的静态方法,将字符串转换成对应基本数据类型,若有非数字字符出现则会抛出NumberFormatException
异常。但是Boolean.parseBoolean()
比较特殊,只有true才会返回true,其他一律返回false
包括Character,每个包装类都有对应static String toString(xxx x)
的静态方法和String类中的static String valueOf(xxx x)
静态方法,都将基本数据类型转换为字符串,虽然为基本数据类型加上空字符串更简单可以转换,但是由于会产生空字符串的垃圾空间,所以不推荐
排序接口
自定义对象想要排序,都要定义比较器,比较器泛型要使用要排序的对象类型
要么给排序方法传入一个实现Comparator接口的实现类对象,该实现类重写compare()方法的排序规则
要么自定义类实现Comparable接口重写compareTo()方法的排序规则
Comparable自然排序和Comparator比较器的区别
Comparator |
Comparable |
位于java.util包下 |
位于java.lang包下 |
独立于自定义类之外 |
在自定义类上实现 |
调用排序方法指定实现对类对象 |
直接调用排序方法 |
集合框架
集合框架的体系结构

Collection
子类可通过构造方法进行Collection集合之间的转换,和Map集合之间转换通过entrySet()和values()方法
Collection和set(集)
- 存储元素特点:无序无下标,不可重复
- 元素只能存储一个null
方法名 |
描述 |
Iterator<E> iterator(); |
获取集合迭代器对象(继承的) |
boolean add(E e) |
集合中追加元素 |
boolean remove(Object o) |
根据对象equals方法,移除集合中元素 |
void clear() |
清空集合元素 |
boolean contains(Object o) |
根据对象equals方法,判断集合是否包含该元素 |
boolean isEmpty() |
集合是否为空 |
int size() |
集合大小 |
<T> T[] toArray(T[] a) |
集合转换为数组 |
boolean addAll(Collection<? extends E> c) |
将集合c中元素添加到当集合(并) |
boolean removeAll(Collection<?> c) |
将当前集合包含c集合的元素删除(差) |
boolean retainAll(Collection<?> c) |
将当前集合不包含c集合的元素删除(交) |
HashSet
- 底层基于HashMap实现,因此查询效率和增删效率都比较高
- 存放到HashSet集合中的元素相当于放入HashMap集合的key部分
- 只能存一个null元素
- 默认容量是16
LinkedHashSet
- 底层基于哈希表+链表,有序,不可重复
- 只能存一个null元素
TreeSet
- 底层基于TreeMap实现,无序,不可重复,自动排序
- 存放到HashSet集合中的元素相当于放入HashMap集合的key部分
- 不允许存null
方法名 |
描述 |
TreeSet() |
自然顺序排序,继承Comparable接口 |
TreeSet(Comparator<? super E> comparator) |
传入比较器Comparator接口 |
List(链表)
- 存储元素特点:有序有下标,可重复
- 可存储多个元素为null
方法名 |
描述 |
ListIterator<E> listIterator(int index) |
返回list迭代器对象 |
void add(int index, E element) |
集合中指定索引后追加元素 |
E remove(int index) |
根据索引移除集合中元素并返回 |
E get(int index) |
获取指定索引元素 |
E set(int index, E element) |
根据索引修改元素 |
int indexOf(Object o) |
查找指定对象第一次出现的索引,找不到返回-1 |
int lastIndexOf(Object o) |
倒着查找指定对象第一次出现的索引,找不到返回-1 |
List<E> subList(int fromIndex, int toIndex) |
返回截取的子[fromIndex,toIndex)集合 |
ArrayList
- 底层是基于数组形式实现集合操作,所以查询效率高,增删效率低,且线程不安全
- 数组存满后,ArrayList底层就会新开辟一个更大(大50%)的数组,将原数组加入到新数组中,从而实现扩容操作,这样就会产生旧的数组成为垃圾空间,若明知道会超过默认容量(10)建议使用有参构造设置更大容量
方法名 |
描述 |
ArrayList() |
使用默认容量10 |
ArrayList(int initialCapacity) |
使用自定义容量 |
LinkedList
- 底层是基于双向链表的数据结构实现的集合操作,所以查询效率低,增删效率高,且线程不安全
- 存在一个Node的内部类,存放元素信息和指针信息
Vector
方法名 |
描述 |
Enumeration<E> elements() |
获取Enumeration迭代对象 |
- 底层实现集合操作与ArrayList一样的,但是方法都使用了synchronized同步处理机制,所以线程安全,效率低
Stack(栈)
- 方法都使用了synchronized同步处理机制,所以线程安全
方法名 |
描述 |
E push(E item) |
入栈 |
E pop() |
出栈 |
boolean empty() |
检查栈中是否为空 |
E peek() |
返回栈顶元素 |
int search(Object o) |
栈中利用对象equals方法查找数据,栈顶是1,找不到返回-1 |
Queue(单向队列)
操作 |
失败抛出异常 |
失败返回值 |
队尾增加元素 |
boolean add(E e) |
boolean offer(E e) |
队头删除元素 |
E remove() |
E poll() |
查看队头 |
E element() |
E peek() |
Deque(双向队列)
操作 |
失败抛出异常 |
失败返回值 |
队头增加元素 |
void addFirst(E e) |
boolean offerFirst(E e) |
队头删除元素 |
E removeFirst() |
E pollFirst() |
查看队头 |
E getFirst() |
E peekFirst() |
队尾增加元素 |
void addLast(E e) |
boolean offerLast(E e) |
队尾删除元素 |
E removeLast() |
E pollLast() |
查看队头尾 |
E getLast() |
E peekLast() |
迭代器
迭代器体系结构

Iterator
方法名 |
描述 |
boolean hasNext() |
检查是否有下一个元素 |
E next() |
获取当前内容,并且指针下移 |
default void remove() |
删除当前元素 |
ListIterator
方法名 |
描述 |
boolean hasPrevious() |
检查是否有上一个元素 |
E previous(); |
获取上一个元素 |
int previousIndex(); |
获取上一个的元素下标 |
int nextIndex() |
获取下一个元素下标 |
void set(E e); |
修改当前元素 |
void add(E e) |
当前位置添加元素 |
Enumeration
方法名 |
描述 |
boolean hasMoreElements() |
检查是否有下一个元素 |
E nextElement() |
获取当前元素 |
foreach
原理

自定义类要想使用foreach输出,则必须实现<<Iterable>>
接口返回迭代对象,迭代对象又依赖于内部类要实现<<Iterator>>
接口重写hasNext()和next()方法
自定义单项链表实现foreach
public class MyList<T> implements Iterable<T>{
private class Node<T>{
private T date;
private Node<T> next;
private Node(T date){
this.date = date;
}
}
private Node<T> rootNode;
private Node<T> lastNode;
private Node<T> currentNode;
public boolean add(T data){
Node newNode = new Node(data);
if (rootNode == null){
rootNode = newNode;
}else {
this.lastNode.next = newNode;
}
this.lastNode = newNode;
return true;
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>(){
{
MyList.this.currentNode = MyList.this.rootNode;
}
@Override
public boolean hasNext() {
return MyList.this.currentNode != null;
}
@Override
public T next() {
T date = MyList.this.currentNode.date;
MyList.this.currentNode = MyList.this.currentNode.next;
return date;
}
};
}
public static void main(String[] args) {
MyList<String> myList = new MyList<>();
myList.add("1");
myList.add("2");
myList.add("3");
for (String str: myList){
System.out.println(str);
}
}
}
Map(映射)
- 通过键值对形式存储,改键值对是以Map.Entry类型的对象实例存在
- 存储元素特点:无序,键不可重复,值可重复
- 通过键可快速查找到value
方法名 |
描述 |
V put(K key, V value) |
存放键值对,key存在返回旧元素并替换value,key不存在返回null |
V get(Object key) |
通过键对象equals方法,获取值 |
boolean containsKey(Object key) |
通过键对象equals方法,检查是否包含该键 |
boolean containsValue(Object value) |
通过值对象equals方法,检查是否包含该值 |
V remove(Object key) |
通过键对象equals方法,删除键值对,并返回值 |
void clear() |
清空集合元素 |
int size() |
获取键值对数量 |
boolean isEmpty() |
检查集合是否为空 |
void putAll(Map<? extends K, ? extends V> m) |
将集合m中元素添加到当集合(并) |
Collection<V> values() |
获取值集合 |
Set<K> keySet() |
获取键集合 |
Set<Map.Entry<K, V>> entrySet() |
获取Map.Entry接口实例集合形式返回 |
HashMap
- 底层是哈希表数据结构,数组+链表,效率高,线程不安全
- 允许key或value为null,但是key为null只能有一个
- 默认初始化容量是16,二倍扩容,自定义容量建议是2的倍数
LinkedHashMap
- 底层基于哈希表+链表,有序,键不可重复
- 只能存一个null元素
Hashtable
- 底层是哈希表数据结构,效率低,线程安全
- 不允许key和value为null
- 默认初始容量(16)
TreeMap
- 底层是二叉树数据结构,TreeMap集合的key自动排序
- 不允许key为null,允许value为null
Properties
-
线程安全,key和value只能存储字符串
-
不允许key或value为null
方法名 |
描述 |
Object setProperty(String key, String value) |
向Property对象加入键值对 |
String getProperty(String key) |
通过键获取值,获取不到返回null |
String getProperty(String key, String defaultValue) |
通过键获取值,为获取到则是默认内容 |
Set<String> stringPropertyNames() |
获取全部属性名的set集合 |
void store(Writer writer, String comments) |
将Property中的信息输出到writer字符输出流中,comments是写入的注释信息 |
void load(Reader reader) |
将reader字符输入流中的数据读入到Property |
void store(OutputStream out, String comments) |
将Property中的信息输出到out字节输出流中,comments是写入的注释信息 |
void load(InputStream inStream) |
将inStream字节输入流中的数据读入到Property |
Collections(集合工具类)
方法名 |
描述 |
void sort(List<T> list) |
集合自然排序 |
void sort(List<T> list, Comparator<? super T> c) |
集合比较器排序 |
void shuffle(List<?> list) |
集合洗牌 |
void reverse(List<?> list) |
集合逆序 |
boolean addAll(Collection<? super T> c, T... elements) |
向集合c添加多个元素 |
jdk9 后新增方法
为List、Set、Map接口新增了静态工厂方法创建集合的方法集合<E> of(E... elements)
- 只适用于List、Set、Map接口,不适用与实现类
- 返回创建的集合是一个不可改变的集合
- Set、Map集合不能添加重复元素,List可以
函数式接口
用于这些接口作为参数的方法,传入的就是这些接口的Lambda表达式,而这些方法内部调用传入的Lambda表达式实现的接口对象方法,类似于回调函数
Supplier(生产形接口)
@FunctionalInterface
public interface Supplier<T> { T get(); }
Consumer(消费形接口)
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
Predicate(断言形接口)
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
...
}
Function(功能形接口)
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
...
}
Stream流
生成流
要转化的容器 |
生成方式 |
描述 |
散开的元素 |
Stream<T> Stream.of(T ...Values) |
Stream接口的静态方法 |
数组 |
Stream<T> stream(T[] array) |
Arrays工具类的静态方法 |
Collection集合 |
Stream<E> stream() |
Collection接口的默认方法 |
Collection集合 |
Stream<E> parallelStream() |
并行计算流,多核CPU支持 |
Map集合 |
由entrySet、keySet、values方法先得到collection集合 |
转化Collection集合后间接得到 |
中间操作
方法名 |
描述 |
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) |
合并a、b两个流 |
Stream<T> filter(Predicate<? super T> predicate) |
过滤 |
Stream<T> limit(long maxSize) |
截取从0到maxSize个 |
Stream<T> skip(long n) |
跳过n个到最后 |
Stream<T> distinct() |
去重(使用equals方法判断是否重复) |
Stream<T> sorted() |
自然排序 |
Stream<T> sorted(Comparator<? super T> comparator) |
比较器排序 |
转化流操作
方法名 |
描述 |
<R> Stream<R> map(Function<? super T, ? extends R> mapper) |
将T类型流转化为R类型的流 |
IntStream mapToInt(ToIntFunction<? super T> mapper) |
将T类型流转化为IntStream流 |
DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper) |
将T类型流转化为DoubleStream流 |
LongStream mapToLong(ToLongFunction<? super T> mapper) |
将T类型流转化为LongStream流 |
原始流
方法名 |
描述 |
Xxx sum() |
求和 |
XxxSummaryStatistics summaryStatistics() |
获取汇总统计对象 |
Optional
此类主要用途是在方法声明处检测空指向异常
方法名 |
描述 |
static <T> Optional<T> of(T value) |
获取Optional对象,不允许内容是null |
static <T> Optional<T> ofNullable(T value) |
获取Optional对象,允许内容是null,但是调用get方法会报找不到异常 |
public T get() |
获取Optional对象中存储的内容 |
boolean isEmpty() |
判断Optional对象存储内容是否为null,是返回true |
boolean isPresent() |
判断Optional对象存储内容是否为null,是返回false |
终结操作
方法名 |
描述 |
void forEach(Consumer<? super T> action) |
遍历 |
long count() |
统计个数 |
收集操作
方法名 |
描述 |
<R, A> R collect(Collector<? super T, A, R> collector) |
由收集器收集 |
收集器
由Collectors工具类生成Collector收集器
方法名 |
描述 |
static <T> Collector<T, ?, List<T>> toList() |
获取List收集器 |
static <T> Collector<T, ?, Set<T>> toSet() |
获取Set收集器 |
static <T, K, U> Collector<T, ?, Map<K,U>> toMap(Function keyMapper, Function valueMapper) |
获取Map收集器,前面是key的格式,后面的value的格式 |
国际化程序
Locale类
用来描述语言和地区的一个类
Locale locale = new Locale("en","US");
System.out.println(Locale.CHINA);
Locale aDefault = Locale.getDefault();
资源文件
资源读取
Locale locale = new Locale("en","US");
ResourceBundle bundle = ResourceBundle.getBundle("com.Info",locale);
System.out.println(bundle.getString("hollow"));
ResourceBundle bundle = ResourceBundle.getBundle("com.Info");
System.out.println(bundle.getString("hollow"));
文本占位符替换
String str = "你好{0},{1}欢迎来到{1}";
String format = MessageFormat.format(str, "用户", "java世界");
System.out.println(format);
Base64
静态方法
方法名 |
描述 |
static Encoder getEncoder() |
获取加密对象 |
static Decoder getDecoder() |
获取解密对象 |
静态内部类成员方法
Encoder
方法名 |
描述 |
byte[] encode(byte[] src) |
对字符串对应字节数组加密,获取加密后的字节数组 |
String encodeToString(byte[] src) |
对字符串对加密,获取加密后的字节数组 |
Decoder
方法名 |
描述 |
byte[] decode(byte[] src) |
对加密后的字节数组解密 |
byte[] decode(String src) |
对加密后的字符串解密 |
UUID uuid = UUID.randomUUID();
Comments NOTHING