Java 进阶面试问题列表

本贴最后更新于 1229 天前,其中的信息可能已经东海扬尘

Java 进阶面试问题列表个人初步整理答案

面向对象编程理念与核心设计思想

多态性、封装性、内聚、耦合

  1. 多态:把不同种类的东西当做相同的东西来处理 >

(举个例子:三个箱子,而多态的本质是什么:都是箱子,都可以打开箱子,但是打开箱子的具体动作不同(方法)

  1. 多态的优点:将各种数据统一的处理,根据对象的不同来选择最合适的方法

继承

  1. 并不是说面向对象一定有继承,比如 javascript(但是非常重要的)
  2. 多重继承(Python、C++)
  3. 多重继承的缺点
  4. Java 中的继承:extends 单继承 + implements 接口

知道哪些设计模式

  1. 工厂模式 (Spring 中的依赖注入中的 IoC 容器,BeanFactory 与 ApplicationContext)
  2. 单例模式 (Spring 中的 Bean 的生命周期 singleton 不同于我们设计模式中的单例模式,前者是容器内单例,而后者是类加载器中单例)
  3. 策略模式 (SQL 在线审核系统中执行 SQL 语句时,导师提了一个需求,SQL 具体执行的模块单独分离出来,而且可以更换不同的执行策略)
  • 接口 A 定义策略
  • B、C 类实现该策略
  • Context 组合模式 组合接口 A
  1. 模板模式(Template,典型的是 Spring 中 JDBCTemplate 类,对 JDBC 进行封装)
  • JDBCTemplate 中已经封装好 JDBC 的执行顺序,而具体执行的内容 (更新、查询)则交给子类去做
  • 小技巧:使用 Callback 回调函数形式可以避免再创建子类
  1. 适配器模式(Tomcat 中的适配器 CoyoAdapter : 在 Nio)
  2. 外观模式(Tomcat 中的外观模式,RequestFacade)
  3. 观察者模式 (Tomcat 容器启动的过程)
  1. 抽象主题 (Subject)- 具体主题 : 注册、删除、唤醒观察者
  2. 抽象观察者 (Observer)- 具体观察者

Tomcat 中容器启动过程中

  • 谁是观察者 (抽象观察者,LifecycleListener)
  • 具体观察者:ServerLifecycleListener
  • 抽象 Subject:Lifecycle
  • 具体 Subject: StandardServer
  1. 装饰者模式 (JavaIO 与装饰者)
  1. 状态模式
  2. 代理模式
  3. 责任链模式
  4. 原型模式
  5. 迭代器模式
  6. 组合模式

反模式

  1. 过早优化(在 Effective Java、Java 并发编程模型中都多次提到过过早优化的种种缺点)
  1. 不要讲大量时间花费在琐碎的问题上

  2. 魔法数与字符串(而不是用一个变量去定义,在阿里巴巴编程规范中也有强烈指出该问题)

  3. 避免那些无用的类(没有意义的类)

  4. 不要用代码的行数来衡量项目的进度 (代码行数-进度; 重量 - 飞机进度)

  5. 避免重新造轮子

  6. 类的数量多,并不代表代码更复杂

常用重构的技巧

  1. 重复代码提炼 (AOP)
  2. 冗长方法的分割
  3. 嵌套条件

思想:将不满足的条件放在前面,并及时跳出方法

class BadExample {

    public void someMethod(Object A,Object B){
        if (A != null) {
            if (B != null) {
                //code[1]
            }else {
                //code[3]
            }
        }else {
            //code[2]
        }
    }
    
}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod(Object A,Object B){
        if (A == null) {
            //code[2]
            return;
        }
        if (B == null) {
            //code[3]
            return;
        }
        //code[1]
    }
    
}

分支的合并

class BadExample {

    public void someMethod(Object A,Object B){
        if (A != null) {
            if (B != null) {
                //code
            }
        }
    }
    
}

/* ---------------------分割线---------------------- */

class GoodExample {

    public void someMethod(Object A,Object B){
        if (A != null && B != null) {
            //code
        }
    }
    
}
复制代码
  1. 一次性临时变量
  2. 过长的参数列表 (Context 上下文)
  3. 常量提取
  4. 把方法归类到类中,而不是再类之外单独实现
  5. 冗长类的拆分
  6. 将子类中重复的属性、方法提取到父类中(比如模板模式)

SOLID 原则

  1. 单一功能
  2. 开闭原则
  3. 里式替换
  4. 接口隔离 :多个接口浩宇
  5. 依赖反转 : 一个方法应该“依赖于抽象而不是一个实例”

KISS、DRY、YAGNI 原则

Java 核心概念

1. 基础类型与封装类型的区别

2. final 关键字

3. static

4. Java 中的内部类

5. StringBuilder 与 StringBuffer 区别

在 JDK1.5 之后,所有的字符串变量的连接操作(s1 + s2)都会采用 StringBuilder 来实现

6. Java 中的不可变类

7. Java 垃圾回收器简述原理

正向代理与反向代理区别

  1. shadowsocksnginx 的应用区别
    • 正向代理是:客户
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    2715 引用 • 7993 回帖 • 779 关注
  • object
    3 引用 • 3 回帖

赞助商 我要投放

2 回帖
请输入回帖内容 ...
  • xjtushilei

    后面怎么没了

    1 回复
  • tianxin

    按照它后面的问题,就是到了 Hibernate。Hibernate 并不是特别了解,上面只是先总结的一份,后面会完善。