【JAVA】JAVA基礎知識點備忘

1.內存分析,內存一共分爲四個部分:
  • stack segment: 存放局部變量
  • heap segment : 存放new關鍵字創建的東西,例如類的對象
  • data segment : 存放靜態變量和字符串常量(打印到控制檯的文本)
  • code segment : 存放程序的代碼

2.面向對象編程的思維:
  • 考慮這個實際問題中存在哪些類和對象
  • 考慮這些類和對象有哪些數據成員和方法
  • 考慮這些類和對象之間的關係

3.如何在內存中區分類和對象?
  • 類是靜態的概念,存在於代碼區
  • 對象是new運算符創建出來的,位於堆內存中,類的每個實例成員變量在不同的對象中都有不同的值;而方法只有一份,執行的時候才佔用內存


4.對象:是指棧空間內的一小塊內存指向堆空間的一大塊內存


5.方法執行完畢後,爲這個方法所分配的所有的局部變量會全部消失


6.必須使用new關鍵字來創建對象


7.在給函數命名時,用一個動詞加S,代表着第三人稱的含義,例如:contains


8.同一個類的每個對象共享該類的靜態方法,非靜態的方法是針對每一個對象調用的


9.關於this關鍵字:
  • 在類的方法定義中使用,代表使用該方法的對象的引用
  • 當必須要指出當前使用該方法的對象是誰時,要使用this
  • 有時使用this可以處理方法中成員變量和參數重名的情況
  • this可以看做一個變量值是當前對象的引用
  • this還可以在一個構造方法中調用其所屬的另外一個構造方法;當用this調用另外一個構造方法時,傳遞的參數不能是關鍵字this或當前對象的實例成員

10.強制啓用垃圾回收器:System.gc();


11.寫程序時,一般把所有的數據成員聲明爲private的,然後再爲他們一一定義getXXX()方法;而每一個方法則聲明爲public的


12.靜態方法不能訪問非靜態成員,靜態方法不再是針對於某個具體的對象來調用,非靜態成員專屬於某一個特定對象,非靜態成員的訪問需要通過對象


13. 如果要把一個類放在package中:先放在package中,但是編譯的文件必須位於正確的目錄下(和package的層次完全一致);
如果想在另外一個類中使用該類,則必須把名字寫全,但是爲了方便,可以在程序的最前面引入,例如:import com.xxx.yyy.* ;
訪問同一個包中類時,不需要引用;java-->lang中的類使用的話不需要被引入,可直接使用.


14.繼承: A extends B   ( A是一種B  )
  • 通過繼承,子類自動擁有了基類的所以成員(數據成員和一般方法,但不包括構造方法)
  • java只支持單繼承
  • 一個子類只擁有一個基類,但是一個基類可以擁有多個子類

15.方法重寫:
  • 重寫方法必須擁有與被重寫方法一樣的方法名,返回值類型和參數列表
  • 重寫方法不能比被重寫方法有更嚴格的訪問權限


16.訪問權限之間的嚴格程度比較:
    public < protected < default < private


17.super關鍵字:
  • 指向父類的對象(引用基類的成分),和this功能相似


18.繼承中的構造方法:
  • 子類的構造過程中,必須調用基類的構造方法
  • 子類可以在自己的構造方法中使用super(形參)調用基類的構造方法
  • 如果用super關鍵字調用基類的構造方法,則必須寫在子類構造方法的第一行
  • 如果子類的構造方法中沒有顯示的調用父類的構造方法,則系統默認調用基類的無參構造方法
  • 如果既沒有顯示的調用父類的構造方法,又沒有調用無參的構造方法,則編譯出錯


19.多態存在的三個條件:
  • 要有繼承
  • 要有重寫
  • 父類引用指向子類對象


20.抽象方法( public abstract void methodname() ):

  • 含有抽象方法的類必須被聲明爲抽象類
  • 抽象類必須被繼承,抽象方法必須被重寫
  • 抽象類不能被實例化
  • 抽象方法只需聲明不需實現


