1. List和Set的区别
List有序,可重复,允许null,可以指定下标获取元素。
set无需,不重复
2.ArrayList和LinkedList区别?
- 底层数据结构不同。ArrayList-数组,LinkedList-链表
- 适用场景不同。Arraylist-随机查找,LinkedList-增删
- LinkedList实现Deque,能当队列使用。
3. 重载和重写的区别
- 重载:同一个类,方法名一样,参数类型,个数,顺序不同。返回类型和修饰符可以不同,发生在编译阶段。
- 重写:父子类,方法名,参数列表必须相同。返回类型<=父类,抛出异常<=父类,修饰符>=父类。
private不能重写。
4. hashCode和equals的关系
- 都是Object方法。
- 每个对象都有自己的哈希值,类似指纹。
hashCode不同,对象不同。
hashCode相同,对象可能相同。
对象相同,hashCode相同。 - 集合比较对象是否相等,会用到hashCode比较,相同,再用equals比较。
5 String,StringBuffer,StringBuilder
- String 常量,不变。
- StringBuffer,线程安全
- StringBuilder,线程不安全
6. 泛型中extends,super的区别
- <? extends T>表示包含T在内的任何的T的子类。
- <? super T>表示包含T在内的任何T的父类。
7. Jdk1.7-Jdk1.8 HashMap发生了什么变化?
- jdk1.7=数组+链表,jdk1.8=数组+链表+红黑树
8 深拷贝和浅拷贝
- 浅拷贝:只会拷贝基本数据类型,以及引用对象的地址,指向同一个对象。
- 深拷贝:即会拷贝基本数据类型的值,也会对引用对象进行复制,指向不同的对象。
9 HashMap的put方法
- 根据key通过hash算法与运算得出数组下标
- 如果数组下标的元素为空,则将key,value封装成entry(1.7)Node(1.8),并放入该位置
- 如果数组下标的元素不为空。分成三种情况:
a. jsk1.7,判断是否需要扩容,不需要则头插法添加到链表中。
b. jdk1.8,判断当前位置是链表还是红黑树- 如果是红黑树Node,先判断红黑树是否存在该key,存在则更新,不存在则添加到红黑树中。
- 如果是链表结构,判断链表是否存在该key,存在则更新,不存在则尾插法存入链表。
- 插入后,在判断是否需要扩容。
10. HashMap扩容机制
- 先生成数组。
- 重新根据key通过hash算法和运算生成数组下标。把旧数据迁移到新数组上。
- 迁移完后,把新数组赋值给HashMap对象的table属性。
11 CopyOnWriteArrayList的底层原理?
- 线程安全。读操作-原数组,写操作-复制一个新数组上操作
- 写操作会加锁。
- 写操作完成后,原数组地址指向新数组。
- 适合读多写少的场景。
12 什么是字节码?有什么作用?
- javac编译后class文件。
- 一次编译到处运行,只要有jre环境,就可以运行。具有跨平台的作用。
13 Java的异常
- 所有异常的顶级父类Throwable
- Throwable有Exception和Error 2个子类
- Error子类:StackOverFlowException和OutOfMemoryError。比较严重的错误。
- Exception子类:NullPoinerException,illegalAccessException。
14 类加载器有哪些?
- BootStrapClassLoader-lib下的jar包和class文件
- ExtClassLoader-lib/ext下的jar包和class文件
- AppClassLoader -自定义加载器,加载classpath下的jar包和class文件
15 双亲委派机制?
加载一个类时,先从AppClassLoader查询该类是否已经加载过,如果没有,则找父级ExtClassLoader,也是判断是否加载过,如果没有再找父级BootStrapClassLoader,如果没有加载过,则判断是否可以加载,如果不能,再找子级ExtClassLoader,再找AppClassLoader。
![](https://img.haomeiwen.com/i10601893/784a371219cc43bf.png)
16 JVM内存共享区
堆和方法区
17 JVM线程隔离数据区
虚拟机栈,本地方法栈,程序计数器
18 项目如何排查JVM问题
宕机
- JVM参数内存溢出时自动生成dump文件,再用MAT软件分析。
- 应用/中间件日志
- 服务器的日志,var/message文件
线上 - JMap查看各个区域的内存使用情况。
- JStack查看各个线程阻塞,死锁情况。
- JStat查看GC的情况。是否频繁GC,年轻代还是老年代。
- 查看占用CPU最多的线程。Top命令。
- 阿里的分析软件。arthas
19 一个对象从加载到GC,经历了哪些过程?
- 把字节码加载到方法区。
- 根据类信息在堆中创建对象。
- 对象分配在队中的Eden区,一次Minor GC后进入Survivor区。后续Minor GC中,如果对象一直存在,将在survivor区来回拷贝,每移动一次,年龄+1
- 当年龄超过15后,移动到老年代
- Full GC后,被标记为垃圾对象,将被GC线程回收。
网友评论