Java-Interview Summary

Java 中,Comparator 与 Comparable 有什么不同?

Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。

我们不难发现:Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

Final / Finally / Finalize

关键字final

Java语言的关键字final用于变量、类或方法时,含义各不相同。

  •  变量:一旦初始化,变量值就不能修改。

  •  方法:该方法不能被子类重写(override)。

  •  类:该类不能派生子类。

关键字finally

关键字finally和try/catch语句块配对使用,即使有异常抛出,也能确保某段代码一定会 执行。finally语句块会在try和catch语句块之后,在控制权交回之前执行

finalize方法

在真正销毁对象之前, 自动垃圾收集器会调用 finalize() 方法。 因此, 一个类可以重写 Object类的finalize()方法,以便定义在垃圾收集时的特定行为。

重载与重写

重载(overloading)是指两个方法的名称相同,但参数类型或个数不同

public double computeArea(Circle c) { ... }

public double computeArea(Square s) { ... }

而重写(overriding)是指某个方法与父类的方法拥有相同的名称和函数签名。

接口与抽象类

  • 一个子类只能继承一个抽象类,但能实现多个接口
  • 抽象类可以有构造方法,接口没有构造方法
  • 抽象类可以有普通成员变量,接口没有普通成员变量
  • 抽象类和接口都可有静态成员变量,抽象类中静态成员变量访问类型任意,接口只能public static final(默认)
  • 抽象类可以没有抽象方法,抽象类可以有普通方法,接口中都是抽象方法
  • 抽象类可以有静态方法,接口不能有静态方法
  • 抽象类中的方法可以是public、protected;接口方法只有public abstract

Java 8 对接口做了进一步的增强。

a.在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法)

b. 接口里可以声明静态方法,并且可以实现。

接口是什么?为什么要使用接口而不是直接使用具体类?

接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。接口中不允许普通方法,以此来保证抽象,但是 Java 8 中你可以在接口声明静态方法和默认普通方法。

Java 中,抽象类与接口之间有什么不同?

Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制

Java 中,Serializable 与 Externalizable 的区别?

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

String 字符串常量

StringBuffer 字符串变量(线程安全)

StringBuilder 字符串变量(非线程安全)

StringBuilder与StringBuffer二者之间的区别在于前者的性能更高,但非线程安全的。而StringBuffer是线程安全的。

因此在大部分情况下,建议使用StringBuilder,除非涉及多线程情况。

简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的

results matching ""

    No results matching ""