静态属性_Java面试题—内部类和静态内部类的区别
內(nèi)部類和靜態(tài)內(nèi)部類的區(qū)別
內(nèi)部類:
1、內(nèi)部類中的變量和方法不能聲明為靜態(tài)的。
2、內(nèi)部類實(shí)例化:B是A的內(nèi)部類,實(shí)例化B:A.B b = new A().new B()。
3、內(nèi)部類可以引用外部類的靜態(tài)或者非靜態(tài)屬性及方法。
靜態(tài)內(nèi)部類:
1、靜態(tài)內(nèi)部類屬性和方法可以聲明為靜態(tài)的或者非靜態(tài)的。
2、實(shí)例化靜態(tài)內(nèi)部類:B是A的靜態(tài)內(nèi)部類,A.B b = new A.B()。
3、靜態(tài)內(nèi)部類只能引用外部類的靜態(tài)的屬性及方法。
inner classes——內(nèi)部類
static nested classes——靜態(tài)嵌套類
其實(shí)人家不叫靜態(tài)內(nèi)部類,只是叫習(xí)慣了,從字面就很容易理解了。
內(nèi)部類依靠外部類的存在為前提,而靜態(tài)嵌套類則可以完全獨(dú)立,明白了這點(diǎn)就很好理解了。
非靜態(tài)內(nèi)部類中的變量和方法不能聲明為靜態(tài)的原因
靜態(tài)類型的屬性和方法,在類加載的時(shí)候就會(huì)存在于內(nèi)存中。使用某個(gè)類的靜態(tài)屬性和方法,那么這個(gè)類必須要加載到虛擬機(jī)中。但是非靜態(tài)內(nèi)部類并不隨外部類一起加載,只有在實(shí)例化外部類之后才會(huì)加載。
我們?cè)O(shè)想一個(gè)場(chǎng)景:在外部類并沒有實(shí)例化,內(nèi)部類還沒有加載的時(shí)候如果調(diào)用內(nèi)部類的靜態(tài)成員或方法,內(nèi)部類還沒有加載,卻試圖在內(nèi)存中創(chuàng)建該內(nèi)部類的靜態(tài)成員,就會(huì)產(chǎn)生沖突。所以非靜態(tài)內(nèi)部類不能有靜態(tài)成員變量或靜態(tài)方法。
String,StringBuilder,StringBuffer的區(qū)別
- String 字符串常量
- StringBuffer 字符串變量(線程安全)
- StringBuilder 字符串變量(非線程安全)
性能上通常StringBuilder > StringBuffer > String。
String是不可變對(duì)象,每次對(duì)String類型進(jìn)行改變的時(shí)候都等同于生成了一個(gè)新的String對(duì)象,然后將指針指向新的String對(duì)象,所以性能最差,對(duì)于要經(jīng)常改變內(nèi)容的字符串不用String。
StringBuffer是字符串變量,對(duì)它操作時(shí),并不會(huì)生成新的對(duì)象,而是直接對(duì)該對(duì)象進(jìn)行更改,所以性能較好。
StringBuilder和StringBuffer一樣,是字符串變量,但是他不帶有synchronized關(guān)鍵字,不保證線程安全,所以性能最好。在單線程的情況下,建議使用StringBuilder。
總體來說:
- String:適用于少量的字符串操作的情況。
- StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況。
- StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況。
來一些問題:
下面這段代碼的輸出結(jié)果是什么?
String a = "helloworld";String b = "hello" + "world";System.out.println((a == b));輸出結(jié)果為:True。
原因是String對(duì)字符串的直接相加,會(huì)在編譯期進(jìn)行優(yōu)化。即hello+world在編譯時(shí)期,被優(yōu)化為helloworld,所以在運(yùn)行時(shí)期,他們指向了同一個(gè)對(duì)象。我們也可以推理,對(duì)于直接字符串的相加,String不一定比其余兩個(gè)慢。
下面這段代碼的輸出結(jié)果是什么?
String a = "helloworld";String b = "hello"; String c = b + "world"; System.out.println((a == c));輸出結(jié)果為:False。
原因是c并非兩個(gè)字符串直接相加,包含了一個(gè)字符串引用,這時(shí)不會(huì)做編譯期的優(yōu)化。所以a、c最終生成了兩個(gè)對(duì)象,這時(shí)他的效率低。
集合和數(shù)組之間的相互轉(zhuǎn)換
數(shù)組變集合:
通常我們會(huì)回答的是以下代碼:
List list = Arrays.asList(array);但這并不是很好的答案,此時(shí)組合成的list是Arrays里面的一個(gè)靜態(tài)內(nèi)部類,該類并未實(shí)現(xiàn)add、remove方法,因此在使用時(shí)存在問題。
可以這樣:
String array[]= {"hello總結(jié)
以上是生活随笔為你收集整理的静态属性_Java面试题—内部类和静态内部类的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取人口_「微科普」14亿人口数据是如何
- 下一篇: java 字符码_Java字符编码