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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java面试笔试题整理(学习java基础理论最好的资料)_2020Java笔试/面试题(持续收集整理更新)...

發(fā)布時間:2025/3/8 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java面试笔试题整理(学习java基础理论最好的资料)_2020Java笔试/面试题(持续收集整理更新)... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

說明:java

本篇用于收集知識點方便隨時鞏固,持續(xù)更新與糾錯。數(shù)組

關(guān)于JDK版本,若無特殊說明,默認為JDK 1.8,。緩存

關(guān)于JVM版本,若無特殊說明,默認為 HotSpot。安全

目錄數(shù)據(jù)結(jié)構(gòu)

1、Java 基礎(chǔ)

1.1?Java中的基本數(shù)據(jù)類型有哪幾種?各占用多少字節(jié)?

答:Java 中的基本數(shù)據(jù)類型有8種。其中:

數(shù)值型

整數(shù)類型

byte:1字節(jié)8位有符號整數(shù)

short:2字節(jié)16位有符號整數(shù)

int:4字節(jié)32位有符號整數(shù)

long:8字節(jié)64位有符號整數(shù)

浮點類型

float:4字節(jié)32位浮點數(shù)

double:8字節(jié)64位浮點數(shù)

字符型

char:2字節(jié)16位Unicode字符

布爾型

boolean:1字節(jié)8位

1.2?String 在Java中是個特殊的存在,談?wù)?#xff1f;

答:

Sting類能夠序列化。String實現(xiàn)了序列化接口,因此是能夠被序列化與反序列化的。

String對象之間能夠進行比較。實現(xiàn)了Comparable接口中的compareTo()方法,因此字符串之間是能夠進行比較的(是根據(jù)字符串中每一個字符的ASCII碼進行比較),以下圖源碼。

String類不能夠被繼承。由于String 是一個被final所修飾的類。

String是不可變的。String類底層實際存儲數(shù)據(jù)的是:private final char value[];?也就是說 String類底層維護的是一個字符序列。這個 char 類型數(shù)組被 final 所修飾,因此一經(jīng)建立,就不可修改。

String類重寫了equals() 方法。先比較兩個字符串的地址是否相同,是則直接返回true;若是地址不相同,再看兩個字符串內(nèi)容是否相同,是的話也返回true。

String能夠用字面量方式建立。String 是一個類,與其余類不一樣的是,String可使用字面量的形式建立或賦值。

String str = "123";

/*

1 先到常量池去經(jīng)過String的equals()方法去找是否存在字符串"123",

若是存在,直接將地址返回(這也保證了常量池中的字符串常量都是惟一的)。

2 若是常量池中不存在"123",則先在常量池中建立一個"123"的字符序列,而后再將其地址返回。

*/

String str = new String("123");

/*

1 先到常量池去經(jīng)過String的equals()方法去找是否存在字符串"123",

若是不存在,就在常量池中建立一個。

(因此說在new字符串的時候,若是常量池中不存在,實際上會建立兩次。)

2 在堆中開辟空間,建立一個Sting 對象,并返回其地址。

*/

String常量存儲在方法區(qū)中的常量池,new出來的對象存儲在堆內(nèi)存中。

字符串之間可使用 + 號拼接。拼接產(chǎn)生的結(jié)果是第三個字符串,進行拼接的字符串自己是沒有發(fā)生任何變化的。

String 的本地方法 intern() 能夠從常量池中獲取字符串。若是常量池中沒有,就先建立,再將其地址返回。

1.3 談?wù)?String、StringBuffer、StringBuilder 的異同。

這三個類 都被 final 鎖修飾,不容許被繼承。

從線程安全的角度講:

String 實例對象是不可變的字符串常量,不存在線程安全問題,即String是線程安全的。

StringBuilder 沒有使用鎖機制,在多線程并發(fā)的狀況下,可能會出現(xiàn)線程安全問題。

StringBuffer 中涉及到修改底層數(shù)據(jù)的方法,都加了 synchronized 關(guān)鍵字,因此StringBuffer 是線程安全的。

從對象可變性角度講:

String 底層維護的是一個被final 鎖修飾的字符數(shù)組,不可變。

StringBuffer 和 StringBuilder 底層維護的是一個可變的字符數(shù)組,因此其對象實例是可變的。

從頻繁修改的性能角度:

String對象自己是不可變的,對字符串修改,其實是在產(chǎn)生新的對象,所以修改效率低下。

StringBuilder 底層維護的是一個可變的字符數(shù)組,能夠經(jīng)過擴容等機制,實現(xiàn)對字符序列的修改。所以修改效率較高。

StringBuffer 底層維護的也是一個可變的字符數(shù)組,但與StringBuilder不一樣的是,StringBuffer中的修改操做都被加了鎖,獲取鎖、釋放鎖、阻塞等因素致使了StringBuffer的性能方面可能會比StringBuilder低。

在 JDK 1.6 以后,對synchronized 進行了一些鎖優(yōu)化,其中的“鎖消除”優(yōu)化,會使得StringBuffer在某種絕對安全的狀況下忽略方法上加的鎖,從而其性能會有所提高。

