模拟面试题(一)
object的方法有哪些?notify和notifyAll的区别?
clone()函数的用途是用来另存一个当前存在的对象(浅拷贝)
equals()用于确认两个对象是否相同。
hashCode()用于获取对象的哈希值。 哈希值相同的对象不一定equals(),equals()返回true的两个对象一定相同。
notify:只会唤醒等待该锁的其中一个线程。
notifyAll:唤醒等待该锁的所有线程。唤醒所有处于 wait 状态的线程,使其重新进入锁的争夺队列。
toString()返回一个String对象
getClass()返回此Object的运行时类
wait()用于让当前线程失去操作权限,当前线程进入等待序列
finalize() 当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象
final、finally、finalize的区别
1.final修饰的类,不可被继承,修饰的方法不可被重写,修饰的变量不可多次赋值。通过final能够得到性能上的优化,但是不明显,如果大量使用可能会干扰代码,不能表达出本来具有的含义。故不使用。匿名内部类,访问局部变量要求传入的参数,必须是final是要保证数据一致性问题。
2.finally。代码中总是会执行的代码段。除了退出虚拟机外。
3.finalize。在虚拟机回收该对象前进行调用。此种方式不可取。因为java虚拟机不知道在什么时候才对对象进行回收。
hashmap底层结构,链表存在的意义是什么?为什么要用链表和红黑树而不是直接用红黑树?
JDK1.7数组+链表存储,HashMap的内部是一个数组,数组的每个元素都是一个单向链表,链表节点是Entry实例,Entry实例包含四个属性,Key、Value、hash值和指向下个元素的next指针
JDK1.8 数组+链表/红黑树 在链表中的元素超过8个,链表会转成红黑树,以减少检索时间。链表的开销o(n) 红黑树开销o(logn)。
特殊情况下二叉查找树会转成链表,遍历查找退化成o(n),当长度大于8时会使用红黑树
之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来
使用链表结构一样了,造成很深的问题),遍历查找会非常慢。红黑树在插入新数据后可能需要通过左旋,右旋、变色这些操作来保持平衡,我们知道红黑树属于平衡二叉树,但是为了保持“平衡”是需要付出代价的,但是该代价所损耗的资源要比遍历线性链表要少,所以当长度大于 8 的时候,会使用红黑树,如果链表长度很短的话,根
本不需要引入红黑树,引入反而会慢。
hashmap是否是线程安全的,为什么?如果是你你会怎么保证线程安全?
第一,如果多个线程同时使用put方法添加元素。
假设正好存在两个put的key发生了碰撞(hash值一样),那么根据HashMap的实现,这两个key会添加到数组的同一个位置,这样最终就会发生其中一个线程的put的数据被覆盖。
第二,如果多个线程同时检测到元素个数超过数组大小*loadFactor。
这样会发生多个线程同时对hash数组进行扩容,都在重新计算元素位置以及复制数据,但是最终只有一个线程扩容后的数组会赋给table,也就是说其他线程的都会丢失,并且各自线程put的数据也丢失。且会引起死循环的错误。
第一种方法:
Hashtable,但是当一个线程访问HashTable的同步方法时,其他线程如果也要访问同步方***被阻塞住。举个例子,当一个线程使用put方法时,另一个线程不但不可以使用put方法,连get方法都不可以,效率很低,现在基本不会选择它了。
第二种方法: HashMap可以通过下面的语句进行同步,
Collections.synchronizeMap(hashMap);
HashMap可以通过Map m = Collections.synchronizedMap(new HashMap())来达到同步的效果。(从源码中看出 synchronizedMap()方法返回一个SynchronizedMap类的对象,而在SynchronizedMap类中使用了synchronized来保证对Map的操作是线程安全的,故效率其实也不高。)
具体而言,该方法返回一个同步的Map,该Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
第三种方法:
使用ConcurrentHashMap。
synchronized和lock的区别?性能差别?
同: 都是保护线程安全的,都可以保证可见性,都是可重入的
不同:使用方法不同、加锁顺序不同、Synchronized 锁不够灵活,只能被一个线程使用,lock锁可以被多个持有(如读写锁)
minor GC和fullGC用的垃圾回收算法、为什么新生代是复制?老年代是标记清除?
写个sql语句;
最左匹配原则,为什么是最左匹配?
b+树一般一个节点有几个子节点?b+树有几层?为什么?
聚簇索引和非聚簇索引的区别,为什么要非聚簇索引
什么是事务?如何实现事务?
TCP三次握手四次挥手,为什么要有time_wait?
一次http请求会发生什么?访问顺序是怎么样的?本地DNS服务器在第几位?(存疑)
https为什么安全?证书有没有可能不安全?http连接过程?
http状态码有哪几种,各代表什么意思?
你怎么理解websocket协议的?
了解过长链吗?了解过其他类似websocket协议的其他协议吗?