1.lambda表达式 2.默认方法 3.Steam流
lambda表达式的使用条件 :接口中有且只有一个抽象方法
双亲委派机制,为了保证一个类只加载一次
1.引导类:设计好的类在jdk跟目录下:rt.jar
2.扩展类:设计好的类在jdk/ext目录下的jar包里面
3.应用类:开发者自定义类
Set代表无序的,元素不可重复的集合
List代表有序的,元素可重复的集合
ArrayList是基于数组,linkedList是基于双向链表对于随机访问ArrayList是优于linkedList,ArrayList是通过下标以O(1)时间的复杂度进行随机访问,
而linkedList的每一个元素都依靠指针和它后一个元素连接在一起,查找某个元素的时间复杂度度是O(N)对于插入和删除操作,linkedList要优于ArrayList,因为当元素被添加到linkedList任意位置的时候,不需要
像ArrayList那样重新计算大小或者是更新索引linkedList比ArrayList更占空间,因为linkedList的节点除了存储数据,还需要存储两个索引,pre指向前
一个元素,next指向后一个元素
有哪些线程安全的List
Vector :跟ArrayList差不多,ArrayList是线程不安全的,Vector是线程安全的
线程 创建线程有几种方式创建线程我们常用的两种方式:继承Thread类,实现Runnable接口
通过继承Thread类来创建并启动线程的步骤如下
定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体.创建Thread子类的实例,即创建了线程对象调用线程实例对象的start()方法来启动该线程调用start()方法,启动线程,主要是调用其中的start0()方法,实现多线程,底层由JVM调取start0()
通过实现Runnable接口来创建并启动线程的步骤如下定义Runnable的实现类,并实现该接口的run()方法,该run方法作为线程的执行体创建Runnable实现类的实例对象,并将其作为Thread的target来创建Thread对象,Thread对象为线程对象调用线程对象的start()方法来启动线程
两种方法的区别:
实现Runnable接口
- 实现Runnable接口,类还可以继承其他类
- 实现Runnable接口,多线程可以共享一个target对象,适合多个线程来处理同一份资源
- 编程复杂
继承Thread类
- 编写简单
- 由于继承了Thread类,所以不能继承其他类
小结:一般采取实现Runnable接口来创建多线程
说说Thread类的常用方法
Thread类常用构造器
Thread()Thread(String name)Thread(Runnable target)Thread(Runnable target,String name)
其中,参数name为线程名,参数target为包含线程体的目标对象
Thread类常用静态方法currentThread(): 返回当前正在执行的线程sleep(long millis): 使当前执行的线程睡眠多少毫秒
Thread类常用实例方法getId(): 返回该线程的idgetName(): 返回该线程的名字setDaemon(boolean on): 将该线程标记为守护线程,默认为非守护线程
run()和start()有什么区别
run()方法为线程的执行体,它的方法体代表了线程需要完成的任务,而start()方法是用来启动线程.调用start()方法启动线程时,系统调用start0()方法,把run()方法当成线程执行体来处理,但如果直接调用run()方法,则run()方法会立即被执行,也就是说系统会把线程对象当做一个普通对象,
run()方法当做一个普通方法,而不是线程执行体
线程是否可以重复启动



