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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 笔试:常见题目总结,soul移动端开发工程师

發布時間:2024/3/26 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 笔试:常见题目总结,soul移动端开发工程师 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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;

}

}

執行結果:

func1

func2

2

結論:finally中的代碼比return 和break語句后執行


3. final, finally, finalize的區別

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

  • finally是異常處理語句結構的一部分,表示總是執行。

  • finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。JVM不保證此方法總被調用


4. Java中的異常處理機制的簡單原理和應用

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

  • Error 表示應用程序本身無法克服和恢復的一種嚴重問題,程序只有死的份了,例如,說內存溢出和線程死鎖等系統問題。

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

數組越界(ArrayIndexOutOfBoundsException)

空指針異常(NullPointerException)

類轉換異常(ClassCastException)

找不到類(ClassNotFoundException)

普通異常是運行環境的變化或異常所導致的問題,是用戶能夠克服的問題,例如:網絡斷線,硬盤空間不夠,發生這樣的異常后,程序不應該死掉。

java為系統異常和普通異常提供了不同的解決方案,編譯器強制

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

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

提示答題者,就按照三個級別去思考:

虛擬機必須宕機的錯誤

程序可以死掉也可以不死掉的錯誤

程序不應該死掉的錯誤


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

  • sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。

  • wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。)

下面用一個例子來說明:

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內部run方法要用同一對象作為監視器,

// 我們這里不能用this,因為在Thread2里面的this和這個Thread1的this不是同一個對象。

// 我們用Test.class這個字節碼對象,當前虛擬機里引用這個變量時,指向的都是同一個對象。

synchronized (Test.class) {

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

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

try {

// 釋放鎖有兩種方式:

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

// 另一種方式就是在synchronized關鍵字管轄的代碼內部調用監視器對象的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調用下面的sleep方法休息了10毫秒,

// 但thread1仍然不會執行,因為thread2沒有釋放鎖,所以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!”);

}

}

}

}

執行結果:

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就是正在執行的線程主動讓出cpu,cpu去執行其他線程,在sleep指定的時間過后,cpu才會回到這個線程上繼續往下執行,如果當前線程進入了同步鎖,sleep方法并不會釋放鎖,即使當前線程使用sleep方法讓出了cpu,但其他被同步鎖擋住了的線程也無法得到執行

  • wait是指在一個已經進入了同步鎖的線程內,讓自己暫時讓出同步鎖,以便其他正在等待此鎖的線程可以得到同步鎖并運行,只有其他線程調用了notify()方法(notify并不釋放鎖,只是告訴調用過wait方法的線程可以去參與獲得鎖的競爭了,但不是馬上得到鎖,因為鎖還在別人手里,別人還沒釋放。如果notify方法后面的代碼還有很多,需要這些代碼執行完后才會釋放鎖,可以在notfiy方法后增加一個等待和一些代碼,看看效果),調用wait方法的線程就會解除wait狀態和程序可以再次得到鎖后繼續向下運行。wait()必須在synchronized內部調用


6. 當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?

