这部分面试题多用于面试的热身运动,对很多找实习和准备毕业找工作的小伙伴至关重要。
TreeMap 和TreeSet 如何排序?
TreeSet 要求存放的对象所属的类必须实现Comparable 接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap 要求存放的键值对映射的键必须实现Comparable 接口从而根据键对元素进行排序。Collections 工具类的sort 方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable 接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较, 但是要求传入第二个参数, 参数是Comparator 接口的子类型(需要重写compare 方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法, 也是对回调模式的应用( Java 中对函数式编程的支持)。
abstract方法可以是static吗?
abstract 的method 不可以是 static 的,因为抽象的方法是要被子类实现的,而static 与子类扯不上关系
面试官也有可能问abstract方法可否是native的?
native 方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以 它也不能是抽象的,不能与 abstract 混用。例如,FileOutputSteam 类要硬件打交道,底层的实现用的是操 作系统相关的 api 实现,例如,在 widows 用 c 语言实现的,所以,查看 d 的源代码,可以发现 FileOutputStream 的 open 方法的定义如下:
private native void open(String name) throws FileNotFoundException;
如果我们要用 java 调用别人写的 语言函数,我们是无法直接调用的,我们需要按照 java 的要求写一 个c 语言的函数,又我们的这个 c 语言函数去调用别人的c 语言函数。由于我们的c 语言函数是按 iava 的 要求来写的,我们这个c 语言函数就可以与 java 对接上,java 那边的对接方式就是定义出与我们这个c函 数相对应的方法,java 中对应的方法不需要写具体的代码,但需要在前面声明 native。
同样还会问关于synchronized 与abstract 合用的问题
synchronized 应该是作用在一个具体的方法上才有意义。而且,方法上的 synchronized 同步所使用的同步锁对象是 this,而抽象方法上无法确定 this 是什么。
sleep()和wait()
sleep()方法(休眠)是线程类( Thread)的静态方法,调用此方法会让当前线程 暂停执行指定的时间,将执行机会( CPU)让给其他线程, 但是对象的锁依然保 持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第66 题中的线 程状态转换图)。wait()是Object 类的方法,调用对象的wait()方法导致当前线 程放弃对象的锁(线程暂停执行), 进入对象的等待池(wait pool), 只有调用 对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池 (lock pool), 如果线程重新获得对象的锁就可以进入就绪状态。
往期文章