日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java 笔试:常见题目总结,android混合开发lua

發(fā)布時(shí)間:2024/3/26 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 笔试:常见题目总结,android混合开发lua 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

}

}

執(zhí)行結(jié)果是:

2

分析:try中的return語(yǔ)句調(diào)用的函數(shù)先于finally中調(diào)用的函數(shù)執(zhí)行,

也就是說return語(yǔ)句先執(zhí)行,finally語(yǔ)句后執(zhí)行,所以,返回的結(jié)果是2。

Return并不是讓函數(shù)馬上返回,而是return語(yǔ)句執(zhí)行后,

將把返回結(jié)果放置進(jìn)函數(shù)棧中,此時(shí)函數(shù)并不是馬上返回,

它要執(zhí)行finally語(yǔ)句后才真正開始返回。

下面用一個(gè)程序來幫助分析:

public class Test {

public static void main(String[] args) {

System.out.println(new Test().test());;

}

int test()

{

try {

return func1();

}

finally {

return func2();

}

}

int func1()

{

System.out.println(“func1”);

return 1;

}

int func2()

{

System.out.println(“func2”);

return 2;

}

}

執(zhí)行結(jié)果:

func1

func2

2

結(jié)論:finally中的代碼比return 和break語(yǔ)句后執(zhí)行


3. final, finally, finalize的區(qū)別

  • final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。內(nèi)部類要訪問局部變量,局部變量必須定義成final類型

  • finally是異常處理語(yǔ)句結(jié)構(gòu)的一部分,表示總是執(zhí)行。

  • finalize是Object類的一個(gè)方法,在垃圾收集器執(zhí)行的時(shí)候會(huì)調(diào)用被回收對(duì)象的此方法,可以覆蓋此方法提供垃圾收集時(shí)的其他資源回收,例如關(guān)閉文件等。JVM不保證此方法總被調(diào)用


4. Java中的異常處理機(jī)制的簡(jiǎn)單原理和應(yīng)用

Java對(duì)異常進(jìn)行了分類,不同類型的異常分別用不同的Java類表示,所有異常的根類為java.lang.Throwable,Throwable下面又派生了兩個(gè)子類:Error和Exception。

  • Error 表示應(yīng)用程序本身無法克服和恢復(fù)的一種嚴(yán)重問題,程序只有死的份了,例如,說內(nèi)存溢出和線程死鎖等系統(tǒng)問題。

  • Exception表示程序還能夠克服和恢復(fù)的問題,其中又分為系統(tǒng)異常和普通異常,系統(tǒng)異常是軟件本身缺陷所導(dǎo)致的問題,也就是軟件開發(fā)人員考慮不周所導(dǎo)致的問題,軟件使用者無法克服和恢復(fù)這種問題,但在這種問題下還可以讓軟件系統(tǒng)繼續(xù)運(yùn)行或者讓軟件死掉,例如:

數(shù)組越界(ArrayIndexOutOfBoundsException)

空指針異常(NullPointerException)

類轉(zhuǎn)換異常(ClassCastException)

找不到類(ClassNotFoundException)

普通異常是運(yùn)行環(huán)境的變化或異常所導(dǎo)致的問題,是用戶能夠克服的問題,例如:網(wǎng)絡(luò)斷線,硬盤空間不夠,發(fā)生這樣的異常后,程序不應(yīng)該死掉。

java為系統(tǒng)異常和普通異常提供了不同的解決方案,編譯器強(qiáng)制

  • 系統(tǒng)異常可以處理也可以不處理,所以,編譯器不強(qiáng)制用try…catch處理或用throws聲明,所以系統(tǒng)異常也稱為unchecked異常。

  • 普通異常必須try…catch處理或用throws聲明繼續(xù)拋給上層調(diào)用方法處理,所以普通異常也稱為checked異常。

提示答題者,就按照三個(gè)級(jí)別去思考:

虛擬機(jī)必須宕機(jī)的錯(cuò)誤

程序可以死掉也可以不死掉的錯(cuò)誤

程序不應(yīng)該死掉的錯(cuò)誤


5. sleep() 和 wait() 有什么區(qū)別?

  • sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。

  • wait是Object類的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。)

下面用一個(gè)例子來說明:

