jdk主要数据结构:数组,链表,树(红黑树)
a;基础知识
1:ArrayList,LinkedList 等相关的list集合
ArrayList==》数组实现;LinkedList==》链表
2:HashMap,TreeMap等相关的map集合
HashMap==》数组+链表(转红黑树)Object(hoshcode)==>Map(hash)==>和长度与运算获得数组下标==》下标存在数据(不相同)==》链表(红黑树)
TreeMap==》红黑树实现
3:HashSet,TreeSet等相关的set集合
set==》map集合的key值集合(链表)
4:其他jdk集合基本都是使用 数组,链表,树(红黑树)实现
b;线程,线程安全和线程池
1:线程实现方式
继承 Thread 类和实现 Runnable 接口(没有返回结果)
实现 Callable 接口(可以获取返回结果)
2:线程安全
两个以及两个以上线程共享同一个资源(方法区或者堆内)并且对该资源有更改操作导致获取到的数据不真实,导致后续执行了错误的逻辑操作
解决方法:乐观锁==》版本号控制(cas);悲观锁==》加锁(lock,synchronized)
常用线程安全工具包:详细的可以参见 java.util.concurrent
3:线程池
预计n个线程执行任务,多余任务放入队列,后续发现一边直线任务一边放入队列放,队列放下不了,在增加n个线程执行任务,后来发现还是不能解决问题,想其他办法。
4:线程是cpu指挥的最小单位颗粒(最底层),运行规律和时间都是需要根据cpu实现方式而定,只要有线程在运行java程序就在运行,所以线程都是被动竞争上岗工作,获取上岗工作机会,可以主动放弃上岗工作,有其他线程竞争上岗或者与其他一起再次竞争上岗,也可以上岗后,拖着不工作。
5:其他==》Semaphore、CountDownLatch、 CyclicBarrier,AQS的思想
c;jvm 虚拟机
1:组成部分
程序计数器(控制等),堆(对象等),方法区(类二进制信息等),本地方法栈(native等),虚拟机栈(正在运行方法的地方)
2:自带工具,垃圾回收(监督并清理垃圾,保证虚拟机正常运行)
垃圾定义:没有被别人使用也就是对外引用为0或者找不到根节点
回收的方法:先标记需要回收的垃圾,然后回收==》这一块,那一块==》内存随便化
分出两大片区域==》当正在使用的地方用完以后,就把非垃圾复制过去,清空当前区域==》空间利用率太低