21.final關鍵字:
  • final的變量值不能改變
  • final的方法不能被重寫
  • final的類不能被繼承


22.interface(接口):是一種抽象類,只包含變量和方法的定義,而沒有實現。
  • 接口可以多重實現
  • 接口中聲明屬性默認爲public static final的;也只能是public static final
  • 接口中只能定義抽象方法,而這些方法默認爲public的,也只能是public
  • 接口可以繼承其他的接口,並添加新的抽象方法和屬性
  • 多個無關的類可以實現同一個接口
  • 一個類可以實現多個無關接口
  • 與繼承關係相似,接口與實現類之間存在多態性 

23.
類String的equals()方法已經被重寫,當比較的兩個String類代表的字符串的字符序列完全相等時,返回true,否則返回false。

24.
類Object的equals()方法比較的是兩個引用是否指代同一個對象(指向同一塊內存區域)。


25.對象轉型(casting):
  • 一個基類的引用型變量可以指向其子類的對象。
  • 一個基類的引用不可以訪問其子類新增加的成員(屬性和方法)。
  • 可以使用引用變量 instanceof 類名 來判斷該引用類型變量所指向的對象是否屬於該類或該類的子類。
  • 子類的對象可以當做基類的對象來使用稱作向上轉型(upcasting)。
  • 基類的對象可以當做基類的對象來使用稱作向下轉型(downcasting)。

26.多態的概念:
  • 動態綁定(多態)是指在執行期間(而非綁定期間)判斷所引用的對象的實際類型,根據其實際的類型調用實際的方法。

27.異常和重寫的關係:
  • 重寫方法需拋出與原方法所拋出異常類型一致異常或不拋出異常。

28.接口和抽象類的區別是什麼?

Java提供和支持創建抽象類和接口。它們的實現有共同點,不同點在於:

  • 接口中所有的方法隱含的都是抽象的。而抽象類則可以同時包含抽象和非抽象的方法。
  • 類可以實現很多個接口,但是隻能繼承一個抽象類
  • 類如果要實現一個接口,它必須要實現接口聲明的所有方法。但是,類可以不實現抽象類聲明的所有方法,當然,在這種情況下,類也必須得聲明成是抽象的。
  • 抽象類可以在不提供接口方法實現的情況下實現接口。
  • Java接口中聲明的變量默認都是final的。抽象類可以包含非final的變量。
  • Java接口中的成員函數默認是public的。抽象類的成員函數可以是private,protected或者是public。
  • 接口是絕對抽象的,不可以被實例化。抽象類也不可以被實例化,但是,如果它包含main方法的話是可以被調用的

29.有三種方式可以用來創建線程:

  • 繼承Thread類
  • 實現Runnable接口
  • 應用程序可以使用Executor框架來創建線程池

實現Runnable接口這種方式更受歡迎,因爲這不需要繼承Thread類。在應用設計中已經繼承了別的對象的情況下,這需要多繼承(而Java不支持多繼承),只能實現接口。同時,線程池也是非常高效的,很容易實現和使用。

 

30.線程的幾種可用狀態

線程在執行過程中,可以處於下面幾種狀態:

  • 就緒(Runnable):線程準備運行,不一定立馬就能開始執行。
  • 運行中(Running):進程正在執行線程的代碼。
  • 等待中(Waiting):線程處於阻塞的狀態,等待外部的處理結束。
  • 睡眠中(Sleeping):線程被強制睡眠。
  • I/O阻塞(Blocked on I/O):等待I/O操作完成。
  • 同步阻塞(Blocked on Synchronization):等待獲取鎖。
  • 死亡(Dead):線程完成了執行。

