7.29

日期

获得当前时间戳

System类中的currentTimeMillis() ;

Date类

两个构造器的使用

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

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

public void test2() {
    //构造器一:创建一个对应当前时间的Date对象
    Date date1 = new Date() ;
    date1.toString();
    date1.getTime();
    
    //创建指定毫秒数的Date对象
    Date date2 = new Date(long time) ;
    
    //如何将java.utile.Date 对象转换成 java.sql.Date 对象
    Date date6 = new Date();
    java.sql.Date date7 = new java.sql.Date(date6.getTime());
    
}

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之前

class Season() {
    //1. 声明Season 对象的属性:private final 修饰;
    private final String seasonName ; 
    private final String seasonDesc;
    
    //2. 私有化类的构造器,并给对象属性赋值
    private Seanson(String seasonName,String seasonDesc){
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    
    // 3.提供当前枚举类的多个对象: public static final 的
    public static final Seanson xxx = new Season(xxx,xxx) ; 
    
    //4 其他诉求:获取枚举类对象的属性
}

方式二:使用enum 关键字来定义

常用方法:

  • toString();// 不是继承于Object的,是继承于Enum的toString() 方法

  • values();// 返回对应的枚举的数组

  • valueOf(String name ); // 返回枚举类中对象名是name的对象,如果没有,则抛异常。

实现接口:

每个对象都去实现接口中的方法;

enum Season1{
    // 1.创建当前枚举类的对象,多个对象之间用”,“隔开,末尾对象”;“结束
    SPRING("xxxx","xxx"),
    SUMMER("xxxx","xxxx"),
    AUTUMN("xxxx","xxxx");
}

注解

生成文档相关的注解

自定义注解

// 参照@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()尽可能保持一致性:相等的对象必须具有相等的散列码

public void test3() {
    HashSet set = new HashSet() ;
    Person p1 = new Person(1001,"AA");
    Person p2 = new Person(1002,"BB");
    
    set.add(p1);
    set.add(p2);
    
    p1.name = "CC"; 
    // 将p1的值改变,但是没有重新计算哈希值,其原哈希值仍然是用"AA"算出来的
    //修改了属性后,仍然是放在原位置
    set.remove(p1);// 此时计算哈希值,用的name是cc,因此,没有删成功
    System.out.println(set) ;//输出p1和p2
    
    set.add(1001,"CC"); // 此时加的时候是拿CC计算的哈希值去放的,因此,可以添加成功,且是放在数组上的
    System.out.println(set) ;// 输出三个
    set.add(1001,"AA"); // 添加成功,此时计算出来哈希值,放在原p1的数组位置上,再调用equals()方法,因为不相等,再用链表挂上
    System.out.println(set) ; // 输出四个
}

class Person{
     //重写了equals和hashcode
    int id;
    String name ; 
    
}

LinkedHashSet:作为HashSet的子类:遍历其内部数据时,可以按照添加的顺序遍历;对于频繁的遍历操作,其效率高于HashSet();

TreeSet:可以按照添加对象的指定属性,进行排序。

  • 自然排序中,比较两个对象是否相同的标准为:compareTo() 返回0,不再是equals();

  • 定制排序相同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

剑轩~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值