美文网首页
J2EE基础篇

J2EE基础篇

作者: markDownMan | 来源:发表于2023-04-09 20:48 被阅读0次
    1. List和Set的区别

    List有序,可重复,允许null,可以指定下标获取元素。
    set无需,不重复

    2.ArrayList和LinkedList区别?
    1. 底层数据结构不同。ArrayList-数组,LinkedList-链表
    2. 适用场景不同。Arraylist-随机查找,LinkedList-增删
    3. LinkedList实现Deque,能当队列使用。
    3. 重载和重写的区别
    1. 重载:同一个类,方法名一样,参数类型,个数,顺序不同。返回类型和修饰符可以不同,发生在编译阶段。
    2. 重写:父子类,方法名,参数列表必须相同。返回类型<=父类,抛出异常<=父类,修饰符>=父类。
      private不能重写。
    4. hashCode和equals的关系
    1. 都是Object方法。
    2. 每个对象都有自己的哈希值,类似指纹。
      hashCode不同,对象不同。
      hashCode相同,对象可能相同。
      对象相同,hashCode相同。
    3. 集合比较对象是否相等,会用到hashCode比较,相同,再用equals比较。
    5 String,StringBuffer,StringBuilder
    1. String 常量,不变。
    2. StringBuffer,线程安全
    3. StringBuilder,线程不安全
    6. 泛型中extends,super的区别
    1. <? extends T>表示包含T在内的任何的T的子类。
    2. <? super T>表示包含T在内的任何T的父类。
    7. Jdk1.7-Jdk1.8 HashMap发生了什么变化?
    1. jdk1.7=数组+链表,jdk1.8=数组+链表+红黑树
    8 深拷贝和浅拷贝
    1. 浅拷贝:只会拷贝基本数据类型,以及引用对象的地址,指向同一个对象。
    2. 深拷贝:即会拷贝基本数据类型的值,也会对引用对象进行复制,指向不同的对象。
    9 HashMap的put方法
    1. 根据key通过hash算法与运算得出数组下标
    2. 如果数组下标的元素为空,则将key,value封装成entry(1.7)Node(1.8),并放入该位置
    3. 如果数组下标的元素不为空。分成三种情况:
      a. jsk1.7,判断是否需要扩容,不需要则头插法添加到链表中。
      b. jdk1.8,判断当前位置是链表还是红黑树
      • 如果是红黑树Node,先判断红黑树是否存在该key,存在则更新,不存在则添加到红黑树中。
      • 如果是链表结构,判断链表是否存在该key,存在则更新,不存在则尾插法存入链表。
      • 插入后,在判断是否需要扩容。
    10. HashMap扩容机制
    1. 先生成数组。
    2. 重新根据key通过hash算法和运算生成数组下标。把旧数据迁移到新数组上。
    3. 迁移完后,把新数组赋值给HashMap对象的table属性。
    11 CopyOnWriteArrayList的底层原理?
    1. 线程安全。读操作-原数组,写操作-复制一个新数组上操作
    2. 写操作会加锁。
    3. 写操作完成后,原数组地址指向新数组。
    4. 适合读多写少的场景。
    12 什么是字节码?有什么作用?
    1. javac编译后class文件。
    2. 一次编译到处运行,只要有jre环境,就可以运行。具有跨平台的作用。
    13 Java的异常
    1. 所有异常的顶级父类Throwable
    2. Throwable有Exception和Error 2个子类
    3. Error子类:StackOverFlowException和OutOfMemoryError。比较严重的错误。
    4. Exception子类:NullPoinerException,illegalAccessException。
    14 类加载器有哪些?
    1. BootStrapClassLoader-lib下的jar包和class文件
    2. ExtClassLoader-lib/ext下的jar包和class文件
    3. AppClassLoader -自定义加载器,加载classpath下的jar包和class文件
    15 双亲委派机制?

    加载一个类时,先从AppClassLoader查询该类是否已经加载过,如果没有,则找父级ExtClassLoader,也是判断是否加载过,如果没有再找父级BootStrapClassLoader,如果没有加载过,则判断是否可以加载,如果不能,再找子级ExtClassLoader,再找AppClassLoader。


    image.png
    16 JVM内存共享区

    堆和方法区

    17 JVM线程隔离数据区

    虚拟机栈,本地方法栈,程序计数器

    18 项目如何排查JVM问题

    宕机

    1. JVM参数内存溢出时自动生成dump文件,再用MAT软件分析。
    2. 应用/中间件日志
    3. 服务器的日志,var/message文件
      线上
    4. JMap查看各个区域的内存使用情况。
    5. JStack查看各个线程阻塞,死锁情况。
    6. JStat查看GC的情况。是否频繁GC,年轻代还是老年代。
    7. 查看占用CPU最多的线程。Top命令。
    8. 阿里的分析软件。arthas
    19 一个对象从加载到GC,经历了哪些过程?
    1. 把字节码加载到方法区。
    2. 根据类信息在堆中创建对象。
    3. 对象分配在队中的Eden区,一次Minor GC后进入Survivor区。后续Minor GC中,如果对象一直存在,将在survivor区来回拷贝,每移动一次,年龄+1
    4. 当年龄超过15后,移动到老年代
    5. Full GC后,被标记为垃圾对象,将被GC线程回收。

    相关文章

      网友评论

          本文标题:J2EE基础篇

          本文链接:https://www.haomeiwen.com/subject/ipzbddtx.html