25届实习/秋招-java面试-JavaSe面试题整理-牛客网近一年

JavaSe

面向对象

  • Java对象创建的流程步骤,和方法

    • new初始化过程,和反射相比谁更快?
  • 怎样唯一确定一个类?如果两个类的全限定名相同怎么办?

  • 为什么要有封装类

  • static和final区别。

    • static表示属于类,只有一个
    • static修饰的字段什么时候初始化,放在哪
      • 对于static变量的理解,有什么用
      • static变量分配内存的时候发生在哪个环节?
    • static加在类上和不加区别,除了修饰类、属性、方法还有吗? 代码块
      • 使用static需要注意什么
    • 写一个static main方法,能调用非静态方法吗?如果要调用要怎么调用?为什么不能不创建对象调用?
      • 静态方法和非静态方法的区别
  • 实例化:

    • class B {
          static B t1 = new B();
          static B t2 = new B();
          {
              System.out.println("代码块");
          }
          static {
              System.out.println("静态块");
          }
      }
      public class Main {
          public static void main(String[] args) throws Exception {
              B b = new B();
          }
      }
      //输出什么
      
  • 重载的重写的区别

    • 构造方法的重载
  • 多态用在哪里,有什么用处。

    • 多态的原理
  • final

    • final修饰变量和静态变量在哪里可以赋值
    • final修饰类、方法(重写)、字段、对象的作用,fin al修饰一个对象是什么不变。
    • final可以修饰接口吗。不可
    • final修饰变量 不能改写 修饰list集合,可以加数据吗
  • 继承:Java支持多继承吗?从开发的角度说一下为什么不支持多继承

  • 接口和抽象类的区别?应用场景?

    • 普通类和抽象类区别,可以被new吗
    • 抽象类可以实现接口吗 -- 可以
    • 两者是否可以实例化
    • set接口可以定义私有成员变量吗
    • 接口:多继承
  • Java权限修饰符

    • 四个的区别
  • 面向对象的三个特性

    • 和面向过程编程有什么区别?
    • 什么是结构化编程、面向对象编程以及函数式编程?
  • Object 类有什么方法--举出常用方法

    • == 和equals的区别

      • equals是判断引用是否一样。看是否重写。
        • 默认使用 ==
      • String类里面的equals方法实现看过吗,源码解析
      • 自己实现equals要注意什么
    • finalize方法

      • JVM中自救
    • hashcode方法

    • 浅拷贝和深拷贝的区别,深拷贝怎么实现,引用拷贝。

      • 深拷贝会在堆上创建一个新的对象。
        • 基本类型浅克隆可以,引用类型
      • 引用类型在浅克隆后,要对引用的变量再进行嵌套克隆。
      • 可以看javaguide,引用/浅拷贝/深拷贝的区别
      • 浅拷贝
    • Object[] o, 可以存放各种类型的数据,底层怎么存放的

      • Object o = 1L 是怎么存储的
  • 内部类--了解即可:

常用工具类String-Arrays

