一、学习内容
1.类间关系及UML表示
2.Java集合
1) Java集合总体框架
2) collection接口、Iterable接口
定义:
collection接口继承了Iterable接口,Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素(此处进行举例)。
使用迭代器进行遍历的例子:
下面具体了解Iterable接口,它的成员方法如下表所示:
除了iterator()是JDK 1.5开始就有的,后两个方法是Java 8新添加的,default修饰符也是Java 8新添加的。被default修饰的方法可以不必由子类实现并且由default修饰的方法在接口中有方法体。
List、Set总结
3) 关于collection集合的选择
4) Map接口
HashMap和HashTable之间的异同:
l HashMap和HashTable都是 无序的,TreeMap是有序的
l HashTable是线程同步的(HashTable的源码中,除了构造方法,所有public方法声明中都有synchronized关键字,但是HashMap源码中并没有,synchronized是用来完成多线程条件下同步工作的),HashMap不是线程同步的,因此HashTable是线程安全的,但是HashMap不是线程安全的
l HashMap的效率较高,HashTable的效率较低
5) 允许值为null的集合
HashSet和LinkedhashSet都允许存在null数据
3.线程
1) 线程与进程
进程是操作系统调度和调配资源的基本单位,而线程是比进程更小的执行单位,每个线程拥有自己的栈和寄存器等资源数据,多个线程之间共享进程的代码数据和文件
2) 线程的优点
创建线程的代价比创建进程的代价小
切换线程的代价比切换进程的代价小
充分利用多处理器
数据共享使线程之间的通信比进程之间的通信更高效
系统繁忙的情况下。进程通过独立的线程及时响应用户的输入
3) Java中实现线程的3种方式
继承Thread类
实现Runnable接口
实现Callable接口
4) 多线程同步
线程同步:当有一个线程在对内存进行操作的时候,其他线程都不可以对这个内存进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。
线程同步的方法:
同步方法:用synchronized修饰方法,eg:public synchronized void save(){},注:synchronized也可以修饰静态方法,如果调用该静态方法将会锁住整个类
同步代码块:用synchronized修饰语句块 eg: synchronized(){}
使用特殊域变量(volatile)实现线程同步:
l volatile关键字为域变量的访问提供了一种免锁机制
l 使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
l 每次使用改域就要重新计算,而不是使用寄存器的值
l volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
使用重入锁实现线程同步:ReentrantLock类是可重入、互斥、实现了Lock接口的锁,它的常用的方法有:ReentrantLock():创建一个ReentrantLock实例 lock():获得锁 unlock():释放锁
使用局部变量实现线程同步:如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。ThreadLocal类的常用方法:
ThreadLocal():创建一个线程本地变量 get():返回此线程局部变量的当前线程副本中的值 initialValue():返回此线程局部变量的当前线程的“初始值” set(T value):将此线程局部变量的当前线程副本中的值设置为value
二、存在的问题
HashMap的工作原理
TreeSet的两种比较方式(自然排序、比较器排序)
三、明天学习计划
文件读写、jvm性能优化