欢迎评论区纠错和建议,祝大家伸手就是大厂offer~
一、Java基础
1.==和equals()的区别
==比较基本类型的值,equals比较引用类型的地址
equals是Object的方法,底层还是==实现的,但是有的类重写了equals方法,例如string,重写之后比较的值,如果重写了equals一定要重写hashcode,如果只重写equals不重写hashCode,会在某些场景下导致程序异常执行,也会降低hash类型的集合的效率
2.HashMap原理
HashMap在JDK1.7采用数组 链表实现 HashMap在JDK1.8采用数组 链表 红黑树实现,key不可重复可以为null,线程不安全
扩容机制 默认容量为16,负载因子为0.75,当HashMap中元素个数超过容量*负载因子的时候,数组长度变为两倍,数组长度达到64,链表长度达到8的时候扩容为红黑树
put过程
- 对key的hashCode()进行hash运算,得到index
- 如果没碰撞就放入bucket里
- 如果碰撞了就放到链表末尾
- 如果碰撞导致链表过长就转换为红黑树
- 如果节点已经存在就替换旧的value
- 如果bucket满了就resize(扩容检测)
get过程
- 对key的hashCode()进行hash运算,得到index
- 如果bucket第一个节点命中,直接返回
- 如果有冲突,需要key.equals(k)去查找对应的entry
- 如果是树,在树中查找O(logn)
- 如果是链表,在链表中查找O(n)
3.ConcurrentHashMap
线程安全的hashmap JDK1.7 使用分段锁,一个map分为16段,每一段是单独的hashmap,每次使用对其中一段加锁 JDK1.8 采用CAS Synchronized保证线程安全,插入采用cas版本标记,在其他线程没有操作的时候扩容,删除的时候使用Synchronized去保证并发删除
4.HashMap和HashTable的区别
- hashtable每个方法都用Synchronized修饰,线程安全但是效率低
- hashtable的key不可以null,hashmap可以有一个null的key
- hashtable对key只做一次hash,hashmap做两次hash
- hashtable底层是数组 链表
5.ArrayList和LinkedList的区别
arraylist是动态数组,满了之后new一个1.5倍的大小,将原来的copy过来,数组查找快,删除慢 linkedlist是链表实现,查找慢,添加数据快
6.如何保证ArrayList的线程安全
- 采用collentions.synchronizedList()给arraylist加锁
- 使用Vector,底层和array一样,但是每个方法都加锁,效率低
- 使用juc的CopyOnWriterArrayList,该类读不加锁,写创建了一个副本,写完修改指针
7.String、StringBuffer、StringBuilder区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。
StringBuffer可变并且线程安全
StringBuiler可变但线程不安全。
操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer。
8. instanceof关键字的作用
判断一个对象是否是一个类的实例
代码语言:javascript复制boolean res = obj instanceof Class
其中obj为一个对象,如果obj是class的对象或者直接间接继承这个类或者实现了这个接口,就会返回true 否则返回false
9. java创建对象的方式
new 反射 clone方法 反序列化
10.说说java中的IO流
按照流向分:输入流和输出流 按照操作单元分:字节流和字符流 按照角色分:节点流和处理流