java原生类中用的最多的类

  • Arrays类(工具类),常用方法

  • String类

    • 常用方法和构造,valueOf

    • java7 String 存储结构和API 变更

      • string为什么设计成不可变,好处

        • private且final无法继承。
        • java的string类的设计思想,jdk1.9前后区别。
          • 底层char / byte,在 Java 9 之后,String 类的实现改用 byte 数组存储字符串
          • 解释
        • 换成不定长的存储数组会有什么问题, "12我是"12占用两个字节,我是占用应该是6个字节,这样存在什么问题。
        • string为什么不能是基本数据类型
      • String直接赋值 stringpoll 和 new一个对象的区别。

        • String str = new String("abc") 创建字符串对象 --这里涉及两个对象
        • new String("a") + new String("b") 涉及几个对象
        • String a = "a", String b = new String(a + "b"); 创建了几个对象
        • String str = "i"; String str2 = new String("i") 一样吗
      • 字符串常量池

        • 字面量,字面量是对象吗,能调用方法吗
        • 如何设置大小
        • intern( )方法, 见JVM
        • 内存位置在哪
          • 方法区-元空间- 本地内存
          • 探秘位置在哪 -- 真正意义上字符串常量池在堆中存储,元空间可能有引用堆中字符串常量,运行时常量池在方法区中
        • 优化常量池的方法

      • StringBuffer(synchronized)和StringBuilder的区别和String的区别

        • StringBuilder的方法

        • StringBuffer和StringBuilder是如何实现可变的呢?底层原理是什么?如何优化
          如果让你来实现StringBuffer和StringBuilder,你会怎么实现?
          
        • String的+=和stringBuilder哪个性能高?面试官答其实差不多,+=在一行的时候会隐性转换为stringbuilder


  • 基本数据类型和包装类

    • String是什么类型

    • 基本数据类型介绍

      • 基本类型几种,分别占用空间
        • 成员变量没有手动赋值,系统会默认赋值(局部变量不会)
      • 除了基本数据类型,数组存放的都是对象的引用地址
    • 包装类,为什么要包装类

    • 包装类常量池

    • int和Integer区别,int有几个字节

      • Integer的构造方法。
      • Int i =1 和 integer i=1存储区别
      • 如何声明一个int的List(不能,只能声明Integer的List)
      • Integer是线程安全的吗,哪些类是线程安全的
      • 给Integer最大值+1结果
      • String int Integer直接相互转换 : 静态方法
        • 类都是valueOf,到int不一样。
    • Long 缓存池,包装类

  • switch可以放哪些类型

    • String / int, 但byte,short,char自动转成int
  • 方法参数传递:JAVA中值传递还是引用传递

  • DateFormat

    • 正则表达式略。
  • java中浮点数精度怎么解决,有了解过实现吗,为什么有精度问题

    • 判断BigDecimal是否相等
    • 如何进行计算、怎么四舍五入
  • 常量池和包装类的缓存

    • 为什么有常量池,思想

    • 分类,两类。

      • 符号引用和字面值的关系
    • 包装类和常量池的区别

      • 同样思考,为什么是安全的,为什么要安全

异常:

  • 基本介绍

    • exception和error区别
    • 异常继承的根类
      • 根类有哪些方法,处理错误
    • Exception有哪些,从上往下说说看
      • 编译期异常和非编译期异常区别
      • 异常的本质是什么,发生在什么时候
  • 编译异常:

  • 运行时异常:

    • 遇到过哪些异常,(空指针在哪遇到了、SQL 异常、类型转换异常)
  • 谈谈 Java 异常处理机制,异常处理的两种方式:

    • throws的作用

    • try/catch机制

      • try finally不用catch行吗
      • finally一种情况下不会执行
    • 为什么有些异常需要捕获try catch,有些直接往上抛就可以,面试官提示了一下编译那一块

  • final/finally/finalize

  • 如何自定义异常

集合框架:

  • 介绍Java集合(容器),什么是集合存什么

    • 几个常用的数据结构的底层原理

      • 特点,存储结构,红黑树。
    • 介绍Java里面常见的集合、整体框架,父接口

    • 如何升级成线程安全的容器--Collections

  • 两个大的父类

  • Collection接口

    • 继承了哪个接口:

    • 哪些继承了Collection,特点和函数

    • 常用方法方法:add clear remove toArray()

    • Collection集合的输出方式

    • 简单讲讲List和Set的区别(都是接口),都继承了哪个接口,Map继承了上述接口吗

  • List, Set, Queue, Map 四者的区别

    • List 和 map的实现类 和各自的底层结构
  • Collections 和 Collection