public class Test {

public static void main(String[] args) {

new Thread(new Thread1()).start();

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

new Thread(new Thread2()).start();

}

private static class Thread1 implements Runnable {

@Override

public void run() {

// 由于這里的Thread1和下面的Thread2內(nèi)部run方法要用同一對(duì)象作為監(jiān)視器,

// 我們這里不能用this,因?yàn)樵赥hread2里面的this和這個(gè)Thread1的this不是同一個(gè)對(duì)象。

// 我們用Test.class這個(gè)字節(jié)碼對(duì)象,當(dāng)前虛擬機(jī)里引用這個(gè)變量時(shí),指向的都是同一個(gè)對(duì)象。

synchronized (Test.class) {

System.out.println(“enter thread1…”);

System.out.println(“thread1 is waiting”);

try {

// 釋放鎖有兩種方式:

// 第一種方式是程序自然離開監(jiān)視器的范圍,也就是離開了synchronized關(guān)鍵字管轄的代碼范圍,

// 另一種方式就是在synchronized關(guān)鍵字管轄的代碼內(nèi)部調(diào)用監(jiān)視器對(duì)象的wait方法。

// 這里,使用wait方法釋放鎖。

Test.class.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“thread1 is going on…”);

System.out.println(“thread1 is being over!”);

}

}

}

private static class Thread2 implements Runnable {

@Override

public void run() {

synchronized (Test.class) {

System.out.println(“enter thread2…”);

System.out.println(“thread2 notify other thread can release wait status…”);

// 由于notify方法并不釋放鎖,

// 即使thread2調(diào)用下面的sleep方法休息了10毫秒,

// 但thread1仍然不會(huì)執(zhí)行,因?yàn)閠hread2沒有釋放鎖,所以Thread1無法得不到鎖。

Test.class.notify();

System.out.println(“thread2 is sleeping ten millisecond…”);

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(“thread2 is going on…”);

System.out.println(“thread2 is being over!”);

}

}

}

}

執(zhí)行結(jié)果:

enter thread1…

thread1 is waiting

enter thread2…

thread2 notify other thread can release wait status…

thread2 is sleeping ten millisecond…

thread2 is going on…

thread2 is being over!

thread1 is going on…

thread1 is being over!

  • sleep就是正在執(zhí)行的線程主動(dòng)讓出cpu,cpu去執(zhí)行其他線程,在sleep指定的時(shí)間過后,cpu才會(huì)回到這個(gè)線程上繼續(xù)往下執(zhí)行,如果當(dāng)前線程進(jìn)入了同步鎖,sleep方法并不會(huì)釋放鎖,即使當(dāng)前線程使用sleep方法讓出了cpu,但其他被同步鎖擋住了的線程也無法得到執(zhí)行

  • wait是指在一個(gè)已經(jīng)進(jìn)入了同步鎖的線程內(nèi),讓自己暫時(shí)讓出同步鎖,以便其他正在等待此鎖的線程可以得到同步鎖并運(yùn)行,只有其他線程調(diào)用了notify()方法(notify并不釋放鎖,只是告訴調(diào)用過wait方法的線程可以去參與獲得鎖的競(jìng)爭(zhēng)了,但不是馬上得到鎖,因?yàn)殒i還在別人手里,別人還沒釋放。如果notify方法后面的代碼還有很多,需要這些代碼執(zhí)行完后才會(huì)釋放鎖,可以在notfiy方法后增加一個(gè)等待和一些代碼,看看效果),調(diào)用w

《Android學(xué)習(xí)筆記總結(jié)+最新移動(dòng)架構(gòu)視頻+大廠安卓面試真題+項(xiàng)目實(shí)戰(zhàn)源碼講義》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整內(nèi)容開源分享

ait方法的線程就會(huì)解除wait狀態(tài)和程序可以再次得到鎖后繼續(xù)向下運(yùn)行。wait()必須在synchronized內(nèi)部調(diào)用


6. 當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法?

