日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

静态属性_Java面试题—内部类和静态内部类的区别

發(fā)布時(shí)間:2023/12/1 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 静态属性_Java面试题—内部类和静态内部类的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

內(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。