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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

java

Java基础面试题与答案

發(fā)布時(shí)間:2025/3/12 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础面试题与答案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

八種基本數(shù)據(jù)類(lèi)型以及包裝類(lèi)

八種基本數(shù)據(jù)類(lèi)型默認(rèn)值?大小?范圍區(qū)間?包裝類(lèi)的緩存區(qū)間?

序號(hào)類(lèi)型名稱默認(rèn)值大小最小值最大值包裝類(lèi)緩沖區(qū)間
1booleanfalse1B0(false)1(true)Boolean無(wú)
2byte(byte)01B-128127Byte-128 ~ 127
3char‘\u0000’2B‘\u0000’‘\uFFFF’Character(char)0 ~ (char)127
4short(short)02B-2^152^15 - 1Short-128 ~ 127
5int04B-2^312^31 - 1Integer-128 ~ 127
6long0L8B-2^632^63 - 1Long-128 ~ 127
7float0.0f4B1.4e-45 (1.4 * 10^-45)3.4e+38 (3.4 * 10^38)Float無(wú)
8double0.0d8B4.9e-324(4.9 * 10^-324)1.798e+308(1.798 * 10^308)Double無(wú)

轉(zhuǎn)換關(guān)系是什么?

  • 從左到右自動(dòng)轉(zhuǎn)換,從右到左需要強(qiáng)制轉(zhuǎn)換;