其余方面:

StringBuffer 的 toString() 方法會對字符序列進行緩存,以減小元素復制的開銷,而 StringBuilder 則是直接復制。從而從某種程度上說,推薦使用StringBuffer。

StringBuffer 與 StringBuilder 的初始容量、擴容機制等

初始容量:16

擴容:

擴容至當前的兩倍加2 :int newCapacity = value.length * 2 + 2;

若是長度仍是不夠,那么實際須要多長,就擴容至多長:

if (newCapacity - minimumCapacity < 0)

newCapacity = minimumCapacity;

1.4?ArrayList、Vector、LinkedList 的異同?

Vector:

底層存儲數(shù)據(jù)的是Object類型的數(shù)組。

new Vector() 時,初始大小為10

每次擴容至原來的兩倍(能夠設(shè)定增加因子capacityIncrement)

是線程安全的

優(yōu)勢:底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查找效率高。

缺點:插入、刪除元素等操做效率低,且因為是線程安全的,因此較ArrayList來講總體效率較低。

ArrayList:

底層數(shù)據(jù)存儲是Object類型的數(shù)組

new ArrayList() 時,底層數(shù)據(jù)指針指向一個空數(shù)組;

第一次添加元素時,將數(shù)據(jù)指針指向長度為10的數(shù)組。

每次擴容至原來的1.5倍

是線程不安全的,在多線程操做下,可能拋出:ConcurrentModificationException(并發(fā)修改異常)

優(yōu)勢:效率略高于 Vector ,能夠在單線程下使用。

缺點:線程不安全,數(shù)組的缺點它都有。

LinkedList:

雙向鏈表,底層存儲的是 Node 類型的節(jié)點鏈表

線程不安全,可能會拋出:ConcurrentModificationException

優(yōu)勢:插入、刪除節(jié)點很容易

缺點:查找元素效率較前面兩個低

1.5?講講類的實例化過程當中靜態(tài)變量、成員變量等的加載順序

一、父類靜態(tài)變量

二、父類靜態(tài)代碼塊

三、子類靜態(tài)變量

四、子類靜態(tài)代碼塊

五、父類成員變量

六、父類構(gòu)造代碼塊

七、父類構(gòu)造方法

八、子類成員變量

九、子類構(gòu)造代碼塊

十、子類構(gòu)造方法

代碼驗證:

public class Main {

public static void main(String[] args) {

Son son = new Son();

System.out.println("====================");

Son son2 = new Son();

}

}

class Parent{

public static int a = 1;

private int aa = 10;

static {

System.out.println("父類的靜態(tài)代碼塊加載了,在此以前靜態(tài)變量a已經(jīng)加載了,a = " + a);

}

{

System.out.println("父類的構(gòu)造代碼塊加載了,在此以前成員變量aa已經(jīng)加載了: aa = " + aa);

}

public Parent() {

System.out.println("父類的構(gòu)造方法加載了");

}

}

class Son extends Parent{

public static int b = 2;

private int bb = 20;

public Son() {

System.out.println("子類的構(gòu)造方法加載了");

}

static {

System.out.println("子類的靜態(tài)代碼塊加載了,在此以前靜態(tài)變量b已經(jīng)加載了,b = " + b);

}

{

System.out.println("子類的構(gòu)造代碼塊加載了(此處將【構(gòu)造塊】放在【構(gòu)造函數(shù)】下面,可是仍然是【構(gòu)造塊】先加載),在此以前成員變量bb已經(jīng)加載了: bb = " + bb);

}

}

打印結(jié)果:

1.6? HashMap 你用過嗎?說說你對它的認識?

HashMap空參構(gòu)造,只初始化了負載因子(0.75),其余成員變量均為默認值。

經(jīng)常使用的有參構(gòu)造方法 HashMap(int initialCapacity),是能夠設(shè)置初始化大小的,在大概知道須要多大的map時,能夠考慮使用這個構(gòu)造方法。

HashMap 擴容:每次擴容至原來的2倍。

使用空參構(gòu)造建立的對象,在第一次添加元素的時候,才會初始化一個長度為16的Node類型的數(shù)組。

鏈表轉(zhuǎn)紅黑樹的時機:鏈表長度大于8 , 數(shù)組長度大于64

紅黑樹轉(zhuǎn)鏈表的時機:鏈表程度小于 6

HashMap 容許空值做為鍵和值

HashMap 是無序,且鍵不重復的

HashMap 線程不安全,多線程操做下可能會拋出 ConcurrentModificationException

未完,待續(xù)。。。

最后

本文是我本身復習并積累的過程,文中不免會有遺漏或不許確的地方

如有大佬路過發(fā)現(xiàn)個人錯誤還請指正,能夠發(fā)送到個人郵箱:yangxinhufox@foxmail.com

嫌麻煩就請在下方直接評論,萬分感謝!!!

總結(jié)

以上是生活随笔為你收集整理的java面试笔试题整理(学习java基础理论最好的资料)_2020Java笔试/面试题(持续收集整理更新)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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