31.HashMap和Hashtable的區別

  • HashMap和Hashtable都實現了Map接口,因此很多特性非常相似。但是,他們有以下不同點:
  • HashMap允許鍵和值是null,而Hashtable不允許鍵或者值是null。
  • Hashtable是同步的,而HashMap不是。因此,HashMap更適合於單線程環境,而Hashtable適合於多線程環境。
  • HashMap提供了可供應用迭代的鍵的集合,因此,HashMap是快速失敗的。另一方面,Hashtable提供了對鍵的列舉(Enumeration)。
  • 一般認爲Hashtable是一個遺留的類。

 

32.數組(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?

下面列出了Array和ArrayList的不同點:

  • Array可以包含基本類型和對象類型,ArrayList只能包含對象類型。
  • Array大小是固定的,ArrayList的大小是動態變化的。
  • ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
  • 對於基本類型數據,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本數據類型的時候,這種方式相對比較慢。

33.ArrayList和LinkedList有什麼區別?

ArrayList和LinkedList都實現了List接口,他們有以下的不同點:

  • ArrayList是基於索引的數據接口,它的底層是數組。它可以以O(1)時間複雜度對元素進行隨機訪問。與此對應,LinkedList是以元素列表的形式存儲它的數據,每一個元素都和它的前一個和後一個元素鏈接在一起,在這種情況下,查找某個元素的時間複雜度是O(n)。

  • 相對於ArrayList,LinkedList的插入,添加,刪除操作速度更快,因爲當元素被添加到集合任意位置的時候,不需要像數組那樣重新計算大小或者是更新索引。

  • LinkedList比ArrayList更佔內存,因爲LinkedList爲每一個節點存儲了兩個引用,一個指向前一個元素,一個指向下一個元素。


34.要使一個類成爲不可變的,那麼必須滿足一下三個條件:
  • 所有的數據域都是私有的.
  • 沒有修改器方法
  • 沒有可以返回指向可變數據域的引用的訪問器方法


35.在Java中,非靜態(匿名)內部類會引用外部類對象。而靜態內部類不會引用外部類對象。


36.Java泛型中,

  • E 代表Elements,作爲容器中的元素.
  • T 代表Type,作爲Java中的Class
  • ? 代表未知類型.
  • K 代表Key,作爲鍵.
  • V 代表Value,作爲值.
  • <? extends A> 代表類型爲類A的子類.

  • <? super B> 代表類型爲B的父類.

37. 在Java中,一個弱引用指向的對象,只要被垃圾回收器掃描到就會被回收.


38.對於參數類型,要優先使用接口,而不是類.只要有適當的接口可用來定義參數,就優先使用這個接口,而不是使用實現該接口的類.例如,在編寫方`   法時使用HashMap類來作爲輸入,相反應當使用Map接口來作爲參數,這使你可以HashTable,HashMap,TreeMap來作爲參數,這樣更加靈活.


39.終結方法(finalizer)通常是不可預測的,也是很危險的,一般情況下是不必要的.使用終結方法會導致行爲不穩定,降低性能,以及可移植問題.


40.通過把字符串常量放在比較函數equals()的左側來防止NullPointerException,如下:

//Good
if("constant".equals(userVo.getName()))

//Bad
if(userVo.getName().equals("constant")


41.無論任何時候有一個集合或數組,都要確保它存在且不爲空.


42.看下一段代碼:

String a = “hello2″;   
String b = “hello” + 2;   
System.out.println((a == b));

輸出結果爲true. "hello" + 2在編譯期間就被優化成"hello2",因此在運行期間,a和b指向同一塊內存.


String a = “hello2″;    
String b = “hello”;       
String c = b + 2;       
System.out.println((a == c));

輸出結果爲false.由於有符號引用的存在,c = b + 2不會在編譯期被優化,不會把b+2當做字面常量來處理,因此這種方式生成的對象是保存在heap上的.


(通過new關鍵字來生成對象是在heap segment進行的,而在heap segment進行對象生成的過程是不會檢測該對象是否已經存在的).


43.

44.

45.

36.

36.

36.

36.

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