1. 程式人生 > 其它 >Java面試常見基礎問題

Java面試常見基礎問題

技術標籤:Java

1、equals和==有什麼區別?

==比較兩個物件在記憶體裡是不是同一個物件,就是說在記憶體裡的儲存位置一致。
如:兩個String物件儲存的值是一樣的,但是可能在記憶體裡儲存在不同的地方。

equals 是方法
== 是運算子

Equeals本質就是==,只不過String和Integer等重寫了equals方法,把它變成了值比較。

總結:
==比較的是引用;如果比較的是基本資料型別,則比較的是數值是否相等;
如果比較的是引用資料型別,則比較的是物件的地址值是否相等。
equals方法比較的是內容。

==即:equals比較的是值是否相等,==比較的是值和資料儲存位置是否相等;

也就是說equals只比較值是否相等,而比較的是兩者是否是同一個東西。

2、兩個物件的hashCode()相同,equals()相同嗎?

兩個物件的hashCode()相同,equals()不一定相同。
因為在散列表中,hashCode()相等即兩個鍵值對的雜湊值相等,然而雜湊值相等,並不一定能得出鍵值對相等。
兩個物件的值相同(x.equals(y)==true),他們的雜湊碼(hashCode)應當相同。

即:hashCode()相同,equals()不一定相同;

equals()相同,hashCode()一定相同。

3、過載和重寫的區別?

都是實現多型的方式

過載:實現的是編譯時的多型性
重寫:實現的是執行時的多型性

a)過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別、引數個數),視為過載。過載對返回值型別沒有特殊要求,
不能根據返回值型別進行區分。 b)重寫發生在子類與父類中,要求子類與父類方法有相同的引數列表; 有相容的返回型別,比父類重寫方法更好訪問,不能比父類重寫方法宣告更多的一場(里氏代換原則)

解釋:過載是子類繼承了父類的方法;

重寫是自己繼承了父類的方法,但覺得不夠好,自己又修改了繼承的方法。

4、抽象類

抽象類不能使用final修飾,因為抽象類是要被其他類繼承的,final修飾的類是不能被繼承的。

5、抽象類和介面有什麼異同?

相同:
    不能被例項化
    可以將抽象類和介面型別作為引用型別
    一個類如果繼承了抽象類或者實現某個介面,都需要對其中的抽象方法全部進行實現,否則該類仍然需要被宣告為抽象類。
不同:
    抽象類:
       抽象類中可以定義構造器
       可以有抽象方法和具體方法
       介面中的成員全都是公共的(public)
       抽象類中可以定義成員變數
       由抽象方法的類必須被宣告為抽象類;而抽象類未必要有抽象方法
       抽象類中可以包含靜態方法
       一個類只能繼承一個抽象類

    介面:
       介面中不能定義構造器
       方法全都是抽象方法
       抽象類中的成員可以是預設的、public、private、protected
       介面定義的成員變數實際上都是常量
       介面中不能有靜態方法
       一個類可以實現多個介面

6、String、StringBuffer、StringBuilder的異同?

a)   可變不可變
String:字串常量,修改時原來的字串物件不變,再重新生成新的字串物件。

StringBuffer:修改時會改變自身物件,每次操作都是對StringBuffer物件本身進行修改,不是生成新的物件。
使用場景:對字串經常改變情況下,主要方法:append(),insert()等。

StringBuilder: 物件能夠被多次的修改
b)  執行緒是否安全
String:物件定義後不可變,執行緒安全

StringBuffer:是執行緒安全的(對呼叫方法加入同步鎖),執行效率較慢,適用於多執行緒下操作字串緩衝區大量資料。

StringBuilder:執行緒不安全,適用於單執行緒字串緩衝區大量資料。
c)   共同點
1.StringBuffer、StringBuilder的方法都會呼叫AbstractStringBuilder 中的公共方法.
如 super.append(...)。

2.只是 StringBuffer 會在方法上加 synchronized 關鍵字,進行同步。最後,如果程式不是多執行緒的,那麼使用StringBuilder 效率高於 StringBuffer。

7、分散式中的CAP原理

A:可用性         保持服務可用:多節點方式
C:一致性         多節點資料一致
P:分割槽容忍性      是否可以將資料存到多個地方

一個系統不可能同時滿足CAP

AC;放棄分割槽容忍,物理資料庫
AP;可以短暫允許資料不一致,NoSql資料庫
CP:放棄可用性,zookeeper

專案用得較多的是AP

8、final在Java中的作用是什麼?

final修飾的類叫做最終類,該類不能被繼承
final修飾的方法不能被重寫
final修飾的變數叫做常量,常量必須初始化,初始化之後值就不能被修改

9、如何開啟多執行緒?

1.繼承Thread類,重寫run方法
2.實現Runnable介面,重寫run方法

10、並行和併發

並行:兩個任務同時進行,就是甲任務執行的同時,乙任務也在執行(需要多核)

併發:兩個任務都請求執行,而處理器只能接受一個任務,就把這兩個任務安排輪流執行。由於時間間隔很短,使人感覺兩個任務都在執行

11、啟動jvm是單執行緒的麼?

不是,是多執行緒的。至少會啟動垃圾回收執行緒和主執行緒

12、sleep和wait的區別?(未完)

sleep是Thread的靜態方法,wait是Object的方法,任何物件例項都能呼叫。

sleep不會釋放鎖,它也不需要佔用鎖。wait會釋放鎖,但呼叫它的前提是當前執行緒佔有鎖(即程式碼要在synchronized中)。

它們都可以被interrupted方法中斷。