卑微小吳勵志寫博客第1天

在這裏插入圖片描述

去年12月25元旦入職到今天,已經差不多5個月了。最近覺得自己技術日益荒廢,技術不斷落後,故勵志每天寫一下博客(當然可能睡一覺明天就忘了),來記錄自己學習的過程,提醒自己還有一顆進取的心。
今天同事還說,我們已經淪爲社會底層的人,想想確實也是,帶着和保潔阿姨,門口保安一樣的外包工牌,拿着一個月都不夠花的工資,略感卑微啊,所以取名卑微小吳。還不努力一點,以後怎樣過得上年少時夢想的像鹹魚一樣可以無憂無慮躺着玩遊戲的生活。故想從今天開始,寫寫博客,做點改變。
爲了能以後能順利跳槽,拿個自己心儀的offer,先從面試題開始學習把(實在是感覺需要學習的太多了),每日記錄一點心得,一點乾貨。

1、String

1.1 String類常用的方法

在這裏插入圖片描述

1.2 String 、StringBuilder 、StringBuffer 的區別

Java 平臺提供了兩種類型的字符串:String 和 StringBuffer/StringBuilder,它們都可以儲存和操作字符串,區別如下。

  • String 是隻讀字符串,也就意味着 String 引用的字符串內容是不能被改變的。初學者可能會有這樣的誤解:

    1. String str = “abc”;
    2. str = “bcd”;
      如上,字符串 str 明明是可以改變的呀!其實不然,str 僅僅是一個引用對象,它指向一個字符串對象“abc”。第二行代碼的含義是讓 str
      重新指向了一個新的字符串“bcd”對象,而“abc”對象並沒有任何改變,只不過該對象已經成爲一個不可及對象罷了。
  • StringBuffer/StringBuilder 表示的字符串對象可以直接進行修改。

  • StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同,區別在於它是在單線程環境下使用的,因爲它的所有方法都沒有被 synchronized 修飾,因此它的效率理論上也比 StringBuffer 要高。

1.3 是否可以繼承String類? String爲什麼要用final修飾?

String類是final修飾的類,故不可以繼承。
爲了安全和效率。
因爲只有當字符串是不可變的,字符串池纔有可能實現。字符串池的實現可以在運行時節約很多heap空間,因爲不同的字符串變量都指向池中的同一個字符串。但如果字符串是可變的,那麼String interning將不能實現,因爲這樣的話,如果變量改變了它的值,那麼其它指向這個值的變量的值也會一起改變。
如果字符串是可變的,那麼會引起很嚴重的安全問題。譬如,數據庫的用戶名、密碼都是以字符串的形式傳入來獲得數據庫的連接,或者在socket編程中,主機名和端口都是以字符串的形式傳入。因爲字符串是不可變的,所以它的值是不可改變的,否則黑客們可以鑽到空子,改變字符串指向的對象的值,造成安全漏洞。
因爲字符串是不可變的,所以是多線程安全的,同一個字符串實例可以被多個線程共享。這樣便不用因爲線程安全問題而使用同步。字符串自己便是線程安全的。
因爲字符串是不可變的,所以在它創建的時候HashCode就被緩存了,不需要重新計算。這就使得字符串很適合作爲Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵往往都使用字符串。

2 Object類

在這裏插入圖片描述

2.1 Object類有11個成員方法,加上一個構造方法。

  1. public final native Class<?> getClass()
    native方法,用於返回當前運行時對象的Class對象,使用了final關鍵字修飾,故不允許子類重寫。
  2. public native int hashCode()
    native方法,用於返回對象的哈希碼,主要使用在哈希表中,比如JDK中的HashMap。
  3. public boolean equals(Object obj)//用於比較2個對象的內存地址是否相等,String類對該方法進行了重寫用戶比較字符串的值是否相等。
  4. protected native Object clone() throws CloneNotSupportedException
    naitive方法,用於創建並返回當前對象的一份拷貝。一般情況下,對於任何對象
    x,表達式 x.clone() != x 爲true,x.clone().getClass()== x.getClass()
    爲true。Object本身沒有實現Cloneable接口,所以不重寫clone方法
    並且進行調用的話會發生CloneNotSupportedException異常。
  5. public String toString()
    返回類的名字@實例的哈希碼的16進制的字符串。建議Object所有的子類都重寫這個方法。
  6. public final native void notify()//native方法,並且不能重寫。喚醒一個在此對象監視器上等待的線程(監視器相當於就是鎖的概念)。如果有多個線程在等待只會任意喚醒一個。
  7. public final native void
    notifyAll()//native方法,並且不能重寫。跟notify一樣,唯一的區別就是會喚醒在此對象監視器上等待的所有線程,而不是一個線程。
  8. public final native void wait(long timeout) throws
    InterruptedException//native方法,並且不能重寫。暫停線程的執行。注意:sleep方法沒有釋放鎖,而wait方法釋放了鎖
    。timeout是等待時間。
  9. public final void wait(long timeout, int nanos) throws
    InterruptedException//多了nanos參數,這個參數表示額外時間(以毫微秒爲單位,範圍是 0-999999)。
    所以超時的時間還需要加上nanos毫秒。
  10. public final void wait() throws InterruptedException
    跟之前的2個wait方法一樣,只不過該方法一直等待,沒有超時時間這個概念
  11. protected void finalize() throws Throwable { }
    實例被垃圾回收器回收的時候觸發的操作。

2.2 equals() 與 == 的區別

基本類型(int,char,long,boolean等)都是用 == 判斷相等性。對象引用的話,判斷引用所指的對象是否是同一個。equals是Object的成員函數,默認是使用 ==,都是比較地址值。但一般的類會覆蓋(override)這個方法,用於判斷對象的等價性。例如String類,兩個引用所指向的String都是"abc",但可能出現他們實際對應的對象並不是同一 個(和jvm實現方式有關),因此用判斷他們可能不相等,但用equals判斷一定是相等的。

2.3 Java中爲什麼需要Object類,Object類爲什麼是所有類的父類

1)可以使不同對象之間可以統一、互轉。其中還包括 toString(),wait()…等公共方法的 統一定義
2)對父類的邏輯處理統一,不需要根據有沒有父類分兩種實現。

2.4 如何保證Object是默認父類

編譯器編譯的時候自動進去的。在編譯源代碼時,當遇到沒有父類的類時,編譯器會將其指定一個默認的父類(一般爲Object),而虛擬機在處理到這個類時,由於這個類已經有一個默認的父類了,因此,VM仍然會按着常規的方法來處理每一個類。對於這種情況,從編譯後的二進制角度來看,所有的類都會有一個父類。
可以自己通過寫一個類,編譯後通過反編譯工具驗證一下。

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