2019年Java中高级面试题总结(8)

11六、何时使用访问者模式?java

  访问者模式用于解决在类的继承层次上增长操做,可是不直接与之关联。这种模式采用双派发的形式来增长中间层。正则表达式

11七、何时使用组合模式?设计模式

  组合模式使用树结构来展现部分与总体继承关系。它容许客户端采用统一的形式来对待单个对象和对象容器。当你想要展现对象这种部分与总体的继承关系时采用组合模式。安全

11八、继承和组合之间有什么不一样?网络

  虽然两种均可以实现代码复用,可是组合比继承共灵活,由于组合容许你在运行时选择不一样的实现。用组合实现的代码也比继承测试起来更加简单。函数

11九、描述 Java 中的重载和重写?工具

  重载和重写都容许你用相同的名称来实现不一样的功能,可是重载是编译时活动,而重写是运行时活动。你能够在同一个类中重载方法,可是只能在子类中重写方法。重写必需要有继承。测试

120、Java 中,嵌套公共静态类与顶级类有什么不一样?spa

  类的内部能够有多个嵌套公共静态类,可是一个 Java 源文件只能有一个顶级公共类,而且顶级公共类的名称与源文件名称必须一致。设计

12一、 OOP 中的 组合、聚合和关联有什么区别?

若是两个对象彼此有关系,就说他们是彼此相关联的。组合和聚合是面向对象中的两种形式的关联。组合是一种比聚合更强力的关联。组合中,一个对象是另外一个的拥有者,而聚合则是指一个对象使用另外一个对象。若是对象 A 是由对象 B组合的,则 A 不存在的话,B 必定不存在,可是若是 A 对象聚合了一个对象 B,则即便 A 不存在了,B 也能够单独存在。

12二、给我一个符合开闭原则的设计模式的例子?

开闭原则要求你的代码对扩展开放,对修改关闭。这个意思就是说,若是你想增长一个新的功能,你能够很容易的在不改变已测试过的代码的前提下增长新的代码。有好几个设计模式是基于开闭原则的,如策略模式,若是你须要一个新的策略,只须要实现接口,增长配置,不须要改变核心逻辑。一个正在工做的例子是Collections.sort() 方法,这就是基于策略模式,遵循开闭原则的,你不需为新的对象修改 sort() 方法,你须要作的仅仅是实现你本身的 Comparator 接口。

12三、抽象工厂模式和原型模式之间的区别?

抽象工厂模式:一般由工厂方法模式来实现。但一个工厂中每每含有多个工厂方法生成一系列的产品。这个模式强调的是客户代码一次保证只使用一个系列的产品。当要切换为另外一个系列的产品,换一个工厂类便可。原型模式:工厂方法的最大缺点就是,对应一个继承体系的产品类,要有一个一样复杂的工厂类的继承体系。咱们能够把工厂类中的工厂方法放到产品类自身之中吗?若是这样的话,就能够将两个继承体系为一个。这也就是原型模式的思想,原型模式中的工厂方法为 clone,它会返回一个拷贝(能够是浅拷贝,也能够是深拷贝,由设计者决定)。为了保证用户代码中到时能够经过指针调用 clone 来动态绑定地生成所需的具体的类。这些原型对象必须事先构造好。原型模式想对工厂方法模式的另外一个好处是,拷贝的效率通常对构造的效率要高。

12四、何时使用享元模式?

  享元模式经过共享对象来避免建立太多的对象。为了使用享元模式,你须要确保你的对象是不可变的,这样你才能安全的共享。JDK 中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。

12五、嵌套静态类与顶级类有什么区别?

一个公共的顶级类的源文件名称与类名相同,而嵌套静态类没有这个要求。一个嵌套类位于顶级类内部,须要使用顶级类的名称来引用嵌套静态类,如HashMap.Entry 是一个嵌套静态类,HashMap 是一个顶级类,Entry 是一个嵌套静态类。

12六、你能写出一个正则表达式来判断一个字符串是不是一个数字吗?

一个数字字符串,只能包含数字,如 0 到 9 以及 +、- 开头,经过这个信息,你能够下一个以下的正则表达式来判断给定的字符串是否是数字。首先要 import java.util.regex.Pattern 和 java.util.regex.Matcher

public Boolean isNumeric(String str){
    Pattern pattern = Pattern.compile("[0-9]*");
    Matcher isNum = pattern.matcher(str);
    if( !isNum.matches() ){
        return false;
    }
    return true;}

12七、Java 中,受检查异常 和 不受检查异常的区别?

受检查异常编译器在编译期间检查。对于这种异常,方法强制处理或者经过throws 子句声明。其中一种状况是 Exception 的子类但不是RuntimeException 的子类。非受检查是 RuntimeException 的子类,在编译阶段不受编译器的检查。

12八、Java 中,throw 和 throws 有什么区别

throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你能够经过关键字 throw 抛出一个 Error 或者 一个 Exception,如:throw new IllegalArgumentException(“size must be multiple of 2″)而 throws 的做用是做为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。

12九、Java 中,Serializable 与 Externalizable 的区别?

Serializable 接口是一个序列化 Java 类的接口,以便于它们能够在网络上传输或者能够将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱并且不安全。Externalizable 容许你控制整个序列化过程,指定特定的二进制格式,增长安全机制。

130、Java 中,DOM 和 SAX 解析器有什么不一样?

DOM 解析器将整个 XML 文档加载到内存来建立一棵 DOM 模型树,这样能够更快的查找节点和修改 XML 结构,而 SAX 解析器是一个基于事件的解析器,不会将整个 XML 文档加载到内存。因为这个缘由,DOM 比 SAX 更快,也要求更多的内存,不适合于解析大 XML 文件。

13一、说出 JDK 1.7 中的三个新特性?

虽然 JDK 1.7 不像 JDK 5 和 8 同样的大版本,可是,仍是有不少新的特性,如 try-with-resource 语句,这样你在使用流或者资源的时候,就不须要手动关闭,Java 会自动关闭。Fork-Join 池某种程度上实现 Java 版的 Map-reduce。容许 Switch 中有 String 变量和文本。菱形操做符(<>)用于类型推断,再也不须要在变量声明的右边申明泛型,所以能够写出可读写更强、更简洁的代码。另外一个值得一提的特性是改善异常处理,如容许在同一个 catch 块中捕获多个异常。

13二、说出 5 个 JDK 1.8 引入的新特性?

Java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:

(1)Lambda 表达式,容许像对象同样传递匿名函数

(2)Stream API,充分利用现代多核 CPU,能够写出很简洁的代码

(3)Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用

(4)扩展方法,如今,接口中能够有静态、默认方法。

(5)重复注解,如今你能够将相同的注解在同一类型上使用屡次。

13三、Java 中,Maven 和 ANT 有什么区别?

虽然二者功能上都是构建工具,都用于建立 Java 应用,可是 Maven 作的事情更多,在基于“约定优于配置”的概念下,提供标准的Java 项目结构,同时能为应用自动管理依赖(应用中所依赖的 JAR 文件)。Ant仅仅是软件构建工具,而Maven的定位是软件项目管理和理解工具。Maven除了具有Ant的功能外,有如下主要的功能: 

(1)使用Project Object Model来对软件项目管理;

(2)内置了更多的隐式规则,使得构建文件更加简单;

(3)内置依赖管理和Repository来实现依赖的管理和统一存储;

(4)内置了软件构建的生命周期;

相关文章
相关标签/搜索