List:

  • List集合的特有方法(List是接口)
  • ArrayList和LinkedList
    • 区别,底层结构,优缺点和使用场景

      • 为什么都用arraylist

        • 无需同步,大部分尾插
      • arraylist对大片的连续内存有很高要求,linkedlist只需要碎片空间

      • ArrayList和LinkedList哪个快

        • 知道容量,还要看位置
    • ArrayList:

      • 惰性初始化,构造方法

        • arraylist扩容机制(初始容量,为啥扩容是1.5),底层arraycopy函数,删除和加入代价都很大

        • 一个关于ArrayList扩容的场景题优化扩容,让自己设计增强类去实现。

      • 为什么可以随机读取,

        • 底层Object[]数组,为什么限制只能存一类
      • 应用:

        • ArrayList中删除偶数,不能用remove
        • 多线程往ArrayList中写10万条数据,会出现什么问题
        • ArrayList一边遍历一边删除的时候怎么做,remove
      • 写时复制并发安全CopyOnWriteArrayList

        • 写入操作的实现,不适用于哪种场景。参考
        • Collections/vector
    • LinkedList

      • LinkedList为什么是双端链表
        • 便于查找和修改
        • 个链表没有被引用,会被立马删除吗
      • 分别分析一下插入、删除、查找的时间复杂度
      • 可以通过什么数据结构来加快LinkedList的访问
    • ArrayList和linkedlist的多线程问题如何解决

    • 数组和List的转换方法有哪些

  • Vector ,扩容

Map:

  • 集合关系(Collection和Map)

    • Map集合的体系特点。

      • 键的特点,键和值都是什么类型
    • map集合下常用的子类有哪些/实现类

      • map接口,HashMap是实现
    • 常用的api

      • 如何获取键值对
    • Map集合的遍历方式:有几种,效率

      • 第一种获取key

        • keySet,用什么承接
      • 第二种,全部转成Set

        • Map.Entry 是什么
        • 怎么写
  • HashMap集合

    • 源码

    • key如何保证唯一

    • 底层结构-哈希表优点

      • Node是什么,里面存了什么东西,hashMap底层是什么数组
      • contains方法底层用的什么,原理
      • hashCode()和equals()有什么作用、区别。
        • key通过hashCode得到hash值(怎么算的,为什么要扰动),怎么到下标-长度,hashMap数组长为什么是2的整数幂
          • hash值与数组下标的关系
        • equals的作用,不重复equals比对象的key,什么时候调用。
          • 如果key指向的对象一样不用比较
        • 什么时候要重写hashcode和equals
          • 不重写hashcode的后果,以hashSet/hashMap为例。重写equals必须重写hashcode
          • map中的key如果是对象并且是我们自己声明需要注意什么
          • hash碰撞的解决方法,分为开放地址(线性-平方)和链地址法,各自的场景,一致性hash
      • 1.8之前为什么这么设置,解决hash冲突有别的办法吗
      • 数组初始容量,为什么负载因子是0.75 ,怎么扩容
    • 成员属性:

      • 1.8之后:为什么引入红黑树(为什么不用avl树,而不是BST、B+、堆等等)? 红黑树自旋条件,平衡自旋怎么做的复杂度多少? 红黑树的性质、红黑树如何调节平衡
      • 什么时候转红黑树,为什么红黑树阈值是8,不是6或者10
        • 红黑树会退化成链表吗,什么时候
        • 转红黑树的数组最小长度(64)见源码,先扩展数组,resize()为短链表
    • 成员方法:

      • 1.8的三个优化:红黑树,尾插,插入扩容逻辑还有位置
      • Put操作流程,源码
        • Key冲突的是怎么处理的,如何判断是覆盖还是加数据
        • 插入还要看是链表还是红黑树
        • JDK1.7 冲突的时候为什么采用头插法,有什么缺点(循环链表),头插法和尾插法的区别,扩容
        • 扩容机制的区别,前扩容和后扩容
      • 并发异常
        • java的hashmap的fastfail机制。
        • 为什么不是线程安全的。它在什么情况下会出现线程不安全的问题,不安全情况下会出现什么现象?说一下场景
          • jdk7/8有都什么问题?问题有什么区别?
        • 平时使用hashmap要关注那些方面的东西
        • 有措施能让Hashmap变得线程安全吗?
          • ConcrrentHashmap,Hashtable,Collections.synchronizedMap
  • hashmap和treemap有什么区别,什么时候用?

    • treemap底层数据结构是什么?
    • 怎么实现有序
  • concurrentHashmap

    • 见JUC

