java基礎面試題一

喜歡這篇文章的小夥伴,請識別下方二維碼關注本公衆號,小編不定期贈送免費的學習資源哦

在這裏插入圖片描述
關注公衆號,我會不定期贈送各種java學習資源
在這裏插入圖片描述
下面是我的個人微信號,歡迎叨擾!
在這裏插入圖片描述

java 面向對象三大特性(封裝,繼承,多態)以及抽象、接口的介紹,訪問控制符public,protected,private,以及默認的區別

封裝

1.定義:隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別
2.封裝的目的是:增強安全性和簡化編程,使用者不必瞭解具體的實現細節,而只是要通過外部接口,一特定的訪問權限來使用類的成員。
3.封裝的基本要求是:把所有的屬性私有化,對每個屬性提供getter和setter方法,如果有一個帶參的構造函數的話,那一定要寫一個不帶參的構造函數。

繼承

當兩個類具有相同的特徵(屬性)和行爲(方法)時,可以將相同的部分抽取出來放到一個類中作爲父類,其它兩個類繼承這個父類。繼承後子類自動擁有了父類的屬性和方法,但特別注意的是,父類的私有屬性和構造方法並不能被繼承;子類可以寫自己特有的屬性和方法,目的是實現功能的擴展,子類也可以複寫父類的方法即方法的重寫。子類不能繼承父類中訪問權限爲private的成員變量和方法。子類可以重寫父類的方法,及命名與父類同名的成員變量

多態

多態的實現方式:
(1)基於繼承實現的多態
基於繼承的實現機制主要表現在父類和繼承該父類的一個或多個子類對某些方法的重寫,多個子類對同一方法的重寫可以表現出不同的行爲。
(2)基於接口實現的多態
繼承是通過重寫父類的同一方法的幾個不同子類來體現的,那麼就可就是通過實現接口並覆蓋接口中同一方法的幾不同的類體現的。

接口與抽象類的區別:

不同點:
1、接口可以多實現,而抽象類只能單繼承
2、抽象類可以有非抽象的方法和構造方法、變量,但是接口只能有抽象方法,靜態常量。
3、抽象類和子類具有父子關係,子類能擁有父類中一些屬性。接口雖然某個類實現一個接口,但是由於接口中的變量都爲靜態常量,不存在繼承關係。

相同點:
1、無論接口還是抽象類,都無法直接實例化,其自身實例化需要靠實現類或子類來實現。
2、接口和抽象類都必須實現其中的所有方法。

String、StringBuffer和StringBuilder的區別

String是常量,是一個不可變的對象,每一次對一個字符串進行拼接操作時,都會創建一個新的字符串對象,導致內存嚴重浪費。
StringBuffer和StringBuilder都是可變的字符串對象,StringBuffer是線程不安全的,StringBuilder是線程安全的;

equals 和 == 的區別?

如果重寫看eques方法之後,==比較的是地址,eques比較的是內容是否相同
Object類裏面的eques方法是用==來實現的

你瞭解多線程嗎,它的創建方式有幾種

1.  繼承Thread類
2. 實現Runnable接口
3. 應用程序可以使用Executor框架來創建線程池
4. 實現Callable接口。
我更喜歡實現Runnable接口這種方法,當然這也是現在大多程序員會選用的方法。因爲一個類只能繼承一個父類而可以實現多個接口。同時,線程池也是非常高效的,很容易實現和使用。

繼承Thread類

1.書寫一個類繼承Thread並重寫run方法
2.使用start()方法來啓動線程

實現Runnable接口

1.書寫一個類實現Runnable並重寫run方法
2.創建一個Runnable對象
3.創建一個Thread對象,將 Runnable當作參數傳遞到Runnable對象中
4.使用start()方法來啓動線程
看下例子
//實現Runnable接口
public class MyThread2 implements Runnable {
  public void run(){
  	//重寫run方法
  }
}
public class Main {
  public static void main(String[] args){
    //創建一個Runnable對象
    MyThread2 myThread=new MyThread2();
      //創建一個Thread對象,將 Runnable當作參數傳遞到Runnable對象中
    Thread thread=new Thread(myThread);
      //啓動線程
    thread().start();
  }
}

實現Callable接口。

他和其他創建線程的方式最大的區別在於實現Callable接口可以返回線程運算的結果
1.創建一個類實現Callable接口重寫call方法,返回運算的值
2.創建Callable對象
3.創建FutureTask對象傳入參數Callable對象
4.創建Thread對象傳入參數FutureTask對象並start()啓動
5.使用FutureTask對象.get()獲取線程運算的結果
例子
//創建一個類實現Callable接口重寫call方法
class MyThread implements Callable<Integer> {
    //返回運算的值
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
        	sum += i;
    	}
    	return sum;
    }
}
public class TestCallable{
	public static void main(String[] args) throws Exception {
    	//創建Callable對象
        MyThread mt = new MyThread();
    	//創建FutureTask對象傳入參數Callable對象
        FutureTask<Integer> result = new FutureTask<Integer>(mt);
        //創建Thread對象傳入參數FutureTask對象並start()啓動
        new Thread(result).start();
        //使用FutureTask對象.get()獲取線程運算的結果
        Integer sum = result.get();
        System.out.println(sum);
    }
}

線程池的創建

https://blog.csdn.net/qq_37561309/article/details/84071579 你大概看一下

什麼是線程死鎖

是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去 。

死鎖產生條件以及解決方案(瞭解,感覺不會問)

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要下列條件之一不滿足,就不會發生死鎖。 
- 互斥條件:一個資源每次只能被一個進程使用。 
- 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。 
- 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。 
- 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。 
死鎖的解除與預防:
在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確 定資源的合理分配算法,避免進程永久佔據系統資源。此外,也要防止進程在處於等待狀態的情況下佔用資源。

List,Set,Map三者的區別及總結

List接口存儲有序的對象,數據可以重複
Set:數據無序,而且不可重複
Map:使用鍵值對存儲。值可以重複,鍵不可重複

Arraylist 與 LinkedList 區別都屬於線程不安全

Arraylist底層使用的是數組(查詢快,插入刪除慢)
LinkedList底層使用的是雙向循環鏈表數據結構(插入刪除快,查詢慢)

ArrayList 與 Vector 區別(爲什麼要用Arraylist取代Vector呢?)

Vector是線程安全的
ArrayList 是線程不安全的

瞭解給過HashMap嘛?他是線程安全嗎?(HashMap和HashTable的區別)

1.HashMap是非線程安全的,HashTable是線程安全的;HashTable內部的方法基本都經過synchronized修飾。
2.HashMap允許有null值的存在,而在HashTable中不允許
3.ConcurrentHashMap既能保證線程安全,又能保障速度

HashMap 和 ConcurrentHashMap 的區別

ConcurrentHashMap 使用了分段鎖機制,每一個段也就是桶都用了lock鎖進行了保護,相比HashTable的每一個方法都加syn,ConcurrentHashMap 做的更加精細,所以速度更快

HashMap 沒有鎖機制,所以不是線程安全的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章