包裝類(lèi)有哪些共性?

  • 具有基本數(shù)值作為參數(shù)的構(gòu)造函數(shù)。例如:Integer i = new Integer(66);
  • 具有字符串作為參數(shù)的構(gòu)造函數(shù)。例如Integer i = new Integer("-12");如果字符串內(nèi)容與當(dāng)前包裝類(lèi)型不匹配,會(huì)拋出NumberFormatException異常,例如Integer i = new Integer("-12.5");
  • 具有返回對(duì)象基本值的typeValue方法,例如int num = i.intValue();
  • 具有將字符串轉(zhuǎn)換為基本值的parseType方法,例如int num = Integer.parseInt(“56”);
  • 所有包裝類(lèi)都覆寫(xiě)了hashCode與equals方法,以提供對(duì)Map的支持;
  • equals方法用于比較同一類(lèi)型兩個(gè)對(duì)象的值是否相等,不要使用"==";
  • 具有將值轉(zhuǎn)成字符串的方法toString()方法;
  • 都支持自動(dòng)裝箱與拆箱,大大方便了基本數(shù)據(jù)類(lèi)型與它們包裝類(lèi)的使用。
  • 核心類(lèi)之Object

    Object類(lèi)有哪些核心方法?

    • getClass()、hashcode()、equals()、clone()、toString()、notify()、notifyAll()、wait()、finalize() 等。

    equal() 與 "=="的區(qū)別?

    • equal被重寫(xiě)前無(wú)區(qū)別。

    clone()如何使用?深clone與淺clone的區(qū)別?

    • 想要實(shí)現(xiàn)clone,需要實(shí)現(xiàn)Cloneable接口,并重寫(xiě)Object的clone()方法;
    • 淺clone:對(duì)基本數(shù)據(jù)類(lèi)型進(jìn)行值傳遞,對(duì)引用數(shù)據(jù)類(lèi)型進(jìn)行引用傳遞般的拷貝,此為淺拷貝;
    • 深clone:對(duì)基本數(shù)據(jù)類(lèi)型進(jìn)行值傳遞,對(duì)引用數(shù)據(jù)類(lèi)型可以通過(guò)以下方式實(shí)現(xiàn):
      • 如果所有對(duì)象都支持clone,可以在clone方法內(nèi)再一次clone引用的對(duì)象,然后set進(jìn)去;
      • 通過(guò)字節(jié)流反序列化實(shí)現(xiàn);
      • 通過(guò)序列化工具實(shí)現(xiàn),如apache.commons.lang3.SerializationUtils或Gson。

    finalize()方法什么時(shí)候被調(diào)用?

    • 對(duì)象被GC回收前。

    String

    String的底層數(shù)據(jù)結(jié)構(gòu)是什么?

    • 不可變的字符數(shù)組。

    String定義為final的原因?

    • 作為與基本數(shù)據(jù)類(lèi)型有著相同地位的數(shù)據(jù)結(jié)構(gòu),不可變性是定義常量的基礎(chǔ),因此JVM中才可以定義字符串常量池,以此來(lái)提升使用效率與安全性。

    String為什么非常適合作為HashMap的key?

    • String重寫(xiě)了Object類(lèi)的hashCode()與equals()方法,這兩個(gè)方法都是根據(jù)字符串的內(nèi)容去計(jì)算和比較,而非內(nèi)存地址;
    • hash值在首次計(jì)算后會(huì)被緩存,性能良好,這也是String能廣泛使用于Map的key的原因。

    集合體系架構(gòu)圖

    HashMap

    底層數(shù)據(jù)結(jié)構(gòu)是什么?

    • 數(shù)組 + 鏈表 + 紅黑樹(shù)

    put一個(gè)元素的全過(guò)程?

    • 初始化 -> hashCode尋址 -> equals比較 -> 替換或追加 -> 擴(kuò)容

    get一個(gè)元素的全過(guò)程?

    • hashCode尋址 -> equals確認(rèn)

    初始容量是什么?什么時(shí)候轉(zhuǎn)紅黑樹(shù)?什么時(shí)候擴(kuò)容?如何擴(kuò)容?

    • 初始容量16;
    • 鏈表長(zhǎng)度 >= 8,且總?cè)萘?>= 64 轉(zhuǎn)紅黑樹(shù);
    • 擴(kuò)容因子0.75;
    • 擴(kuò)大2倍;

    為什么每次擴(kuò)容2倍而不是3倍?

    • 容量n為2的指數(shù)倍可以保證元素在數(shù)組中分布的更均勻:(n - 1)% hashcode 等價(jià)于二進(jìn)制運(yùn)算 1111 & 0101

    可不可以不擴(kuò)容,會(huì)有什么問(wèn)題?

    • 不擴(kuò)容會(huì)導(dǎo)致hash沖突越來(lái)越多,使用效率逐漸下降。

    多線程put時(shí)會(huì)出現(xiàn)哪些問(wèn)題?

    • 同一個(gè)槽下的元素可能被覆蓋;
    • 擴(kuò)容時(shí),原put到舊table的元素會(huì)丟失;
    • jdk1.7在對(duì)鏈表追加元素時(shí),使用頭插法,擴(kuò)容后,鏈表元素順序會(huì)發(fā)生反轉(zhuǎn),多線程同時(shí)觸發(fā)擴(kuò)容會(huì)導(dǎo)致死鏈;
    • jdk1.8在擴(kuò)容時(shí),將鏈表的頭插法改為尾插法,保證鏈表的順序不會(huì)改變,避免了死鏈發(fā)生。

    紅黑樹(shù)的特性要求是什么?

    • 每個(gè)節(jié)點(diǎn)要么是紅色,要么是黑色,但根節(jié)點(diǎn)永遠(yuǎn)是黑色的;
    • 紅色節(jié)點(diǎn)不能連續(xù),也就是說(shuō),紅色節(jié)點(diǎn)的子和父都不能是紅色的;
    • 從任一節(jié)點(diǎn)到其每個(gè)葉子節(jié)點(diǎn)的路徑都包含相同數(shù)量的黑色節(jié)點(diǎn)。

    ConcurrentHashMap

    底層數(shù)據(jù)結(jié)構(gòu)是什么?

    • 數(shù)組 + 鏈表 + 紅黑樹(shù)

    如果保證線程安全?

    • 在put和resize時(shí)加樂(lè)觀鎖cas。

    高并發(fā)下擴(kuò)容原理是什么?

    • 在put過(guò)程中,如果發(fā)現(xiàn)table處于遷移狀態(tài),當(dāng)前線程會(huì)協(xié)助遷移,將老數(shù)據(jù)都遷移到新的table中后再執(zhí)行put過(guò)程。

    高并發(fā)下size值如何計(jì)算?

    • 并發(fā)量不大的情況下直接通過(guò)cas更新baseCount,并發(fā)量很大的情況下采用分段計(jì)算方式,把新增加的值落到counterCells[]數(shù)組來(lái)減少?zèng)_突,counterCells滿了還會(huì)擴(kuò)容,最后 size = baseCount + counterCells。

    ArrayList

    底層數(shù)據(jù)結(jié)構(gòu)是什么?

    • 初始大小為10的數(shù)組。

    如果在中間位置add或remove一個(gè)元素會(huì)發(fā)生什么?

    • 導(dǎo)致該位置后的元素都需要進(jìn)行位移,從而導(dǎo)致內(nèi)存拷貝。

    什么時(shí)候擴(kuò)容,擴(kuò)容多少?

    • 數(shù)組滿的時(shí)候,擴(kuò)容1.5倍。

    適合哪種場(chǎng)景使用?

    • 數(shù)組內(nèi)存連續(xù),查詢效率較高O(1);
    • 而修改可能會(huì)導(dǎo)致元素位移,內(nèi)存copy;
    • 因此適合查詢多,修改少(特別是在中間位置修改)的場(chǎng)景。

    LinkedList

    底層數(shù)據(jù)結(jié)構(gòu)是什么?

    • 雙向鏈表。

    如何add一個(gè)元素?

    • 先找到要add的位置,再將前后節(jié)點(diǎn)的引用指向該節(jié)點(diǎn),同時(shí)更新該節(jié)點(diǎn)的前序后續(xù)節(jié)點(diǎn)的引用。

    描述get一個(gè)元素的過(guò)程

    • 如果知道位置,則根據(jù)總量判斷該節(jié)點(diǎn)距離頭近還是尾近,然后從近的一端去遍歷。如果不知道位置則直接去遍歷。

    適合哪種場(chǎng)景使用?

    • 修改只修改引用,不涉及內(nèi)存copy,因此代價(jià)較低;
    • 但是查詢只能從頭或從尾去遍歷O(n);
    • 適合寫(xiě)多讀少的場(chǎng)景。

    LinkedHashMap

    實(shí)現(xiàn)LRU

    • LinkedHashMap extends HashMap 具有和HashMap一樣快的查找速度;
    • 內(nèi)部維護(hù)一個(gè)雙向鏈表,用來(lái)維護(hù)插入順序或者LRU順序;
    • 內(nèi)部屬性accessOrder決定了順序,默認(rèn)為false,此時(shí)維護(hù)的是插入順序 ;
    • 構(gòu)造函數(shù) LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder);
    • when accessOrder = true;
    • get操作會(huì)將該節(jié)點(diǎn)移到鏈表尾部,保證鏈表尾部是最近訪問(wèn)的節(jié)點(diǎn),鏈表head節(jié)點(diǎn)就是最久未使用的節(jié)點(diǎn);
    • put操作會(huì)將該節(jié)點(diǎn)移到鏈表尾部,保證鏈表尾部是最近訪問(wèn)的節(jié)點(diǎn),鏈表head節(jié)點(diǎn)就是最久未使用的節(jié)點(diǎn);
    • put操作后,when removeEldestEntry()方法返回為true會(huì)移除最晚的節(jié)點(diǎn),就是head節(jié)點(diǎn);
    • removeEldestEntry()默認(rèn)為false,如果為true,必須繼承LinkedHashMap重寫(xiě)這個(gè)方法;
    • 實(shí)例:實(shí)現(xiàn)LRU緩存,通過(guò)移除最近最久未使用的節(jié)點(diǎn)。從而保證緩存空間足夠。并且緩存的數(shù)據(jù)都是熱點(diǎn)數(shù)據(jù)。

    泛型

    泛型的作用和原理是什么?

    • 泛型可以消除代碼中的強(qiáng)制類(lèi)型轉(zhuǎn)換,同時(shí)獲得一個(gè)附加的類(lèi)型檢查層,該檢查層可以防止有人將錯(cuò)誤類(lèi)型的鍵或值保存在集合中。這就是泛型所做的工作。
    • Java中的泛型基本上都是在編譯器這個(gè)層次來(lái)實(shí)現(xiàn)的。在生成的Java字節(jié)碼中是不包含泛型中的類(lèi)型信息的。使用泛型的時(shí)候加上的類(lèi)型參數(shù),會(huì)在編譯器在編譯的時(shí)候去掉。這個(gè)過(guò)程就稱為類(lèi)型擦除。

    使用泛型有什么好處?

    • 泛型的好處是在編譯的時(shí)候檢查類(lèi)型安全,并且所有的強(qiáng)制轉(zhuǎn)換都是自動(dòng)和隱式的,提高代碼的重用率。
      • 類(lèi)型安全:提高編譯器驗(yàn)證的效率;
      • 消除強(qiáng)制類(lèi)型轉(zhuǎn)換:提高代碼可讀性,簡(jiǎn)化程序員開(kāi)發(fā)難度;
      • 提升性能:將強(qiáng)制類(lèi)型轉(zhuǎn)換、安全校驗(yàn)等操作在編譯器完成,簡(jiǎn)化了程序執(zhí)行期的工作。

    <? extends T>與<? super T>的區(qū)別是什么?

    • <? extends T>可以賦值給任何T以及T的子類(lèi)的集合,上界為T(mén),取出的類(lèi)型帶有泛型限制,向上轉(zhuǎn)型為T(mén),除了null以外,任何元素不得添加進(jìn)<? extends T>集合內(nèi)。
    • <? super T>可以賦值給任何T以及T的父類(lèi)集合,下界為T(mén),取出的類(lèi)型會(huì)泛型丟失,添加時(shí)只能添加T或T的子類(lèi)。

    stream

    stream的底層實(shí)現(xiàn)是怎樣的?

    • Stream 處理數(shù)據(jù)的過(guò)程可以類(lèi)別成工廠的流水線。數(shù)據(jù)可以看做流水線上的原料,對(duì)數(shù)據(jù)的操作可以看做流水線上的工人對(duì)原料的操作;
    • Stream 是一個(gè)接口,最主要的實(shí)現(xiàn)是ReferencePipeline;
    • ReferencePipeline 包含了控制數(shù)據(jù)流入的 Head ,中間操作 StatelessOp、StatefulOp,終止操作 TerminalOp;
      • Head節(jié)點(diǎn)定義了集合流入流水線的規(guī)范與方式;
      • StatelessOp是無(wú)狀態(tài)操作,每個(gè)數(shù)據(jù)的處理是獨(dú)立的,不會(huì)影響或依賴之前的數(shù)據(jù),如filter()、map、flatMap();
      • StatefulOp是有狀態(tài)操作,處理時(shí)會(huì)記錄狀態(tài),比如處理了幾個(gè)。后面元素的處理會(huì)依賴前面記錄的狀態(tài),或者拿到所有元素才能繼續(xù)下去,如distinct()、sorted()、limit();
      • TerminalOp是終止操作,其中又分為短路操作和非短路操作;
        • 短路操作:拿到符合預(yù)期的結(jié)果就會(huì)停下來(lái),不一定會(huì)處理完所有數(shù)據(jù)。如anyMatch()、allMatch()、findFirst()、findAny() 等;
        • 非短路操作:處理完所有數(shù)據(jù)才能得到結(jié)果。如collect()、count()、forEach()、max()、min()、reduce()、toArray()等。
    fruitList.stream().filter(a -> a.getName().equals("香蕉")).collect(Collectors.toList());

    并行流是什么?

    • parallelStream

    lambda實(shí)現(xiàn)List分組、過(guò)濾、去重、排序、轉(zhuǎn)Map

    https://hujinyang.blog.csdn.net/article/details/96432029

    stream().map與stream().flatMap的區(qū)別?

    • map處理完數(shù)據(jù)后返回的是一個(gè)與原結(jié)構(gòu)一致的stream;
    • flatMap把流中的層級(jí)結(jié)構(gòu)扁平化,就是將最底層元素抽出來(lái)放到一起。

    反射

    反射的原理是什么?

    • 反射通過(guò)解析字節(jié)碼,根據(jù)動(dòng)態(tài)信息獲取類(lèi)、方法、屬性等相關(guān)信息的技術(shù)。

    反射為什么性能差?

    • java反射之所以慢,根本原因是JIT即時(shí)編譯器沒(méi)法對(duì)反射相關(guān)的代碼做優(yōu)化;
    • JIT是指在程序運(yùn)行期間把字節(jié)碼文件編譯成機(jī)器碼的過(guò)程,由于反射涉及動(dòng)態(tài)解析的類(lèi)型,沒(méi)有具體的字節(jié)碼,所以無(wú)法被JIT優(yōu)化。

    IO流

    常見(jiàn)的IO流有哪些?

    https://hujinyang.blog.csdn.net/article/details/103774297

    Java Socket

    Socket連接過(guò)程是什么?

    https://hujinyang.blog.csdn.net/article/details/103775022

    BIO與NIO

    如何理解同步、異步、阻塞、非阻塞?

    • 同步強(qiáng)調(diào)的是順序,所謂同步調(diào)用,就是可以確定程序執(zhí)行的順序的調(diào)用。比如說(shuō)執(zhí)行一個(gè)調(diào)用,知道調(diào)用返回之前下一行代碼不會(huì)執(zhí)行。這種順序是確定的情況,就是同步;
    • 而異步調(diào)用則恰恰相反,異步調(diào)用不明確執(zhí)行順序。比如說(shuō)一個(gè)回調(diào)函數(shù),不知道何時(shí)會(huì)回來(lái);
    • 阻塞和非阻塞是一種讀取或者寫(xiě)入操作函數(shù)的實(shí)現(xiàn)方式,阻塞方式下讀取或者寫(xiě)入函數(shù)將一直等待,而非阻塞方式下,讀取或者寫(xiě)入函數(shù)會(huì)立即返回一個(gè)狀態(tài)值;
    • 同步/異步是宏觀上(進(jìn)程間通訊,通常表現(xiàn)為網(wǎng)絡(luò)IO的處理上),阻塞/非阻塞是微觀上(進(jìn)程內(nèi)數(shù)據(jù)傳輸,通常表現(xiàn)為對(duì)本地IO的處理上);阻塞和非阻塞是同步/異步的表現(xiàn)形式。
    • 由上描述基本可以總結(jié)一句簡(jiǎn)短的話:同步和異步是針對(duì)目的和順序,阻塞和非阻塞是針對(duì)實(shí)現(xiàn)方式。

    什么是同步非阻塞?

    • 同步主要是針對(duì)client端獲取結(jié)果的過(guò)程而言。一個(gè)線程從某條通道發(fā)送請(qǐng)求讀取數(shù)據(jù),但是它僅能得到目前可用的數(shù)據(jù),如果目前沒(méi)有可用數(shù)據(jù),就什么都不會(huì)獲取,它不會(huì)保持線程阻塞,可以暫時(shí)做其它事情,但是仍然需要時(shí)不時(shí)的去詢問(wèn),看數(shù)據(jù)有沒(méi)有就緒(雖然不用阻塞,但仍然要定時(shí)詢問(wèn),而不是等人家送上門(mén))。
    • 非阻塞是針對(duì)server端的處理過(guò)程而言。一個(gè)線程請(qǐng)求寫(xiě)入一些數(shù)據(jù)到某條通道,但不需要等待它完全寫(xiě)入,這個(gè)線程同時(shí)可以去做別的事情(多路復(fù)用)。 線程通常將非阻塞 IO 的空閑時(shí)間用于在其它通道上執(zhí)行 IO 操作,所以一個(gè)單獨(dú)的線程現(xiàn)在可以管理多個(gè)輸入和輸出的通道(channel)。
    • Java NIO 是一種同步非阻塞模式 IO。

    BIO與NIO的區(qū)別是什么?

    https://hujinyang.blog.csdn.net/article/details/103796894

    NIO的核心概念有哪些?

    https://hujinyang.blog.csdn.net/article/details/103789632

    總結(jié)

    以上是生活随笔為你收集整理的Java基础面试题与答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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