java-基础

Java 基础是面试中最常考察的部分,无论是初级还是中级开发岗位,都会围绕核心概念、语法特性、底层原理等展开。以下是高频面试点整理,按模块分类说明核心考点:

一、Java 语言特性与 JVM 基础

  1. Java 跨平台性
    • 核心:一次编写,到处运行的实现依赖JVM(Java 虚拟机),Java 源码编译为字节码(.class),由不同平台的 JVM 解释执行。
    • 考点:JVM 与操作系统的关系、字节码的作用、JDK/JRE/JVM 的区别(JDK 包含 JRE + 开发工具,JRE 包含 JVM + 运行类库)。
  2. 面向对象三大特性
    • 封装:隐藏对象内部实现,通过访问修饰符(public/private/protected/default)控制属性和方法的访问权限(如 private 属性需通过 get/set 方法操作)。
    • 继承:子类继承父类非 private 的属性和方法,使用extends关键字(Java 单继承,支持多层继承);super关键字用于访问父类构造器 / 方法 / 属性(必须在子类构造器第一行)。
    • 多态:同一行为的不同表现形式,实现条件:继承 / 接口实现、方法重写、父类引用指向子类对象;分为编译时多态(重载)和运行时多态(重写,通过动态绑定实现)。
  3. 其他核心特性
    • 抽象:通过抽象类(abstract修饰,可含普通方法)和接口(JDK8 前全为抽象方法,JDK8 后支持默认方法default和静态方法static)实现。
    • 垃圾回收(GC):JVM 自动回收无用对象内存,无需手动释放;常见 GC 算法(标记 - 清除、复制、标记 - 整理、分代收集)。

二、数据类型与运算符

  1. 数据类型分类
    • 基本数据类型(8 种):byte(1)short(2)int(4)long(8)float(4)double(8)char(2)boolean(1);默认值(如 int 默认 0,boolean 默认 false)。
    • 引用数据类型:类、接口、数组;默认值为null,存储对象的内存地址。
  2. 装箱与拆箱
    • 装箱:基本类型→包装类(如int→Integer,通过valueOf());拆箱:包装类→基本类型(如Integer→int,通过intValue())。
    • 考点:Integer缓存机制(-128~127 范围的对象复用,超出范围则新建对象),例如:Integer a=127; Integer b=127; a==b→truea=128; b=128; a==b→false
  3. == 与 equals ()
    • ==:基本类型比较值;引用类型比较内存地址(是否为同一对象)。
    • equals():默认等价于==(Object 类实现),但 String、Integer 等重写后比较内容(如"abc".equals("abc")→true)。

三、字符串(String)

  1. String、StringBuffer、StringBuilder 区别
    • String:不可变(底层 char 数组被final修饰),每次修改都会创建新对象,适合少量操作。
    • StringBuffer:可变,线程安全(方法加synchronized),效率低,适合多线程场景。
    • StringBuilder:可变,线程不安全,效率高,适合单线程场景。
  2. String 常量池
    • 存储在方法区,缓存字符串字面量(如String s="abc"直接从常量池取,new String("abc")会创建两个对象:堆中对象 + 常量池对象)。
    • 考点:intern()方法(将字符串添加到常量池,返回常量池引用),例如:String s=new String("a"); s.intern()=="a"→true

四、集合框架(Collections)

核心接口:Collection(List/Set)和Map,重点考察实现类特性与底层原理。
  1. List 接口
    • ArrayList:底层Object[]数组,查询快(下标访问),增删慢(需扩容 / 移位);初始容量 10,扩容为 1.5 倍。
    • LinkedList:底层双向链表,增删快(改指针),查询慢(需遍历);实现Deque接口,可作为队列 / 栈使用。
    • 考点:两者适用场景、扩容机制、是否线程安全(均不安全,需用Collections.synchronizedList()包装)。
  2. Set 接口
    • HashSet:底层依赖HashMap(存储元素作为 key,value 为固定对象),无序、不重复;判断重复依赖hashCode()equals()(先比 hashCode,不等则不重复;相等再比 equals)。
    • TreeSet:底层TreeMap,有序(默认自然排序,或通过Comparator定制),不重复;元素需实现Comparable接口或传入比较器。
  3. Map 接口
    • HashMap(JDK1.8):底层数组+链表+红黑树;数组默认容量 16(2 的幂次),负载因子 0.75,当链表长度 > 8 且数组容量 > 64 时转红黑树;线程不安全。
    • HashTable:线程安全(方法加synchronized),效率低,key/value 不能为 null;已被ConcurrentHashMap替代。
    • ConcurrentHashMap(JDK1.8):线程安全,通过CAS+synchronized(锁定链表头 / 红黑树根节点)实现,效率高于 HashTable;支持并发操作。
    • TreeMap:底层红黑树,key 有序(自然排序或定制排序),可按 key 范围查询。

