騰訊百度聚美Java面試題集總?cè)?九)_第1頁
騰訊百度聚美Java面試題集總?cè)?九)_第2頁
騰訊百度聚美Java面試題集總?cè)?九)_第3頁
騰訊百度聚美Java面試題集總?cè)?九)_第4頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、56、TreeMap和 TreeSet在排序時(shí)如何比較元素?Collections工具類中的sort()方法如何比較元素?答: TreeSet 要求存放的對(duì)象所屬的類必須實(shí)現(xiàn) Comparable 接口,該接口提供了比較元素的 compareTo() 方法,當(dāng)插入元素時(shí)會(huì)回調(diào)該方法比較元素的大小。TreeMap 要求存放的鍵值對(duì)映射的鍵必須實(shí)現(xiàn)Comparable接口從而根據(jù)鍵對(duì)元素進(jìn)行排序。 Collections 工具類的 sort 方法有兩種重載的形式,第一種要求傳入的待排序容器中存放的對(duì)象比較實(shí)現(xiàn) Comparable 接口以實(shí)現(xiàn)元素的比較;第二種不強(qiáng)制性的要求容器中的元素必須可比較,

2、 但是要求傳入第二個(gè)參數(shù), 參數(shù)是 Comparator 接口的子類型(需要重寫 compare 方法實(shí)現(xiàn)元素的比較),相當(dāng)于一個(gè)臨時(shí)定義的排序規(guī)則, 其實(shí)就是通過接口注入比較元素大小的算法, 也是對(duì)回調(diào)模式的應(yīng)用( Java 中對(duì)函數(shù)式編程的支持)。例子 1:public class Student implements Comparable<Student> String name;/姓名private int age;/年齡privatename;public Student(String name, int age) this.age = age;Overridethis.

3、name =例子2:public String toString() name + ", age=" + age + ""Overridepublic int compareTo(Student o) o.age; /比較年齡 ( 年齡的升序 )return "Student name=" +return this.age -public static voidmain(String args) Set<Student> set = new TreeSet<>();/ Java 7的鉆石語法( 構(gòu)造器后面的尖括

4、號(hào)中不需要寫類型)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) /輸出結(jié)果 : /YANG, age=22/Student name=XJ WANG,age=32/Student name=Hao LUO,age=33/Student nam

5、e=Bruce LEE, age=60Student name=Bobpublic class Student private int age;private String name;/年齡/姓名name;public Student(String name, int age) this.age = age; =/*獲取學(xué)生姓名*/public String getName() /*獲取學(xué)生年齡*/public int getAge() return name;return age;Overridepublic String toString() return"St

6、udent name=" + name + ", age=" + age + ""import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;class Test02 public static voidmain(String args) List<Student> list = new ArrayList<>();/ Java7 的鉆石語法 ( 構(gòu)造器后面的尖括號(hào)中不需