分幾種情況:

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

  • 如果這個方法內部調用了wait,則可以進入其他synchronized方法。

  • 如果其他個方法都加了synchronized關鍵字,并且內部沒有調用wait,則不能。

  • 如果其他方法是static,它用的同步鎖是當前類的字節碼,與非靜態的方法不能同步,因為非靜態的方法用的是this。


  • 7. 簡述synchronized和java.util.concurrent.locks.Lock的異同?

    • 主要相同點:Lock能完成synchronized所實現的所有功能

    • 主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,并且必須在finally從句中釋放。Lock還有更強大的功能,例如,它的`tryLock方法

    《Android學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》

    【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整內容開源分享

    `可以非阻塞方式去拿鎖。

    例子:

    import java.util.concurrent.locks.Lock;

    import java.util.concurrent.locks.ReentrantLock;

    public class Test {

    private int j;

    // ReentrantLock 可重入鎖,

    // 一個線程可以對已被加鎖的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();

    }

    }

    }

    }

    }

    執行結果:

    ···

    j++ = 42218

    j++ = 42219

    j++ = 42220

    j-- = 42221

    j-- = 42220

    j-- = 42219

    ···


    8. 設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對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();

    }

    }

    }

    }

    執行結果:

    ···

    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. 子線程循環10次,接著主線程循環5次,接著又回到子線程循環10次,接著再回到主線程又循環5次數。如此循環50次,請寫出程序

    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 {

    //這里相當于定義了控制該誰執行的一個信號燈

    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();

    }

    }

    }

    執行結果:

    ···

    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

    main:i=49,j=1

    main:i=49,j=2

    main:i=49,j=3

    main:i=49,j=4


    10. ArrayList和Vector的區別

    • 同步性:

    Vector是線程安全的,也就是說是它的方法之間是線程同步的。而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用ArrayList,因為它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮和編寫線程安全的代碼。

    • 數據增長:

    ArrayList與Vector都有一個初始的容量大小,當存儲進它們里面的元素的個數超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數在內存空間利用與程序效率之間要取得一定的平衡。Vector默認增長為原來兩倍,而ArrayList的增長策略在文檔中沒有明確規定(從源代碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設置初始的空間大小,Vector還可以設置增長的空間大小,而ArrayList沒有提供設置增長空間的方法。

    總結

    以上是生活随笔為你收集整理的Java 笔试:常见题目总结,soul移动端开发工程师的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 你懂的网站在线 | 久久亚洲综合国产精品99麻豆精品福利 | 日本美女三级 | 国家队动漫免费观看在线观看晨光 | 国产黄色大片 | 91毛片网站| 国产高清视频在线播放 | 欧美精品亚洲精品日韩精品 | 久久人人爽人人爽人人片av高清 | 男女激情四射网站 | 不卡一二三 | 美女被草视频在线观看 | 国产一级网站 | 国产热99 | 欧美黑人一区二区 | 久久久久亚洲视频 | 成人片在线视频 | 老司机av福利 | 国产亚洲精品久久久久丝瓜 | 日韩成人精品一区 | 91jk制服白丝超短裙大长腿 | 99免费在线视频 | 久久大胆人体 | 国产区欧美区日韩区 | 少妇毛片一区二区三区粉嫩av | 麻豆出品 | 亚洲第5页| 裸体黄色片 | 天堂va蜜桃一区二区三区漫画版 | 日韩一卡 | 国产成人在线视频免费观看 | 成人久久精品人妻一区二区三区 | 九热在线视频 | 极品毛片 | 国产人人看 | 亚洲v日本 | 欧美99久久精品乱码影视 | 男女性高潮免费网站 | 97视频人人| 18被视频免费观看视频 | 国产欧美在线精品日韩 | 精品无码国产av一区二区三区 | 久久久女人 | 九色在线观看视频 | 污视频网站入口 | 免费av大片 | av看片网站 | 日韩福利一区二区 | 欧美精品黄色 | 日韩中文字幕在线一区 | 97超碰碰 | 男操女视频免费 | 精品人妻无码一区二区色欲产成人 | 黄网站色 | 调教奶奴 | 男人与雌宠物交h | 国产精品v欧美精品v日韩精品 | 天天想你在线观看完整版电影高清 | 嫩草在线视频 | 少女视频的播放方法 | 国产精品一区二区6 | 亚洲大片 | 色吧综合网 | 久久影院视频 | 亚洲天堂网在线观看视频 | 久久久com| 30一40一50老女人毛片 | 射久久久 | 黑人高潮一区二区三区在线看 | 欧美三级网 | 农村老熟妇乱子伦视频 | 日本毛片网站 | 欧美视频区 | 国产午夜精品理论片在线 | 三级黄色片免费观看 | 粉嫩视频在线观看 | 五月天视频网 | 春闺艳妇(h)高h产乳 | 亚洲国产精品综合 | 污污视频网站在线 | 哪里可以看毛片 | 亚洲精品毛片av | 免费观看污网站 | 中文字幕第6页 | 97天天操 | a黄色大片| 国产精品久久777777毛茸茸 | 男人的天堂影院 | 日本亚洲一区 | 69人妻精品久久无人专区 | 久久久看 | 久久久久久久久久电影 | 一区二区三区在线免费播放 | 免费视频91| 好吊视频一区二区三区四区 | 少妇大叫太粗太大爽一区二区 | 日本成人在线不卡 | 五月天丁香 | 日韩美一区二区三区 |