包小盒设计网站,传世网站建设,湖北企业模板建站开发,旅游网站建设答辩ppt模板一、Java 语言核心特性#xff08;面向对象编程#xff09;核心知识点梳理#xff1a;面向对象三大特性#xff1a;封装#xff1a;隐藏对象内部实现#xff0c;通过 public 方法暴露接口#xff08;例#xff1a;类的 private 字段 get/set 方法#xff09;。继承面向对象编程核心知识点梳理面向对象三大特性封装隐藏对象内部实现通过 public 方法暴露接口例类的 private 字段 get/set 方法。继承子类继承父类非 private 属性和方法减少代码冗余注意Java 单继承通过接口实现多继承效果。多态同一行为的不同表现形式编译时多态方法重载运行时多态子类重写父类方法父类引用指向子类对象。接口与抽象类的区别接口全抽象JDK8 后可有 default 方法字段默认 public static final类可实现多个接口。抽象类可含抽象方法和具体方法字段可非静态类只能继承一个抽象类。应用场景接口用于定义规范如 DAO 层接口抽象类用于抽取共性实现如 BaseService。其他高频点重载Overloadvs 重写Override重载是同一类中方法名相同、参数不同重写是子类覆盖父类方法参数和返回值需一致协变返回类型除外。关键字static静态变量 / 方法属于类非实例、final修饰类不可继承、方法不可重写、变量不可修改、this当前实例、super父类引用。面试常见问题及回答思路Q多态的实现原理是什么A核心是 “动态绑定”编译时编译器根据父类引用类型检查方法是否存在运行时 JVM 根据实际对象类型调用对应子类的重写方法依赖方法表每个类的 Class 对象中维护方法表记录方法的实际入口地址。举例List list new ArrayList(); list.add(1); 编译时用 List 接口检查 add 方法运行时实际调用 ArrayList 的 add 实现。Q为什么 Java 不支持多继承A避免 “菱形继承” 问题多个父类有相同方法时子类无法确定继承哪一个通过接口多实现替代接口仅定义规范无具体实现冲突。二、集合框架核心知识点梳理整体结构接口CollectionList/Set、Map核心实现类ListArrayList数组查快改慢、LinkedList双向链表增删快查慢SetHashSet底层 HashMap无序去重、TreeSet红黑树有序去重需实现 ComparableMapHashMap数组 链表 / 红黑树JDK1.8 后链表长度 8 转红黑树、ConcurrentHashMap线程安全JDK1.7 分段锁JDK1.8 CASsynchronized。高频细节HashMap初始容量 16负载因子 0.75扩容为 2 倍key 为 null 存放在索引 0线程不安全多线程 put 可能导致死循环JDK1.8 后修复但仍有数据覆盖问题。HashSet本质是HashMap的 keyvalue 为常量所以去重依赖 key 的hashCode()和equals()先比 hashCode再比 equals。线程安全集合Vector所有方法 synchronized效率低、Collections.synchronizedList()包装类加锁粒度同 Vector、CopyOnWriteArrayList写时复制读不加锁适合读多写少。面试常见问题及回答思路QArrayList 和 LinkedList 的区别如何选型A从底层结构、操作效率、内存占用三方面说底层ArrayList 是动态数组LinkedList 是双向链表效率ArrayList 随机访问get (index)快O (1)增删尤其是中间位置慢需移动元素O (n)LinkedList 增删快O (1)找到位置后修改指针随机访问慢O (n)选型查多改少用 ArrayList增删多尤其是中间用 LinkedList小数据量时差异不大。QHashMap 的 put 流程JDK1.7 和 1.8 有什么区别Aput 流程计算 key 的 hash 值hashCode () 高 16 位异或低 16 位减少哈希冲突计算索引hash (容量 - 1)若桶位为空直接放新节点若不为空判断 key 是否存在hashequals存在则替换 value不存在则插入链表 / 红黑树插入后若链表长度 8 且容量 64转红黑树若元素数 容量 * 负载因子触发扩容2 倍。区别1.7 是头插法扩容时可能死循环1.8 是尾插法1.8 新增红黑树优化长链表查询1.7 的 hash 计算更简单1.8 增加高 16 位异或。三、多线程编程基础核心知识点梳理线程创建方式继承Thread类重写 run ()实现Runnable接口重写 run ()可多线程共享资源实现Callable接口重写 call ()有返回值结合Future获取结果。线程状态新建New→ 就绪Runnable→ 运行Running→ 阻塞Blocked/Waiting/Timed Waiting→ 终止Terminated。阻塞原因synchronized 未拿到锁Blocked、wait ()Waiting、sleep (long)/join (long)Timed Waiting。同步机制synchronized可修饰方法锁当前对象 / 类、代码块锁括号内对象JDK1.6 后优化为偏向锁→轻量级锁→重量级锁锁升级减少性能消耗。Lock接口ReentrantLock可重入、可中断、可超时、公平锁 / 非公平锁需手动lock()和unlock()建议放 finally。区别synchronized 是 JVM 层面隐式锁自动释放Lock 是 API 层面显式锁灵活但需手动释放。线程池核心参数corePoolSize核心线程数、maximumPoolSize最大线程数、keepAliveTime非核心线程空闲存活时间、workQueue任务队列。常用线程池Executors.newFixedThreadPool()固定线程数、newCachedThreadPool()缓存线程池可扩容、newSingleThreadExecutor()单线程实际开发建议用ThreadPoolExecutor手动创建避免资源耗尽如 FixedThreadPool 的队列无界可能 OOM。面试常见问题及回答思路Qsynchronized 和 volatile 的区别A两者都用于线程安全但作用不同volatile修饰变量保证可见性一个线程修改后其他线程立即看到和禁止指令重排序如单例模式双重检查锁中修饰 instance但不保证原子性例i 仍会有线程安全问题synchronized保证原子性临界区代码互斥执行、可见性解锁前刷新内存、有序性临界区代码单线程执行但开销比 volatile 大。总结volatile 适合修饰状态标志如 boolean isRunningsynchronized 适合复杂逻辑的同步。Q什么是死锁如何避免A死锁是两个或多个线程互相持有对方需要的锁导致无限等待。例线程 1 持有锁 A等待锁 B线程 2 持有锁 B等待锁 A。避免1. 按固定顺序获取锁如都先获取 A 再获取 B2. 定时释放锁tryLock (time)3. 减少锁的持有时间。四、JVM 内存结构和垃圾回收机制核心知识点梳理内存结构JDK8线程私有程序计数器记录当前线程执行的字节码行号唯一不会 OOM 的区域虚拟机栈存储栈帧局部变量表、操作数栈、返回地址等栈深过深会 StackOverflowError如递归无出口内存不足会 OOM本地方法栈类似虚拟机栈为 Native 方法服务。线程共享堆存储对象实例GC 主要区域分新生代EdenFrom SurvivorTo Survivor和老年代内存不足会 OOM方法区元空间MetaSpace存储类信息、常量、静态变量等JDK8 前是永久代PermGen元空间使用本地内存默认无上限可通过 - XX:MaxMetaspaceSize 限制内存不足会 OOM。垃圾回收GC回收区域堆和方法区常量、无用类。对象存活判断可达性分析以 GC Roots 为起点不可达的对象标记为可回收GC Roots 包括虚拟机栈中引用的对象、本地方法栈中引用的对象、静态变量、常量等。引用类型强引用new 的对象不会被回收、软引用OOM 前回收适合缓存、弱引用GC 时必回收如 WeakHashMap、虚引用回收时通知跟踪 GC。垃圾收集算法标记 - 清除标记可回收对象直接清除会产生碎片标记 - 复制将存活对象复制到另一块区域无碎片适合新生代Eden:From:To8:1:1标记 - 整理标记后将存活对象移到一端清除另一端适合老年代。垃圾收集器新生代SerialGC单线程STW 长、Parallel Scavenge多线程注重吞吐量、ParNew多线程配合 CMS老年代Serial Old单线程配合 SerialGC、Parallel Old多线程配合 Parallel Scavenge、CMS并发标记清除低延迟三步 STW初始标记、重新标记、并发清除有碎片、G1Region 分区兼顾吞吐量和延迟Mixed GC 回收部分老年代。面试常见问题及回答思路QJVM 堆内存分代为什么这么划分A堆分新生代Young和老年代Old新生代又分 Eden、From Survivor、To Survivor。原因基于 “大部分对象朝生夕死” 的经验法则新生代对象存活时间短回收频繁老年代对象存活时间长回收少分代后可采用不同 GC 算法优化效率新生代用标记 - 复制效率高适合短生命周期对象老年代用标记 - 整理避免碎片适合长生命周期对象。QG1 收集器的工作原理AG1 将堆划分为多个大小相等的 Region默认 1-32MB每个 Region 可动态标记为 Eden、Survivor、Old。流程1. 初始标记STW标记 GC Roots 直接关联的对象2. 并发标记遍历对象引用链无 STW3. 最终标记STW处理并发标记遗漏的对象4. 筛选回收STW根据 Region 的回收价值排序优先回收价值高的混合回收部分老年代 Region。优势可设置最大 STW 时间兼顾吞吐量和延迟适合大堆如 8GB 以上。五、复习建议画思维导图把每个模块的知识点串联起来如集合框架→线程安全集合→多线程同步形成知识网。看源码重点看ArrayList的add()、HashMap的put()、Thread的start()等核心方法理解底层实现。刷面试题针对每个知识点找 5-10 道高频题练习如牛客网、力扣 Java 面试专题确保能清晰表达。模拟面试找同学互相提问训练临场反应避免紧张忘词。核心是 “理解原理 能举例子”面试官更看重你是否真的懂而不是背概念。比如讲 HashMap 时能说出自己项目中遇到的哈希冲突问题及解决方法会比单纯背流程更加分。List list new ArrayList(); 这个是小类型转换成大类型是自动转换是吗如果反过来呢在 Java 中List list new ArrayList(); 涉及的是多态中的向上转型而非基本数据类型的自动转换小转大但逻辑上有相似之处ArrayList 是 List 接口的实现类List 是父类型接口可视为 “抽象父类”ArrayList 是子类型。这种 “父类引用指向子类对象” 的写法是自动向上转型无需显式声明编译器允许这种转换因为子类一定符合父类的接口规范。如果反过来写 ArrayList arrayList new List();则完全不允许原因是List 是接口不能直接实例化new List() 本身语法错误即使是类之间的转换如 ArrayList 与 LinkedList同属 List 子类型父类型也不能直接转换为子类型因为父类型引用的对象可能根本不是目标子类型的实例。若要将父类型引用转回子类型必须满足两个条件父类型引用的实际对象是目标子类型的实例必须通过显式强制转型声明。例如
List list new ArrayList(); // 向上转型自动
ArrayList arrayList (ArrayList) list; // 向下转型显式强制合法因为list实际指向ArrayList
但如果实际对象类型不匹配强制转型会抛出 ClassCastException
List list new LinkedList();
ArrayList arrayList (ArrayList) list; // 运行时异常LinkedList不能转为ArrayList