7、要寫類型 )list.add(new Student("Hao LUO",33);list.add(new Student("XJ WANG",32);list.add(new Student("Bruce LEE",60);list.add(new Student("Bob YANG", 22);/通過 sort方法的第二個(gè)參數(shù)傳入一個(gè)Comparator 接口對(duì)象/ 相當(dāng)于是傳入一個(gè)比較對(duì)象大小的算法到 sort 方法中/ 由于 Java 中沒有函數(shù)指針、仿函數(shù)、委托這樣的概念/ 因此要將一個(gè)算法傳入一個(gè)方法中

8、唯一的選擇就是通過接口回調(diào)Collections.sort(list, new Comparator<Student> () Overridepublic intcompare(Student o1, Student o2) returno1.getName().compareTo(o2.getName();/比較學(xué)生姓名);for(Student stu : list) /輸出結(jié)果 : /Student name=BobYANG, age=22/Student name=Bruce LEE,age=60/Student name=Hao LUO,age=33/Student na

9、me=XJ WANG, age=3257、Thread 類的 sleep() 方法和對(duì)象的 wait() 方法都可以讓線程暫停執(zhí)行,它們有什么區(qū)別 ?答: sleep() 方法(休眠)是線程類( Thread )的靜態(tài)方法,調(diào)用此方法會(huì)讓當(dāng)前線程暫停執(zhí)行指定的時(shí)間,將執(zhí)行機(jī)會(huì)( CPU)讓給其他線程,但是對(duì)象的鎖依然保持,因此休眠時(shí)間結(jié)束后會(huì)自動(dòng)恢復(fù)(線程回到就緒狀態(tài),請(qǐng)參考第66題中的線程狀態(tài)轉(zhuǎn)換圖)。 wait() 是 Object 類的方法,調(diào)用對(duì)象的 wait() 方法導(dǎo)致當(dāng)前線程放棄對(duì)象的鎖 (線程暫停執(zhí)行) ,進(jìn)入對(duì)象的等待池 (wait pool ),只有調(diào)用對(duì)象的 notify

10、() 方法(或 notifyAll() 方法)時(shí)才能喚醒等待池中的線程進(jìn)入等鎖池( lock pool ),如果線程重新獲得對(duì)象的鎖就可以進(jìn)入就緒狀態(tài)。補(bǔ)充:可能不少人對(duì)什么是進(jìn)程, 什么是線程還比較模糊, 對(duì)于為什么需要多線程編程也不是特別理解。 簡(jiǎn)單的說:進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng), 是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位; 線程是進(jìn)程的一個(gè)實(shí)體, 是CPU調(diào)度和分派的基本單位, 是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位。線程的劃分尺度小于進(jìn)程, 這使得多線程程序的并發(fā)性高; 進(jìn)程在執(zhí)行時(shí)通常擁有獨(dú)立的內(nèi)存單元,而線程之間可以共享內(nèi)存。使用多線程的編程通常能

11、夠帶來更好的性能和用戶體驗(yàn), 但是多線程的程序?qū)τ谄渌绦蚴遣挥押玫模?因?yàn)樗赡苷加昧烁嗟?CPU 資源。當(dāng)然,也不是線程越多,程序的性能就越好,因?yàn)榫€程之間的調(diào)度和切換也會(huì)浪費(fèi) CPU時(shí)間。時(shí)下很時(shí)髦的 Node.js 就采用了單線程異步 I/O 的工作模式。58、線程的 sleep() 方法和 yield()方法有什么區(qū)別?答: sleep() 方法給其他線程運(yùn)行機(jī)會(huì)時(shí)不考慮線程的優(yōu)先級(jí), 因此會(huì)給低優(yōu)先級(jí)的線程以運(yùn)行的機(jī)會(huì); yield() 方法只會(huì)給相同優(yōu)先級(jí)或更高優(yōu)先級(jí)的線程以運(yùn)行的機(jī)會(huì); 線程執(zhí)行 sleep() 方法后轉(zhuǎn)入阻塞( blocked )狀態(tài),而執(zhí)行 yield()

12、 方法后轉(zhuǎn)入就緒( ready )狀態(tài); sleep()方法聲明拋出InterruptedException,而yield()方法沒有聲明任何異常; sleep() 方法比 yield() 方法(跟操作系統(tǒng) CPU調(diào)度相關(guān))具有更好的可移植性。59、當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的 synchronized 方法 A 之后,其它線程是否可進(jìn)入此對(duì)象的 synchronized 方法 B?答:不能。其它線程只能訪問該對(duì)象的非同步方法,同步方法則不能進(jìn)入。因?yàn)榉庆o態(tài)方法上的 synchronized 修飾符要求執(zhí)行方法時(shí)要獲得對(duì)象的鎖,如果已經(jīng)進(jìn)入 A 方法說明對(duì)象鎖已經(jīng)被取走, 那么試圖進(jìn)入 B 方法的

13、線程就只能在等鎖池(注意不是等待池哦 )中等待對(duì)象的鎖。60、請(qǐng)說出與線程同步以及線程調(diào)度相關(guān)的方法。答:- wait():使一個(gè)線程處于等待(阻塞)狀態(tài),并且釋放所持有的對(duì)象的鎖;- sleep() :使一個(gè)正在運(yùn)行的線程處于睡眠狀態(tài),是一個(gè)靜態(tài)方法,調(diào)用此方法要處理 InterruptedException異常;- notify():?jiǎn)拘岩粋€(gè)處于等待狀態(tài)的線程,當(dāng)然在調(diào)用此方法的時(shí)候,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程, 而是由 JVM確定喚醒哪個(gè)線程, 而且與優(yōu)先級(jí)無關(guān);- notityAll() :?jiǎn)拘阉刑幱诘却隣顟B(tài)的線程,該方法并不是將對(duì)象的鎖給所有線程,而是讓它們競(jìng)爭(zhēng),只有獲得

