ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:47.80KB ,
资源ID:6456487      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6456487.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(腾讯百度聚美Java面试题集总全集九.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

腾讯百度聚美Java面试题集总全集九.docx

1、腾讯XX聚美Java面试题集总全集九56、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须

2、可比较,但是要求传入第二个参数,参数是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 publi

3、c String toString() return Student name= + name + , age= + age + ; 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的钻石语法(构造器后面的尖括号中不需要写类型)

4、set.add(new Student(Hao LUO, 33); set.add(new Student(XJ WANG, 32); set.add(new Student(Bruce LEE, 60); set.add(new Student(Bob YANG, 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

5、=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; /* * 获取学生姓名 */ public String getName() return name; /* * 获取学生年龄 */ public int getAge() return age; Override public String toString() retu

6、rn Student name= + name + , age= + age + ; 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(Hao LUO, 33); list.

7、add(new Student(XJ WANG, 32); list.add(new Student(Bruce LEE, 60); list.add(new Student(Bob YANG, 22); / 通过sort方法的第二个参数传入一个Comparator接口对象 / 相当于是传入一个比较对象大小的算法到sort方法中 / 由于Java中没有函数指针、仿函数、委托这样的概念 / 因此要将一个算法传入一个方法中唯一的选择就是通过接口回调 Collections.sort(list, new Comparator () Override public int compare(Studen

8、t o1, Student o2) return o1.getName().compareTo(o2.getName(); / 比较学生姓名 ); for(Student stu : list) System.out.println(stu); / 输出结果: / 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()方法都可以让线程暂停执行,它们

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

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

11、Node.js就采用了单线程异步I/O的工作模式。58、线程的sleep()方法和yield()方法有什么区别?答: sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会; 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态; sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常; sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。59、当一

12、个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?答:不能。其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获得对象的锁,如果已经进入A方法说明对象锁已经被取走,那么试图进入B方法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁。60、请说出与线程同步以及线程调度相关的方法。答: - wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁; - sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理Interr

13、uptedException异常; - notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且与优先级无关; - notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;补充:Java 5通过Lock接口提供了显式的锁机制(explicit lock),增强了灵活性以及对线程的协调。Lock接口中定义了加锁(lock())和解锁(unlock())的方法,同时还提供了newCondition()方法来产生用于线程之间通信的Con

14、dition对象;此外,Java 5还提供了信号量机制(semaphore),信号量可以用来限制对某个共享资源进行访问的线程的数量。在对资源进行访问之前,线程必须得到信号量的许可(调用Semaphore对象的acquire()方法);在完成对资源的访问后,线程必须向信号量归还许可(调用Semaphore对象的release()方法)。下面的例子演示了100个线程同时向一个银行账户中存入1元钱,在没有使用同步机制和使用同步机制情况下的执行情况。 银行账户类: /* * 银行账户 * author 骆昊 * */public class Account private double balance

15、; / 账户余额 /* * 存款 * param money 存入金额 */ public void deposit(double money) double newBalance = balance + money; try Thread.sleep(10); / 模拟此业务需要一段处理时间 catch(InterruptedException ex) ex.printStackTrace(); balance = newBalance; /* * 获得账户余额 */ public double getBalance() return balance; 存钱线程类: /* * 存钱线程 *

16、author 骆昊 * */public class AddMoneyThread implements Runnable private Account account; / 存入账户 private double money; / 存入金额 public AddMoneyThread(Account account, double money) this.account = account; this.money = money; Override public void run() account.deposit(money); 测试类: import java.util.concurr

17、ent.ExecutorService;import java.util.concurrent.Executors;public class Test01 public static void main(String args) Account account = new Account(); ExecutorService service = Executors.newFixedThreadPool(100); for(int i = 1; i = 100; i+) service.execute(new AddMoneyThread(account, 1); service.shutdow

18、n(); while(!service.isTerminated() System.out.println(账户余额: + account.getBalance(); 在没有同步的情况下,执行结果通常是显示账户余额在10元以下,出现这种状况的原因是,当一个线程A试图存入1元的时候,另外一个线程B也能够进入存款的方法中,线程B读取到的账户余额仍然是线程A存入1元钱之前的账户余额,因此也是在原来的余额0上面做了加1元的操作,同理线程C也会做类似的事情,所以最后100个线程执行结束时,本来期望账户余额为100元,但实际得到的通常在10元以下(很可能是1元哦)。解决这个问题的办法就是同步,当一个线程对

19、银行账户存钱时,需要将此账户锁定,待其操作完成后才允许其他的线程进行操作,代码有如下几种调整方案: 在银行账户的存款(deposit)方法上同步(synchronized)关键字 /* * 银行账户 * author 骆昊 * */public class Account private double balance; / 账户余额 /* * 存款 * param money 存入金额 */ public synchronized void deposit(double money) double newBalance = balance + money; try Thread.sleep(1

20、0); / 模拟此业务需要一段处理时间 catch(InterruptedException ex) ex.printStackTrace(); balance = newBalance; /* * 获得账户余额 */ public double getBalance() return balance; 在线程调用存款方法时对银行账户进行同步 /* * 存钱线程 * author 骆昊 * */public class AddMoneyThread implements Runnable private Account account; / 存入账户 private double money;

21、 / 存入金额 public AddMoneyThread(Account account, double money) this.account = account; this.money = money; Override public void run() synchronized (account) account.deposit(money); 通过Java 5显示的锁机制,为每个银行账户创建一个锁对象,在存款操作进行加锁和解锁的操作 import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.Re

22、entrantLock;/* * 银行账户 * * author 骆昊 * */public class Account private Lock accountLock = new ReentrantLock(); private double balance; / 账户余额 /* * 存款 * * param money * 存入金额 */ public void deposit(double money) accountLock.lock(); try double newBalance = balance + money; try Thread.sleep(10); / 模拟此业务需要一段处理时间 catch (InterruptedException ex) ex.printStackTrace(); balance = newBalance; finally accountLock.unlock(); /* * 获得账户余额 */ public double getBalance() return balance; 按照上述三种方式对代码进行修改后,重写执行测试代码Test01,将看到最终的账户余额为100元。当然也可以使用Semaphore或CountdownLatch来实现同步。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1