日期/List/Set
日期
获得当前时间戳
System类中的currentTimeMillis() ;
Date类
两个构造器的使用
两个方法的使用:toString() : 显示当前的年、月、日、时、分、秒;
getTime():获得当前Date对象对应的毫秒数;
SimpleDateFormat
格式化--- 解析,格式化的逆过程
按照指定的方式格式化和解析
// 格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Calender 日历类
实例化:调用静态方法:getInstance();
常用方法:
get():
set():
add():
getTime():
setTime():
JDK8 日期api
不可变性
LocalDate();
LocalTime();
LocalDateTime();
now() ; // 获取当前的日期、时间、日期+时间
of(); // 设置指定的年月日时分秒;没有偏移量
Comparble 和Comparator
像String、包装类等实现了Comparable接口,重写了compareTo()方法。
对于自定义类来说,需要排序,我们可以让自定义类实现Comparable方法;
返回正数,前面的比较大
对比:
Comparble 是较为永久的,写在类中的;保证实现类的对象在任何位置都可以比较大小。
Comparator : 匿名的、临时性的比较。
得到系统版本:System.out.println(System.getProperty("os.version"));
大数、四舍五入 BigDecimal ; 属性:ROUND_HALF_UP
枚举
类的对象只有有限个,确定的;
当需要定义一组常量时,建议使用枚举类
如果只有一个对象,则可以作为单例模式的实现方式
如何定义枚举类
方式一:
JDK5.0之前
方式二:使用enum 关键字来定义
常用方法:
toString();// 不是继承于Object的,是继承于Enum的toString() 方法
values();// 返回对应的枚举的数组
valueOf(String name ); // 返回枚举类中对象名是name的对象,如果没有,则抛异常。
实现接口:
每个对象都去实现接口中的方法;
注解
生成文档相关的注解

自定义注解

// 参照@SuppressWarnings 定义
1. 注解声明为:@interface
2. 内部定义成员,通常用value表示
3. 可以指定成员的默认值,可以用default定义
4. 如果自定义注解没有成员,表明是一个标识作用
如果注解有成员,在使用注解时,需要指明成员的值
元注解
对现有的注解进行解释说明的注解
Retention : 指定所修饰的Annotation 的生命周期:SOURCE/CLASS(默认行为)/RUNTIME
只有声明为RUNTIME生命周期的注解,才能通过反射获取。
Target:用于指定被修饰的Annotation能用于修饰哪些程序元素。
自定义注解通常都会指定以上两个元注解。
Documented:表示所修饰的注解在被javadoc 解析时,保留下来。
Inherited:被它修饰的Annotation 将具有继承性
JDK8 新特性:
可重复注解:
在MyAnnotation上声明@Repeatable,成员值为@MyAnnotations.class
MyAnnotation的Target和Retention和MyAnnotations相同
类型注解:
ElementType.TYPE_PARAMETER : 表示该注解能写在类型变量的声明语句中(如:泛型声明)
ElementType.TYPE_USE : 表明该注解能写在使用类型的任何语句中
集合
Iterator
集合元素的遍历操作,迭代器
迭代器有remove() 方法:如果还未调用next()或在上一次调用next方法之后已经调用了remove方法,再调用remove都会报illegalStateException ;
List接口
面试题:ArrayList、LinkedList、Vector 三者的异同?
同:三个类都是实现了List接口,存储数据特点相同:存储有序、可重复的数据
ArrayList : 作为List接口的主要实现类,线程不安全的,效率高。底层使用Object[] 存储
LinkedList:底层使用双向链表存储。适用频繁的插入、删除操作。
Vector:作为古老实现类,线程安全的,效率低。底层使用Object[] 存储
ArrayList
jdk7 :
初始化,底层创建了长度是10的Object数组;建议使用带参的构造器
扩容:扩容为1.5倍
jdk8:
new对象时,底层初始化为{},在第一次调用add()方法的时候才造这个对象。延迟了数组的创建,节省了内存。
LinkedList
LinkedList list = new LinkedList<>() ; // 内部声明了node类型的first和last属性,默认值为null
区分List中remove(int index) 和 remove(Object obj) : 如果可以不装箱,那就没有必要去装箱
Set
HashSet:线程不安全,可以存储null值
无序性:不等于随机性;存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的。
不可重复性:保证添加的元素按照equals()判断时,不能返回true;
向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值;此时哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:
如果此位置上没有其他元素,则元素a添加成功。
如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:
如果 hash值不相同,则元素a添加成功
如果hash值相同,进而需要调用元素a所在类的equals()方法: 返回true,添加失败;
对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储:七上八下
向Set中添加的数据,其所在类一定要重写hashCode()和equals();重写的hashCode()和equals()尽可能保持一致性:相等的对象必须具有相等的散列码
LinkedHashSet:作为HashSet的子类:遍历其内部数据时,可以按照添加的顺序遍历;对于频繁的遍历操作,其效率高于HashSet();
TreeSet:可以按照添加对象的指定属性,进行排序。
自然排序中,比较两个对象是否相同的标准为:compareTo() 返回0,不再是equals();
定制排序相同