Java基礎(chǔ)面試題及答案

== 和 equals 的區(qū)別是什么?

  • == 解讀
    對于基本類型和引用類型 == 的作用效果是不同的,如下所示:

基本類型:比較的是值是否相同;
引用類型:比較的是引用是否相同;

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

兩個對象的 hashCode() 相同,則 equals() 也一定為 true,對嗎?

不對,兩個對象的 hashCode() 相同,equals() 不一定 true。

String str1 = "通話";
String str2 = "重地";
System. out. println(String. format("str1:%d | str2:%d",  str1. hashCode(),str2. hashCode()));
System. out. println(str1. equals(str2));
str1:1179395 | str2:1179395
false

a = a + b 與 a += b 的區(qū)別

+= 隱式的將加操作的結(jié)果類型強制轉(zhuǎn)換為持有結(jié)果的類型。如果兩個整型相加,如 byte、short 或者 int,首先會將它們提升到 int 類型,然后在執(zhí)行加法操作。

byte a = 126;
byte b = 126;
b = a + b; // error : cannot convert from int to byte
b += a; // ok

(因為 a+b 操作會將 a、b 提升為 int 類型,所以將 int 類型賦值給 byte 就會編譯出錯)

3*0.1 == 0.3 將會返回什么? true 還是 false?

false,因為有些浮點數(shù)不能完全精確的表示出來。

能在 Switch 中使用 String 嗎?

從 Java 7 開始,我們可以在 switch case 中使用字符串,但這僅僅是一個語法糖。內(nèi)部實現(xiàn)在 switch 中使用字符串的 hash code。

對equals()和hashCode()的理解?


  • 為什么在重寫 equals 方法的時候需要重寫 hashCode 方法?

因為有強制的規(guī)范指定需要同時重寫 hashcode 與 equals 是方法,許多容器類,如 HashMap、HashSet 都依賴于 hashcode 與 equals 的規(guī)定。

  • 有沒有可能兩個不相等的對象有相同的 hashcode?

有可能,兩個不相等的對象可能會有相同的 hashcode 值,這就是為什么在 hashmap 中會有沖突。相等 hashcode 值的規(guī)定只是說如果兩個對象相等,必須有相同的hashcode 值,但是沒有關(guān)于不相等對象的任何規(guī)定。

  • 兩個相同的對象會有不同的 hash code 嗎?

不能,根據(jù) hash code 的規(guī)定,這是不可能的。

final 在 Java 中有什么作用?

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

final、finalize 和 finally 的不同之處?

  • final 是一個修飾符,可以修飾變量、方法和類。如果 final 修飾變量,意味著該變量的值在初始化后不能被改變。
  • Java 技術(shù)允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的,但是什么時候調(diào)用 finalize 沒有保證。
  • finally 是一個關(guān)鍵字,與 try 和 catch 一起用于異常的處理。finally 塊一定會被執(zhí)行,無論在 try 塊中是否有發(fā)生異常。

String、StringBuffer與StringBuilder的區(qū)別?

第一點: 可變和適用范圍。String對象是不可變的,而StringBuffer和StringBuilder是可變字符序列。每次對String的操作相當于生成一個新的String對象,而對StringBuffer和StringBuilder的操作是對對象本身的操作,而不會生成新的對象,所以對于頻繁改變內(nèi)容的字符串避免使用String,因為頻繁的生成對象將會對系統(tǒng)性能產(chǎn)生影響。

第二點: 線程安全。String由于有final修飾,是immutable的,安全性是簡單而純粹的。StringBuilder和StringBuffer的區(qū)別在于StringBuilder不保證同步,也就是說如果需要線程安全需要使用StringBuffer,不需要同步的StringBuilder效率更高。

接口與抽象類的區(qū)別?

  • 一個子類只能繼承一個抽象類, 但能實現(xiàn)多個接口
  • 抽象類可以有構(gòu)造方法, 接口沒有構(gòu)造方法
  • 抽象類可以有普通成員變量, 接口沒有普通成員變量
  • 抽象類和接口都可有靜態(tài)成員變量, 抽象類中靜態(tài)成員變量訪問類型任意,接口只能public static final(默認)
  • 抽象類可以沒有抽象方法, 抽象類可以有普通方法;接口在JDK8之前都是抽象方法,在JDK8可以有default方法,在JDK9中允許有私有普通方法
  • 抽象類可以有靜態(tài)方法;接口在JDK8之前不能有靜態(tài)方法,在JDK8中可以有靜態(tài)方法,且只能被接口類直接調(diào)用(不能被實現(xiàn)類的對象調(diào)用)
  • 抽象類中的方法可以是public、protected; 接口方法在JDK8之前只有public abstract,在JDK8可以有default方法,在JDK9中允許有private方法

this() & super()在構(gòu)造方法中的區(qū)別?

  • 調(diào)用super()必須寫在子類構(gòu)造方法的第一行, 否則編譯不通過
  • super從子類調(diào)用父類構(gòu)造, this在同一類中調(diào)用其他構(gòu)造均需要放在第一行
  • 盡管可以用this調(diào)用一個構(gòu)造器, 卻不能調(diào)用2個
  • this和super不能出現(xiàn)在同一個構(gòu)造器中, 否則編譯不通過
  • this()、super()都指的對象,不可以在static環(huán)境中使用
  • 本質(zhì)this指向本對象的指針。super是一個關(guān)鍵字

Java移位運算符?

java中有三種移位運算符

  • << :左移運算符,x << 1,相當于x乘以2(不溢出的情況下),低位補0
  • >> :帶符號右移,x >> 1,相當于x除以2,正數(shù)高位補0,負數(shù)高位補1
  • >>> :無符號右移,忽略符號位,空位都以0補齊

Java 中的 Math. round(-1. 5) 等于多少?

等于 -1,因為在數(shù)軸上取值時,中間值(0.5)向右取整,所以正 0.5 是往上取整,負 0.5 是直接舍棄。

String 屬于基礎(chǔ)的數(shù)據(jù)類型嗎?

String 不屬于基礎(chǔ)類型,基礎(chǔ)類型有 8 種:byte、boolean、char、short、int、float、long、double,而 String 屬于對象。

String str="i"與 String str=new String("i")一樣嗎?

不一樣,因為內(nèi)存的分配方式不一樣。String str="i"的方式,Java 虛擬機會將其分配到常量池中;而 String str=new String("i") 則會被分到堆內(nèi)存中。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容