14、鎖的線程才能進(jìn)入就緒狀態(tài);補(bǔ)充:Java 5 通過 Lock 接口提供了顯式的鎖機(jī)制 (explicit lock ),增強(qiáng)了靈活 性以 及對(duì)線程的協(xié)調(diào) 。 Lock 接口 中定義了加鎖( lock() ) 和 解 鎖 ( unlock() ) 的 方 法 , 同 時(shí) 還 提 供 了 newCondition() 方法來產(chǎn)生用于線程之間通信的 Condition 對(duì)象;此外, Java 5 還提供了信號(hào)量機(jī)制( semaphore),信號(hào)量可以用來限制對(duì)某個(gè)共享資源進(jìn)行訪問的線程的數(shù)量。 在對(duì)資源進(jìn)行訪問之前,線程必須得到信號(hào)量的許可(調(diào)用Semaphore 對(duì)象的acquire() 方法);

15、在完成對(duì)資源的訪問后,線程必須向信號(hào)量歸還許可(調(diào)用 Semaphore對(duì)象的 release() 方法)。下面的例子演示了 100 個(gè)線程同時(shí)向一個(gè)銀行賬戶中存入 1 元錢,在沒有使用同步機(jī)制和使用同步機(jī)制情況下的執(zhí)行情況。銀行賬戶類:/* 銀行賬戶* author 駱昊*/publicclass Account privatedouble balance;/賬戶余額/* 存款* param money 存入金額*/public void deposit(double money) double newBalance= balance + money;try Thread.sleep(10)

16、;/模擬此業(yè)務(wù)需要一段處理時(shí)間catch(InterruptedException ex) ex.printStackTrace();balance = newBalance;/*獲得賬戶余額*/public double getBalance() return balance;存錢線程類:/* 存錢線程* author 駱昊*/public class AddMoneyThread implements Runnable privateAccount account;/存入賬戶private double money;/存入金額public AddMoneyThread(Account ac

17、count, double money)this.account = account;this.money = money;Overridepublic void run() account.deposit(money);測(cè)試類:importclassTest01 publicstatic void main(String args) Account account = new Account();ExecutorService service =Executors.newFixedThreadPool(100);for(int i = 1; i <= 100;i+) service.e

18、xecute(new AddMoneyThread(account, 1);service.shutdown();while(!service.isTerminated() 賬戶余額 : " + account.getBalance();在沒有同步的情況下,執(zhí)行結(jié)果通常是顯示賬戶余額在10 元以下,出現(xiàn)這種狀況的原因是,當(dāng)一個(gè)線程 A 試圖存入 1 元的時(shí)候,另外一個(gè)線程 B 也能夠進(jìn)入存款的方法中,線程 B讀取到的賬戶余額仍然是線程 A存入 1 元錢之前的賬戶余額,因此也是在原來的余額 0 上面做了加 1 元的操作,同理線程 C也會(huì)做類似的事情,所以最后 100 個(gè)線程執(zhí)行結(jié)束時(shí),

19、 本來期望賬戶余額為100 元,但實(shí)際得到的通常在 10 元以下(很可能是 1 元哦)。解決這個(gè)問題的辦法就是同步,當(dāng)一個(gè)線程對(duì)銀行賬戶存錢時(shí), 需要將此賬戶鎖定, 待其操作完成后才允許其他的線程進(jìn)行操作,代碼有如下幾種調(diào)整方案:在銀行賬戶的存款( deposit )方法上同步( synchronized )關(guān)鍵字/* 銀行賬戶* author 駱昊*/publicclass Account privatedouble balance;/賬戶余額/* 存款* param money 存入金額*/public synchronized void deposit(double money)doub

20、le newBalance = balance + money;try Thread.sleep(10);/模擬此業(yè)務(wù)需要一段處理時(shí)間catch(InterruptedException ex) ex.printStackTrace();balance = newBalance;/*獲得賬戶余額*/public double getBalance() return balance;在線程調(diào)用存款方法時(shí)對(duì)銀行賬戶進(jìn)行同步/* 存錢線程* author 駱昊*/public class AddMoneyThread implements Runnable Account account;/存入賬戶private double money;/存入金額privatepublic AddMoneyThread(Account account, double mone

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論