Set:

  • HashSet: hashset是怎么基于hashmap实现的。

    • 如果自己什么设计
    • 如何去重:
      • hashcode比较和equals比较
      • 一个自定义的对象的话,那我这个对象应该是有什么动作吗
  • LinkedHashSet为什么有序:

    • 多一个顺序存储的链占据空间。
  • HashSet和TreeSet有什么区别?

    • 集合是如何排序的
    • 如果传入TreeMap的key值是对象,那么对象应该满足什么条件
      • 为对象的类//用的集合设置比较器,实现Comparable接口,重写compareTo方法。
      • 比较器底层原理Comparator,比较器类
      • 代码如何写
    • treeSet和treeMap的关系

Queue

  • 常用的方法。

泛型

  • 什么时候起作用

  • 使用泛型有什么好处 ,理解和应用场景

  • 类方法接口

  • 通配符

    • 泛型中如何确定上下限(<? extends T> <? super T>
  • 泛型检查

  • Java语言的泛型是怎么实现的?为了解决什么问题而出现的?泛型的效率一定很低吗?

IO:

  • File
    • 打开一个文件的流程
      • 怎么从文件中读写
  • IO流都有哪些、继承关系和应用场景
    • 追问I/O流的设计模式,IO流的作用

    • IO流用了什么设计模式

      • 参考理解适配器和装饰者模式
        • 适配器继承被代理对象110v,实现目标对象接口220v,中间进行转化操作。
        • 装饰器都有同一个父类和抽象方法,每次调用传入同一个对象调用例如addCost
  • IO stream
    • 序列化Serializable:参考
      • serializable 接口的作用,实现这个接口在类上有什么区别。自带的序列化方法有哪些
      • 如果不想序列化加关键字,static
    • 序列化原生代码怎么实现,调用什么函数。
    • Serializable 的类修改了类包的路径,那么反序列化还能成功吗。使用 JSON 可以反序列化成功吗?用Object write 的方式会不会有影响
    • 序列化的兼容性问题
    • jdk8的stream,parallel StreamAPI

反射

java各个区放什么

  • 反射的理解

    • 能干吗(例如配置文件如何new对象),优缺点
    • 和思想
    • Class类,四个类
  • 应用场景:什么时候用,怎么用,用过吗

    • 第一步: 获取这个类对应的字节码,几种方法
      • tips不创建对象类加载
    • 第二部构造,有了字节码能干嘛
      • 你自己写过反射吗,反射可以调用私有构造函数吗
      • 私有构造器
  • getClassLoader理解

    • classpath理解,如何获取根路径
  • Field类

    • 一个类的某个属性是私有的没有get/set方法,如何通过反射获取,代码上怎么具体实现
      • 如何承接,如何反编译Fields
  • 反射调用对象方法

  • 反射可以调用私有构造函数,怎么调用

    • 获取父类和接口
  • 反射的原理

  • 反射效率低将反射结果进行缓存有遇到过吗

注解

  • 注解是什么,用在哪,@Retention

    • 注解中的属性怎么设定。
    • 反射机制获取注解的属性,条件。
      • 分为从类中,方法中
  • 注解的作用,反射的关系

Java新特性

  • 用java哪个版本,jdk8新特性说一下
    • java的lambda表达式
      • 函数式接口。
      • 匿名内部类
        • 内部类就是new Student() {}; 多了大括号,代表匿名内部类,类中重写父类/接口的方法。

设计模式 --没看完后序补

  • 单例模式:

    • 是什么, 怎么实例化,什么时候用,为什么要静态static

    • 两种分类:

    • 各自的优缺点,分别应用在什么场景下

    • 饿汉式:

    • 懒汉式:

      • 单例模式双check检查锁,太慢
        • 为什么进行第二次非null判断
        • 安全吗如何实现安全,锁加在哪
        • 加锁比较影响性能,那除了加锁以外有什么其他方法吗
      • 静态内部类实现单例模式为什么属于懒汉式的?
    • 手写单例模式,各种情况怎么保证线程安全

      • 为什么要用DCL(双chek检查),为什么要用volatile-作用,为什么要用synchronized,为什么要锁住类的.class
  • 代理模式:

    • 代理模式的作用:代理包一层,通过代理对象访问原始对象

      • 代理对象,访问对象
    • 静态代理

    • 动态代理原理

      • 什么时候用
      • JDK代理 和 CGLib 对比区别
        • 优缺点,分别在什么情况下用。
        • 常用处CGLib在哪用到了
        • 如果被代理对象不实现接口怎么实现代理
      • 具体实现
    • 方式对比:

      • 优缺点
      • 动态代理和静态代理区别
  • 观察者模式,说说怎么设计相应的类

  • 工厂模式

  • 装饰器模式,代理模式,以及两者的区别

  • 适配器和装饰器模式的区别?装饰者模式和策略模式的区别

  • OOP设计模式六大原则

  • 说一下模板模式,举一些例子

  • 实现工厂模式

  • 责任链模式在哪里用到了、模板方法

  • ocp开闭模式

JVM

JVM概述:

内存结构

  • 内存结构/内存模型--即为运行时数据区:

    • JVM了解过哪些版本,1.8和1.7内存结构不同的地方
      • 方法区规范(8之前永久代实现堆上)改为了放在本地内存的 方法区(元空间实现),堆中剩下年轻和老年代,字符串常量池、静态变量
    • 内存结构是怎样
  • JVM内存

    • 程序计数器:

      • 特定
    • 虚拟机栈:

    • 本地方法栈存储的什么

      • 虚拟机栈和本地方法栈的区别?
    • 堆:

      • 特点
      • 堆中有哪些对象
        • 生成的Class对象存储在哪里
      • Java8中方法区改为本地内存的元空间
      • 堆内存工具,三个
    • 方法区(元空间):

      • 存了什么
        • 字节码存储在哪个区域
      • 类(静态)常量池,运行时常量池,字符串常量池
        • 常量池== 常量池表,查表。
        • 字符串常量池(StringTable):
          • jdk 1.6之前StringTable是存在永久代中,属于运行时常量池一部分。但是由于使用很频繁,且永久代中垃圾回收效率很低。jdk 1.7之后将StringTable移除到了堆内存中,堆内存中垃圾回收效率更高。
        • 什么是常量,什么是变量。为什么要常量池
    • 本地内存:

      • 和虚拟机内存的区别
      • 中的直接内存
    • 变量的位置:

      • private static final String 在哪个区域 --方法区

内存管理:

  • 内存的分配:(结合javanote)

    • TLAB简单了解一下
    • 逃逸分析:
      • 对象只能在堆上分配吗?如果在栈上分配除了逃逸分析外,还要有什么条件?
    • 分代思想:
      • 新生代和老年代,比例划分
        • 新生代又分为什么
      • MinorGC(YoungGC)和Full GC
      • 晋升到老年代的条件:
        • 阈值是几,大对象
        • 大对象为什么不放在新生代
        • 对象晋升是什么, 过早晋升会导致哪些危害
  • 回收策略:

    • 各种GC什么时候触发:

      • MinorGC的触发时机是什么,触发STW

      • 什么时候会FullGC

        • 如何手动GC,担保
      • 如何避免FullGC

      • MinorGC【young GC】发生在新生代的垃圾回收,暂停时间短(STW)
        Mixed GC 新生代 + 老年代部分区域的垃圾回收,G1 收集器特有
        FullGC: 新生代 + 老年代完整垃圾回收+方法区,暂停时间长(STW),应尽力避免
        
    • 这两个GC的流程

    • GC的过程是由谁来调度和启动的

  • 垃圾回收:

    • 垃圾判断:

      • 要对哪些进行垃圾回收(主要是堆中对象,部分方法区中)
      • 判断对象存活(是否是)的两种方式:引用计数算法可达性分析算法
        • 引用计数法:
          • 优点:循环引用问题
        • 可达性算法:
          • 什么是GCroots(引用),如何选gcroots(说全)
          • 应该有哪些前置性的操作
            • STW
          • 可达性算法底层数据结构
          • 三色标记原理--见ediary后面
          • 并发标记:多标-浮动垃圾,漏标的处理了解。
        • 引用分析:
          • java的四大引用类型,引用队列
    • 回收算法:

    • 垃圾回收器:

      • 1.8之前分代上下结合,不同的分代有不同的垃圾回收器,举出不同分代常用垃圾回收器

        • - 红色虚线在 JDK9 移除、绿色虚线在 JDK14 弃用该组合、青色虚线在 JDK14 删除 CMS 垃圾回收器 - 之后就是分区,所有代只一个回收器
      • 回收算法的具体实现:分为哪几类:

        • 哪些是并行的-为什么要并行,GC的性能指标
        • 卡表记忆集--了解,漏标写屏障-了解,跨代引用问题
        • 常见的垃圾回收器组合,组合中使用的回收算法
          • JDK各个版本使用的哪个垃圾回收器,jdk8
          • 并行和并发的区别,STW
          • CMS的工作流程,使用场景(用在哪一代)
            • 和之前的区别,分为几步,哪步会STW
            • 浮动垃圾和错标
            • 为什么要STW,CMS为什么标记清除
        • G1的工作流程,和CMS区别,优缺点
          • g1有分代(区域吗),g1里除了新老生代,还新增了哪个区(大对象区)
          • 浮动垃圾有解决吗,一定程度解决了(还有)|| 内存碎片呢
          • CMS和G1如何选择。
          • G1中新生代和老年代的比例是动态的吗 ,比例是多少,可以手动设置,会扩容有上限。避免手动调节,自动分配 。
  • 调优见下面

类加载-编译

  • 了解过热点代码吗? 你知道hotsport为什么要叫hotspot?

  • 什么是类加载:

    • 类文件的结构,javap反编译:了解

    • 多态的原理,synchrondized的原理

  • 语法糖,了解

  • 类加载机制和过程:

    • 加载阶段加载了哪两个。
    • 连接的作用
    • clinit执行几次,如果执行失败了怎么办这个类还能用吗?
      • clinit()和单例模式
    • InstanceKlass,Class类对象(作用--java_mirror),实例对象之间的关系
      • 静态变量存哪
    • 静态变量,静态代码块,成员变量,构造函数的执行先后顺序
    • 什么操作会触发初始化,初始化和类加载的关系
  • 类加载器:


运行期优化:了解

  • 热点代码,逃逸分析-作用

JMM内存模型

  • JMM描述的是什么
  • 其他在JUC内存部分

系统优化:

  • 性能调优:

  • JVM调优会不会:背景+思路+具体改动+验证方案,聊一次排查 JVM 的经历

  • 了解过一些相关监测指令吗?

  • 内存泄漏

  • 参数调优:

    • 在哪设置
    • 常用的JVM参数:
      • 最大堆和堆初始大小设置
        • Xmx和实际占用的内存大小,Xmx和xms的关系
          • Java申请的1g内存全部是真实的内存吗
      • 说出常用参数
  • 实际案例:

    • GC调优目标,相关工具,怎么看到参数。

    • 老年代一直满?然后让我分析可能是哪些原因。

      • log4j2导致内存泄露: 记住用的工具,如jps

        • 大对象直接进入老年代因此频繁 Full GC;
           	静态变量过多,变量生命周期过长,存活率过高,造成老年代过大;
           	内存泄露导致无用对象晋升老年代并无法被 GC 回收。
          
        • 内存泄漏怎么诊断:

          • 答了jmap、jvm参数堆转内存快照放到visual jvm中,会提示oom的位置。面试官说生产环境中不会等到宕机再看,在没宕机出现oom的时候可以看一下有哪些大对象或者长期未被回收的对象。
    • MetaSpace占用内存高一般是什么原因导致的

  • eidary后的补充扩展了解

热门相关:茅山神婿   我在末世有套房   神武觉醒   高人竟在我身边   学霸的黑科技系统