java学习八股之java基础-hashmap-io

2023-08-10 16:00:48 浏览数 (3)

欢迎评论区纠错和建议,祝大家伸手就是大厂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过程

  1. 对key的hashCode()进行hash运算,得到index
  2. 如果没碰撞就放入bucket里
  3. 如果碰撞了就放到链表末尾
  4. 如果碰撞导致链表过长就转换为红黑树
  5. 如果节点已经存在就替换旧的value
  6. 如果bucket满了就resize(扩容检测)

get过程

  1. 对key的hashCode()进行hash运算,得到index
  2. 如果bucket第一个节点命中,直接返回
  3. 如果有冲突,需要key.equals(k)去查找对应的entry
  4. 如果是树,在树中查找O(logn)
  5. 如果是链表,在链表中查找O(n)

3.ConcurrentHashMap

线程安全的hashmap JDK1.7 使用分段锁,一个map分为16段,每一段是单独的hashmap,每次使用对其中一段加锁 JDK1.8 采用CAS Synchronized保证线程安全,插入采用cas版本标记,在其他线程没有操作的时候扩容,删除的时候使用Synchronized去保证并发删除

4.HashMap和HashTable的区别

  1. hashtable每个方法都用Synchronized修饰,线程安全但是效率低
  2. hashtable的key不可以null,hashmap可以有一个null的key
  3. hashtable对key只做一次hash,hashmap做两次hash
  4. hashtable底层是数组 链表

5.ArrayList和LinkedList的区别

arraylist是动态数组,满了之后new一个1.5倍的大小,将原来的copy过来,数组查找快,删除慢 linkedlist是链表实现,查找慢,添加数据快

6.如何保证ArrayList的线程安全

  1. 采用collentions.synchronizedList()给arraylist加锁
  2. 使用Vector,底层和array一样,但是每个方法都加锁,效率低
  3. 使用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流

按照流向分:输入流和输出流 按照操作单元分:字节流和字符流 按照角色分:节点流和处理流

0 人点赞