欢迎光临散文网 会员登陆 & 注册

日期/List/Set

2022-07-29 23:50 作者:剑离我离  | 我要投稿

日期

获得当前时间戳

System类中的currentTimeMillis() ;

Date类

两个构造器的使用

两个方法的使用:toString() : 显示当前的年、月、日、时、分、秒; 

getTime():获得当前Date对象对应的毫秒数;


SimpleDateFormat

格式化--- 解析,格式化的逆过程

按照指定的方式格式化和解析

// 格式化

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Calender 日历类

  1. 实例化:调用静态方法:getInstance();

  2. 常用方法:

get():

set():

add():

getTime():

setTime():

JDK8 日期api

不可变性

LocalDate();

LocalTime();

LocalDateTime();

now() ; // 获取当前的日期、时间、日期+时间

of(); // 设置指定的年月日时分秒;没有偏移量

 

Comparble 和Comparator

  1. 像String、包装类等实现了Comparable接口,重写了compareTo()方法。

  2. 对于自定义类来说,需要排序,我们可以让自定义类实现Comparable方法;

  3. 返回正数,前面的比较大

对比:

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 新特性:

可重复注解:

  1. 在MyAnnotation上声明@Repeatable,成员值为@MyAnnotations.class

  2. 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();

  • 定制排序相同


日期/List/Set的评论 (共 条)

分享到微博请遵守国家法律