五、异常处理

  1. 异常分类
    • Checked 异常:编译时必须处理(如IOExceptionClassNotFoundException),需try-catchthrows声明。
    • Unchecked 异常:运行时异常(如NullPointerExceptionIndexOutOfBoundsException),无需强制处理。
  2. 异常处理结构
    • try:执行可能出错的代码;catch:捕获并处理异常(可多个,按子类→父类顺序);finally:无论是否异常都会执行(常用于释放资源,如关闭流)。
    • 考点:finallyreturn的执行顺序(finally中 return 会覆盖try/catch的 return)。
  3. throw 与 throws
    • throw:在方法内手动抛出异常对象(如throw new RuntimeException())。
    • throws:在方法声明处声明可能抛出的异常(如public void test() throws IOException)。

六、多线程

  1. 线程创建方式
    • 继承Thread类(重写run());实现Runnable接口(重写run(),可多线程共享资源);实现Callable接口(重写call(),有返回值,可抛异常,配合Future使用)。
  2. 线程状态
    • 新建(New)→就绪(Runnable)→运行(Running)→阻塞(Blocked/Waiting/Timed Waiting)→死亡(Terminated)。
    • 状态切换:start()进入就绪;sleep()/wait()进入阻塞;notify()/notifyAll()唤醒;执行完run()进入死亡。
  3. 线程同步
    • synchronized:修饰方法(锁当前对象 / 类)、代码块(锁指定对象),保证原子性、可见性、有序性;属于悲观锁。
    • volatile:保证可见性(修改后立即刷新到主存,其他线程可见)和禁止指令重排,但不保证原子性(如i++仍可能线程不安全)。
    • Lock 接口:ReentrantLock(可重入锁),支持公平锁 / 非公平锁、可中断、超时获取锁,需手动lock()unlock()(通常在finally中释放)。
  4. 线程池
    • 核心参数:核心线程数、最大线程数、任务队列、拒绝策略(默认AbortPolicy:抛异常)。
    • 常见线程池:FixedThreadPool(固定核心线程数)、CachedThreadPool(动态扩容,适合短期任务)、ScheduledThreadPool(定时任务)。

七、Java 8 + 新特性

  • Lambda 表达式:简化匿名内部类(函数式接口专属),格式:(参数) -> 表达式(如(a,b) -> a+b)。
  • 函数式接口:仅含一个抽象方法的接口(如RunnableConsumer),用@FunctionalInterface注解标识。
  • Stream API:对集合进行流式操作(过滤、映射、聚合等),如list.stream().filter(s -> s.length()>3).collect(Collectors.toList())
  • Optional:解决NullPointerException,如Optional.ofNullable(obj).orElse(defaultObj)
  • 日期时间 API:LocalDateTimeInstant等(替代线程不安全的SimpleDateFormat)。

八、其他高频点

  • static 关键字:修饰变量(类变量,共享)、方法(类方法,不能直接访问非 static 成员)、代码块(类加载时执行,优于构造器)。
  • final 关键字:修饰类(不可继承)、方法(不可重写)、变量(不可修改,引用类型则地址不可变)。
  • 抽象类 vs 接口:抽象类可含普通方法和构造器,单继承;接口(JDK8 后)可含默认方法,多实现;均不能实例化。
  • 泛型:约束集合元素类型(如List<String>),避免强制类型转换;通配符? extends T(上限,只能取)、? super T(下限,只能存)。
posted @ 2025-10-28 14:51  hanease  阅读(3)  评论(0)    收藏  举报