分幾種情況:

  • 其他方法前是否加了synchronized關(guān)鍵字,如果沒加,則能。

  • 如果這個(gè)方法內(nèi)部調(diào)用了wait,則可以進(jìn)入其他synchronized方法。

  • 如果其他個(gè)方法都加了synchronized關(guān)鍵字,并且內(nèi)部沒有調(diào)用wait,則不能。

  • 如果其他方法是static,它用的同步鎖是當(dāng)前類的字節(jié)碼,與非靜態(tài)的方法不能同步,因?yàn)榉庆o態(tài)的方法用的是this。


  • 7. 簡(jiǎn)述synchronized和java.util.concurrent.locks.Lock的異同?

    • 主要相同點(diǎn):Lock能完成synchronized所實(shí)現(xiàn)的所有功能

    • 主要不同點(diǎn):Lock有比synchronized更精確的線程語(yǔ)義和更好的性能。synchronized會(huì)自動(dòng)釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。Lock還有更強(qiáng)大的功能,例如,它的tryLock方法可以非阻塞方式去拿鎖。

    例子:

    import java.util.concurrent.locks.Lock;

    import java.util.concurrent.locks.ReentrantLock;

    public class Test {

    private int j;

    // ReentrantLock 可重入鎖,

    // 一個(gè)線程可以對(duì)已被加鎖的ReentrantLock鎖再次加鎖

    private Lock lock = new ReentrantLock();

    public static void main(String[] args) {

    Test tt = new Test();

    new Thread(tt.new Adder()).start();

    new Thread(tt.new SubTractor()).start();

    }

    private class SubTractor implements Runnable {

    @Override

    public void run() {

    while (true) {

    // synchronized (Test.this) {

    // System.out.println(“j–=” + j–);

    // //這里拋異常了,鎖能釋放嗎?

    // }

    lock.lock();

    try {

    System.out.println("j-- = " + j–);

    } finally {

    lock.unlock();

    }

    }

    }

    }

    private class Adder implements Runnable {

    @Override

    public void run() {

    while (true) {

    // synchronized (Test.this) {

    // System.out.println(“j++=” + j++);

    // }

    lock.lock();

    try {

    System.out.println("j++ = " + j++);

    } finally {

    lock.unlock();

    }

    }

    }

    }

    }

    執(zhí)行結(jié)果:

    ···

    j++ = 42218

    j++ = 42219

    j++ = 42220

    j-- = 42221

    j-- = 42220

    j-- = 42219

    ···


    8. 設(shè)計(jì)4個(gè)線程,其中兩個(gè)線程每次對(duì)j增加1,另外兩個(gè)線程對(duì)j每次減少1。寫出程序

    public class Test {

    private int j;

    public static void main(String args[]) {

    Test tt = new Test();

    Inc inc = tt.new Inc();

    Dec dec = tt.new Dec();

    for (int i = 0; i < 2; i++) {

    Thread t = new Thread(inc);

    t.start();

    t = new Thread(dec);

    t.start();

    }

    }

    private synchronized void inc() {

    j++;

    System.out.println(Thread.currentThread().getName() + “-inc:” + j);

    }

    private synchronized void dec() {

    j–;

    System.out.println(Thread.currentThread().getName() + “-dec:” + j);

    }

    class Inc implements Runnable {

    public void run() {

    for (int i = 0; i < 100; i++) {

    inc();

    }

    }

    }

    class Dec implements Runnable {

    public void run() {

    for (int i = 0; i < 100; i++) {

    dec();

    }

    }

    }

    }

    執(zhí)行結(jié)果:

    ···

    Thread-0-inc:5

    Thread-0-inc:6

    Thread-2-inc:7

    Thread-2-inc:8

    ···

    Thread-2-inc:105

    Thread-2-inc:106

    Thread-3-dec:105

    Thread-3-dec:104

    ···

    Thread-3-dec:7

    Thread-3-dec:6

    Thread-1-dec:5

    Thread-1-dec:4

    ···

    Thread-1-dec:-20

    Thread-1-dec:-21

    Thread-0-inc:-20

    Thread-0-inc:-19

    ···


    9. 子線程循環(huán)10次,接著主線程循環(huán)5次,接著又回到子線程循環(huán)10次,接著再回到主線程又循環(huán)5次數(shù)。如此循環(huán)50次,請(qǐng)寫出程序

    public class Test {

    public static void main(String[] args) {

    new Test().init();

    }

    public void init() {

    final Business business = new Business();

    new Thread(new Runnable() {

    public void run() {

    for (int i = 0; i < 50; i++) {

    business.SubThread(i); // 子線程

    }

    }

    }).start();

    for (int i = 0; i < 50; i++) {

    business.MainThread(i); // 主線程

    }

    }

    private class Business {

    //這里相當(dāng)于定義了控制該誰(shuí)執(zhí)行的一個(gè)信號(hào)燈

    boolean isShouldSub = true;

    public synchronized void MainThread(int i) {

    if (isShouldSub)

    try {

    this.wait();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    for (int j = 0; j < 5; j++) {

    System.out.println(Thread.currentThread().getName() + “:i=” + i + “,j=” + j);

    }

    isShouldSub = true;

    this.notify();

    }

    public synchronized void SubThread(int i) {

    if (!isShouldSub) {

    try {

    this.wait();

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    for (int j = 0; j < 10; j++) {

    System.out.println(Thread.currentThread().getName() + “:i=” + i + “,j=” + j);

    }

    isShouldSub = false;

    this.notify();

    }

    }

    }

    執(zhí)行結(jié)果:

    ···

    Thread-0:i=48,j=7

    Thread-0:i=48,j=8

    Thread-0:i=48,j=9

    main:i=48,j=0

    main:i=48,j=1

    main:i=48,j=2

    main:i=48,j=3

    main:i=48,j=4

    Thread-0:i=49,j=0

    Thread-0:i=49,j=1

    Thread-0:i=49,j=2

    Thread-0:i=49,j=3

    Thread-0:i=49,j=4

    Thread-0:i=49,j=5

    Thread-0:i=49,j=6

    Thread-0:i=49,j=7

    Thread-0:i=49,j=8

    Thread-0:i=49,j=9

    main:i=49,j=0

    總結(jié)

    以上是生活随笔為你收集整理的Java 笔试:常见题目总结,android混合开发lua的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。