好文档 - 专业文书写作范文服务资料分享网站

腾讯百度聚美Java面试题集总全集(九)

天下 分享 时间: 加入收藏 我要投稿 点赞

56、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。 例子1:

public class Student implements Comparable { private String name; // 姓名

private int age; // 年龄

public Student(String name, int age) { this.name = name; this.age = age; } @Override

1 / 11

public String toString() { return \name + \ } @Override

public int compareTo(Student o) { return this.age - o.age; // 比较年龄(年龄的升序) } }

import java.util.Set;

import java.util.TreeSet;class Test01 { public static void main(String[] args) {

Set set = new TreeSet<>(); // Java 7的钻石语法(构造器后面的尖括号中不需要写类型) set.add(new Student(\33)); set.add(new Student(\32)); set.add(new Student(\60)); set.add(new Student(\22)); for(Student stu : set) { System.out.println(stu);

}// 输出结果: // Student [name=Bob YANG, age=22]// Student [name=XJ WANG, age=32]// Student [name=Hao LUO,

age=33]// Student [name=Bruce LEE, age=60] } } 例子2:

public class Student { private String name; // 姓名 private int age; // 年龄

public Student(String name, int age) { this.name = name; this.age = age; } /** * 获取学生姓名 */

2 / 11

public String getName() { return name; } /** * 获取学生年龄 */

public int getAge() { return age; }

@Override public String toString() { return \ } }

import java.util.ArrayList; import java.util.Collections; import java.util.Comparator;

import java.util.List;class Test02 { public static void main(String[] args) {

List list = new ArrayList<>(); // Java 7的钻石语法(构造器后面的尖括号中不需要写类型) list.add(new Student(\33)); list.add(new Student(\32)); list.add(new Student(\

60)); list.add(new Student(\ // 通过sort方法的第二个参数传入一个Comparator接口对象

// 相当于是传入一个比较对象大小的算法到sort方法中 // 由于Java中没有函数指针、仿函数、委托这样的概念 // 因此要将一个算法传入一个方法中唯一的选择就是通过接口回调

Collections.sort(list, new Comparator () {

@Override public int

compare(Student o1, Student o2) { return o1.getName().compareTo(o2.getName()); // 比较学生姓名 }

}); for(Student stu : list) { System.out.println(stu);

3 / 11

}// 输出结果: // Student [name=Bob YANG, age=22]// Student [name=Bruce LEE, age=60]// Student [name=Hao LUO, age=33]// Student [name=XJ WANG, age=32] } }

57、Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?

答:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第66题中的线程状态转换图)。wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

补充:可能不少人对什么是进程,什么是线程还比较模糊,对于为什么需要多线程编程也不是特别理解。简单的说:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。线程的划分尺度小于进程,这使得多线程程序的并发性高;进程在执行时通常拥有独立的内存单元,而线程之间可以共享内存。使用多线程的编程通常能够带来更好的性能和用户体验,但是多线程的程序对于其他程序是不友好的,因为它可能占用了更多的CPU资源。当然,也不是线程越多,程序的性能就越好,因为线程之间的调度和切换也会浪费CPU时间。时下很时髦的Node.js就采用了单线程异步I/O的工作模式。

58、线程的sleep()方法和yield()方法有什么区别? 答:

4 / 11

① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;

② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;

③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;

④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

59、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。

60、请说出及线程同步以及线程调度相关的方法。 答:

- wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;

- sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理InterruptedException异常;

- notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且及优先级无关;

- notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;

5 / 11

腾讯百度聚美Java面试题集总全集(九)

56、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Compa
推荐度:
点击下载文档文档为doc格式
6nekm7qiwf721et5ixox47ty70kcsx004zv
领取福利

微信扫码领取福利

微信扫码分享