【1】ArrayList 和LinkedList
(1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构
(2)对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
(3)对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
【2】B树
(1)一颗m阶的B树,每个节点最多有m个孩子。
(2)除根结点和叶子节点意外,每个节点最少有[m/2]个
(3)若根节点不是叶子节点,至少有2个孩子。
(4)所有叶子节点都出现在同一层,叶子节点
(5)每个非叶子节点,都包含有n个关键字的信息。关键字按照升序排列。关键字的个数最少有;[m/2]-1.
【3】B+树
(1)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。
(2)所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息)
【4】B+树比B树好的原因
(1)B +tree的磁盘读写代价更低。如果把一个内部节点的关键字放在同一个盘快种,那么盘快容纳的关键字更多,一次IO就会更多
(2) 可以在叶子节点,范围查找。项目种范围查找很多。
(3)不采用红黑树的原因,红黑树是二叉树,数的高度很高。logN。
索引建立每次都可以申请一个新的页,保存节点,这样。每个树的最终
推荐链接 https://blog.youkuaiyun.com/v_JULY_v/article/details/6530142/
https://www.cnblogs.com/xyxxs/p/4440187.html
【5】
各种排序算法的考虑
【6】Synchronized vs Lock
1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类;
2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;
3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
4.用synchronized关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
6.Lock锁适合大量同步的代码的同步问题,synchronized锁适合代码少量的同步问题。
ReentrantLock获取锁定与三种方式:
a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
c)tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断。
注意:当一个线程获取了锁之后,是不会被interrupt()方法中断的。因为本身在前面的文章中讲过单独调用interrupt()方法不能中断正在运行过程中的线程,只能中断阻塞过程中的线程。
3、在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;
【7】HTTP状态码
【8】写线程的不同的方法
(1)
【9】JVM内存溢出的种类
可以看出有两种异常状况::
OutOfMemoryError
StackOverflowError
其中OutOfMemoryError是在程序无法申请到足够的内存的时候抛出的异常,StackOverflowError是线程申请的栈深度大于虚拟机所允许的深度所抛出的异常
【10】什么是线程安全:
多线程环境下,多线程访问某一个类时,这个类始终都能表现出正确的行为,那么这个类就是线程安全的。
【11】重载和重写的区别
【12】Hashmap是线程安全的吗?
(1)hashmap的全部考点