內部類和靜態內部類的區別java
一、內部類中的變量和方法不能聲明爲靜態的。
二、內部類實例化:B是A的內部類,實例化B:A.B b = new A().new B()。
三、內部類能夠引用外部類的靜態或者非靜態屬性及方法。編程
一、靜態內部類屬性和方法能夠聲明爲靜態的或者非靜態的。
二、實例化靜態內部類:B是A的靜態內部類,A.B b = new A.B()。
三、靜態內部類只能引用外部類的靜態的屬性及方法。數組
inner classes——內部類
static nested classes——靜態嵌套類
其實人家不叫靜態內部類,只是叫習慣了,從字面就很容易理解了。安全
內部類依靠外部類的存在爲前提,而靜態嵌套類則能夠徹底獨立,明白了這點就很好理解了。服務器
非靜態內部類中的變量和方法不能聲明爲靜態的緣由多線程
靜態類型的屬性和方法,在類加載的時候就會存在於內存中。使用某個類的靜態屬性和方法,那麼這個類必需要加載到虛擬機中。可是非靜態內部類並不隨外部類一塊兒加載,只有在實例化外部類以後纔會加載。性能
咱們設想一個場景:在外部類並無實例化,內部類尚未加載的時候若是調用內部類的靜態成員或方法,內部類尚未加載,卻試圖在內存中建立該內部類的靜態成員,就會產生衝突。因此非靜態內部類不能有靜態成員變量或靜態方法。優化
String,StringBuilder,StringBuffer的區別ui
性能上一般StringBuilder > StringBuffer > String。線程
String是不可變對象,每次對String類型進行改變的時候都等同於生成了一個新的String對象,而後將指針指向新的String對象,因此性能最差,對於要常常改變內容的字符串不用String。
StringBuffer是字符串變量,對它操做時,並不會生成新的對象,而是直接對該對象進行更改,因此性能較好。
StringBuilder和StringBuffer同樣,是字符串變量,可是他不帶有synchronized關鍵字,不保證線程安全,因此性能最好。在單線程的狀況下,建議使用StringBuilder。
下面這段代碼的輸出結果是什麼?
String a = "helloworld"; String b = "hello" + "world"; System.out.println((a == b));
輸出結果爲:True。
緣由是String對字符串的直接相加,會在編譯期進行優化。即hello+world在編譯時期,被優化爲helloworld,因此在運行時期,他們指向了同一個對象。咱們也能夠推理,對於直接字符串的相加,String不必定比其他兩個慢。
下面這段代碼的輸出結果是什麼?
String a = "helloworld"; String b = "hello"; String c = b + "world"; System.out.println((a == c));
輸出結果爲:False。
緣由是c並不是兩個字符串直接相加,包含了一個字符串引用,這時不會作編譯期的優化。因此a、c最終生成了兩個對象,這時他的效率低。
集合和數組之間的相互轉換
數組變集合:
一般咱們會回答的是如下代碼:
List<String> list = Arrays.asList(array);
但這並非很好的答案,此時組合成的list是Arrays裏面的一個靜態內部類,該類並未實現add、remove方法,所以在使用時存在問題。
能夠這樣:
String array[]= {"hello","world","java","zhiyin"}; List<String> list = new ArrayList<String>(Arrays.asList(array));
集合變數組:
String[] array=list.toArray(new String[list.size()]);
面向對象的特徵有哪些方面?
抽象:抽象是將一類對象的共同特徵總結出來構造類的過程,包括數據抽象和行爲抽象兩方面。抽象只關注對象有哪些屬性和行爲,並不關注這些行爲的細節是什麼。
繼承:繼承是從已有類獲得繼承信息建立新類的過程。提供繼承信息的類被稱爲父類;獲得繼承信息的類被稱爲子類。繼承讓變化中的軟件系統有了必定的延續性,同時繼承也是封裝程序中可變因素的重要手段。
封裝:一般認爲封裝是把數據和操做數據的方法綁定起來,對數據的訪問只能經過已定義的接口。面向對象的本質就是將現實世界描繪成一系列徹底自治、封閉的對象。咱們在類中編寫的方法就是對實現細節的一種封裝;咱們編寫一個類就是對數據和數據操做的封裝。能夠說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的編程接口。
多態性:多態性是指容許不一樣子類型的對象對同一消息做出不一樣的響應。簡單的說就是用一樣的對象引用調用一樣的方法可是作了不一樣的事情。多態性分爲編譯時的多態性和運行時的多態性。方法重載實現的是編譯時的多態性,而方法重寫實現的是運行時的多態性。
1.就緒(Runnable):線程準備運行,不必定立馬就能開始執行。
2.運行中(Running):進程正在執行線程的代碼。
3.等待中(Waiting):線程處於阻塞的狀態,等待外部的處理結束。
4.睡眠中(Sleeping):線程被強制睡眠。
5.I/O阻塞(Blocked on I/O):等待I/O操做完成。
6.同步阻塞(Blocked on Synchronization):等待獲取鎖。
7.死亡(Dead):線程完成了執行。
1.Collection:表明一組對象,每個對象都是它的子元素。
2.Set:不包含重複元素的Collection。
3.List:有順序的collection,而且能夠包含重複元素。
4.Map:能夠把鍵(key)映射到值(value)的對象,鍵不能重複。
Enumeration接口的功能和Iterator接口的功能是重複的。此外,Iterator 接口添加了一個可選的移除操做,並使用較短的方法名。新的實現應該優先考慮使用Iterator接口而不是Enumeration接口。
內容實體。
管道pipe:管道是一種半雙工的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程關係。
高級管道popen:將另外一個程序當作一個新的進程在當前程序進程中啓動,則它算是當前程序的子進程,這種方式咱們成爲高級管道方式。
有名管道named pipe :有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。
消息隊列MessageQueue:消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。
共享存儲SharedMemory:共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號兩,配合使用,來實現進程間的同步和通訊。
信號量Semaphore:信號量是一個計數器,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。
套接字Socket:套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊。
信號sinal: 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。