1 面试知识点

1 String Stringbuilder StringBuffer的区别?
(1)String 和stringBuffer是线程安全的,而stringBuilder是线程不安全的
(2)String是不可变的,而stringbuffer和Stringbuilder是可变的
(3)三者都是final修饰的,不可被继承
(4)String是不可变的,因此,在字符串拼接的时候会创建新的对象

2 String为什么是不可变的?
(1)chars[] offset count 这三个都是final修饰的且没有get set 方法。因此,不能在原有的对象上进行修改。

3 重写 重载 
重写:子类继承父类,重写父类的方法
两同 两小 一大
函数名和参数相同  返回值范围 异常范围小于等于父类 子类的可见性大于等于父类
重载:方法名相同,参数的类型和个数不同

4 封装 继承 多态 抽象
封装:因此,类的内部实现细节。
继承:子类继承父类的属性和方法,提高代码的重用
多态:接口多个类实现,重载和重写
抽象:做了什么和怎么做分离,接口和抽象类

5 接口和抽象类的区别
(1)接口可以实现多继承,而类是单继承
(2)接口中不能有普通的成员变量,而抽象类可以有普通的成员变量
(3)抽象类中可以有静态方法,接口中不能有静态方法

6 ArrayList和LinkedList区别
(1)ArrayList基于数组,LinkedList基于双向循环链表
(2)ArrayList支持随机访问,LinkedList不支持
(3)LinkedList可以用作栈和队列
(4)ArrayList寻址效率高,而插入、删除速度慢, 而LInkedlist正好相反。
        (1)ArrayList插入速度慢要分情况,如果是add(index,element)设计到数组的移动肯定慢
        (2)如果插入尾部,不扩容那么就是O(1),如果设计到扩容,会创建一个1  把原来的数组复制到另一个内存空间更大的数组中
           2 把新元素添加到扩容以后的数组中


7 fast-to-fail机制
在遍历集合的过程中,对集合进行了个修改,遍历立马停止,报异常。以免出错。

8 hashMap的put和get的过程
put()
(1)判断数组是否为空,如果为空则resize()初始化.否则,计算hash(key)求得插入的位置
(2)查看要插入的位置数组元素是否为空,如果为空,则直接插入,如果不为空
(3)判断,插入的元素的key的hash值和要插入位置的元素的key的hash值是否相等。如果,相等,则覆盖,否则就要插入到链表或红黑树中
(4)插入的是链表,如果key存在则覆盖,否则,插入
(5)如果链表长度超过8,则转为红黑树
get()
(1)如果数组长度为0 或者数组中没有元素则返回Null
(2)对数组的中元素进行判断,hash值相等,equal相等则返回(毕竟存在冲突并没有那么多,所以,头结点都要判断)
(3)否则,就需要在链表或者红黑树中查找了。

9 为什么hashmap的长度是2^n
因为h &(length-1)正好是对Length的取余,并且这种操作比取余快。

10 hashset的底层是hashMap,如何实现去重的
HashSet概述和实现
HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变,此类允许使用null元素。 
在HashSet中,元素都存到HashMap键值对的Key上面,而Value时有一个统一的值private static final Object PRESENT = new Object();,(定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。)

HashSet插入
当有新值加入时,底层的HashMap会判断Key值是否存在(HashMap细节请移步深入理解HashMap),如果不存在,则插入新值,同时这个插入的细节会依照HashMap插入细节;如果存在就不插入

11 红黑树
(1)根节点为黑色节点
(2)没有两个连续的红色节点
(3)任意节点到其子树的根节点的黑色节点的个数相同
(4)所有的叶子节点都是黑色的,且为空
红黑树保证了最长的路径不会超过其他路径的2倍。 我们知道根节点到每个叶子节点的黑色节点的数目相同,假设为n个,那么红色节点最多为n-1个,最少为0个
也就是节点数目2n-1和n路径条数2(n-1) n-1最大也只为2倍

12 判断两个对象是否相等
(1)hashcode
(2)equal
如果,我们只重写了equal。hashset可能会存入两个相等的对象。因为,我们定义equal判断两个对象是相等的,把这两个对象put到hashSet 中,首先进行hashcode判断,这两个对象是不等的,会存到不同的位置。这就导致
hashset存入了两个相等的对象

13 BIO NIO AIO
阻塞和非阻塞:线程是否会被阻塞
同步和异步:同步IO的处理是在应用线程中执行,而异步是IO的处理完全的交给操作系统来执行,只用接受结果
NIO
把IO请求注册到多路复用的选择器上,选择器轮询这些IO请求的管道,如果某些管道发生了读或者写操作,这些管道就处于就绪状态,多路选择器
会做个处理这些处于就绪状态的请求,并把处理结果返回给客户端。

14 引用类型
(1)强引用:强引用存在对象不会被回收
(2)软引用:内存满了,会被回收
(3)弱引用:GC的时候被回收
(4)虚引用:没有任何印象,可以监听对象的回收

15 system.gc 和system.finalize()
 system.gc getruntime.gc()是否进行垃圾回收,要看JVM的安排
Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作

16 双亲委托机制
子类加载器在加载的过程中,先询问父类加载器能否加载该类,如果父类加载器能加载,就交给附列加载器加载
好处:
(1)如果没有双亲委托机制,每个类加载器都自行加载的话,如果用户自己写了Object类,那么系统中会出现多个Object类,会造成混乱
(2)jdk开发人员提供的类的代码质量,肯定要优化我们自己写

17 ThreadLocal
每个线程都维护一个thredLocalMap(ThreadLocal,value),ThreadLocal是弱引用,因此会造成内存泄漏

发布了146 篇原创文章 · 获赞 91 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/A1342772/article/details/102245137