国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java八股文

這篇具有很好參考價(jià)值的文章主要介紹了Java八股文。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、java基礎(chǔ)篇

1.接口和抽象類的區(qū)別

  • 相似點(diǎn)
    • 接口和抽象類都不能被實(shí)例化
    • 實(shí)現(xiàn)接口或者抽象類的子類都必須實(shí)現(xiàn)這些抽象方法
  • 不同點(diǎn)
    • 抽象類可以包含普通方法和代碼塊, 接口里只能包含抽象方法, 靜態(tài)方法和默認(rèn)方法
    • 抽象類可以有構(gòu)造方法, 而接口沒有
    • 抽象類中的成員變量可以是各種類型, 接口中的成員變量只能是public static final類型, 并且必須輔助

2.重載和重寫的區(qū)別

  • 重載發(fā)生在同一個(gè)類中, 方法名相同、參數(shù)列表、返回類型、權(quán)限修飾符可以不同.
  • 重寫發(fā)生在子類中, 方法名、參數(shù)列表、返回類型都相同, 權(quán)限修飾符要大于父類方法, 聲明異常范圍要小于父類方法, 但是final和private修飾的方法不可重寫

3.==和equals的區(qū)別

  • ==比較基本類型時(shí), 比較的是值, ==比較引用類型時(shí), 比較的是內(nèi)存地址
  • equals是Object類的方法, 本質(zhì)上與==一樣, 但是有些類重寫了equals方法, 比如String的equals被重寫后, 比較的是字符值, 另外重寫了equals后, 也必須重寫hashcode方法

4.異常處理機(jī)制

  • 使用try catch finaly捕獲異常, finaly中的代碼一定會(huì)執(zhí)行, 捕獲異常后程序會(huì)繼續(xù)執(zhí)行
  • 使用throws聲明該方法可能會(huì)拋出的異常類型, 出現(xiàn)異常后, 程序終止

5.HashMap原理

HashMap在JDK1.8之后是基于數(shù)組+鏈表+紅黑樹來(lái)實(shí)現(xiàn)的, 特點(diǎn)是key不能重復(fù), 可以為null, 線程不安全

一、HashMap存取原理

  • 計(jì)算key的hash值, 然后進(jìn)行二次hash, 根據(jù)二次hash結(jié)果找到對(duì)應(yīng)的索引位置
  • 如果這個(gè)位置有值, 先進(jìn)去equals比較, 如果結(jié)果為true則取代這個(gè)元素, 如果結(jié)果為false, 就使用高低位平移法將節(jié)點(diǎn)插入鏈表

二、HashMap的擴(kuò)容機(jī)制
當(dāng)添加某個(gè)元素后,數(shù)組的總的添加元素?cái)?shù)大于了 數(shù)組長(zhǎng)度 * 0.75(默認(rèn),也可自己設(shè)定),數(shù)組長(zhǎng)度擴(kuò)容為兩倍。(如開始創(chuàng)建HashMap集合后,數(shù)組長(zhǎng)度為16,臨界值為16 * 0.75 = 12,當(dāng)加入元素后元素個(gè)數(shù)超過(guò)12,數(shù)組長(zhǎng)度擴(kuò)容為32,臨界值變?yōu)?4)

6.HashMap線程不安全的原因

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
    Node<K,V>[] tab; Node<K,V> p; int n, i;
    if ((tab = table) == null || (n = tab.length) == 0)
        n = (tab = resize()).length;
    if ((p = tab[i = (n - 1) & hash]) == null) // 如果沒有hash碰撞則直接插入元素
        tab[i] = newNode(hash, key, value, null);
    else {
        Node<K,V> e; K k;
        if (p.hash == hash &&
            ((k = p.key) == key || (key != null && key.equals(k))))
            e = p;
        else if (p instanceof TreeNode)
            e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
        else {
            for (int binCount = 0; ; ++binCount) {
                if ((e = p.next) == null) {
                    p.next = newNode(hash, key, value, null);
                    if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                        treeifyBin(tab, hash);
                    break;
                }
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k))))
                    break;
                p = e;
            }
        }
        if (e != null) { // existing mapping for key
            V oldValue = e.value;
            if (!onlyIfAbsent || oldValue == null)
                e.value = value;
            afterNodeAccess(e);
            return oldValue;
        }
    }
    ++modCount;
    if (++size > threshold)
        resize();
    afterNodeInsertion(evict);
    return null;
}

其中第六行代碼是判斷是否出現(xiàn)Hash碰撞, 假設(shè)兩個(gè)線程A、B都在進(jìn)行put操作, 并且通過(guò)Hash函數(shù)計(jì)算出的插入下標(biāo)都是相同的, 當(dāng)線程A執(zhí)行完第六行代碼后, 由于時(shí)間片耗盡被掛起, 而線程B得到了時(shí)間片后在該下標(biāo)處插入了元素, 完成了正常的插入, 然后線程A獲得時(shí)間片,由于之前已經(jīng)進(jìn)行了hash碰撞的判斷,所有此時(shí)不會(huì)再進(jìn)行判斷,而是直接進(jìn)行插入,這就導(dǎo)致了線程B插入的數(shù)據(jù)被線程A覆蓋了,從而線程不安全。

簡(jiǎn)單來(lái)說(shuō):put要進(jìn)行兩個(gè)動(dòng)作

  • 判斷是否有Hash碰撞
  • 通過(guò)Hash函數(shù)計(jì)算的插入下標(biāo)處, 插入值

這兩個(gè)動(dòng)作是分開的, 不具備原子性(可以簡(jiǎn)單理解為put方法沒加鎖)

除此之前,還有就是代碼的第38行處有個(gè)++size,我們這樣想,還是線程A、B,這兩個(gè)線程同時(shí)進(jìn)行put操作時(shí),假設(shè)當(dāng)前HashMap的zise大小為10,當(dāng)線程A執(zhí)行到第38行代碼時(shí),從主內(nèi)存中獲得size的值為10后準(zhǔn)備進(jìn)行+1操作,但是由于時(shí)間片耗盡只好讓出CPU,線程B快樂(lè)的拿到CPU還是從主內(nèi)存中拿到size的值10進(jìn)行+1操作,完成了put操作并將size=11寫回主內(nèi)存,然后線程A再次拿到CPU并繼續(xù)執(zhí)行(此時(shí)size的值仍為10),當(dāng)執(zhí)行完put操作后,還是將size=11寫回內(nèi)存,此時(shí),線程A、B都執(zhí)行了一次put操作,但是size的值只增加了1,所有說(shuō)還是由于數(shù)據(jù)覆蓋又導(dǎo)致了線程不安全。

7.想要線程安全的HashMap怎么辦

  • 使用ConcurrentHashMap(并發(fā)的HashMap)
  • 使用HashTable
  • Collections.synchronizedHashMap()方法

8.HashTable和HashMap的區(qū)別

  1. HashTable的每個(gè)方法都用synchronized修飾,因此是線程安全的,但同時(shí)讀寫效率很低
  2. HashTable的Key不允許為null
  3. HashTable只對(duì)key進(jìn)行一次hash,HashMap進(jìn)行了兩次Hash
  4. HashTable底層使用的數(shù)組加鏈表

9.ConcurrentHashMap原如何保證的線程安全

JDK1.8:采用CAS+Synchronized保證線程安全,每次插入數(shù)據(jù)時(shí)判斷在當(dāng)前數(shù)組下標(biāo)是否是第一次插入,是就通過(guò)CAS方式插入,然后判斷f.hash是否=-1,是的話就說(shuō)明其他線程正在進(jìn)行擴(kuò)容,當(dāng)前線程也會(huì)參與擴(kuò)容;刪除方法用了synchronized修飾,保證并發(fā)下移除元素安全
ConcurrentHashMap原理詳解(太細(xì)了)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-422530.html

10.ArrayList和LinkedList的區(qū)別

  • ArrayList底層是使用動(dòng)態(tài)數(shù)組, 默認(rèn)容量為10, 當(dāng)元素?cái)?shù)量達(dá)到容量時(shí), 生成一個(gè)新的數(shù)組, 大小為前一次的1.5倍, 然后將原來(lái)的數(shù)組copy過(guò)來(lái), 因?yàn)閿?shù)組在內(nèi)存中是連續(xù)的地址, 所以ArrayList查找數(shù)據(jù)更快, 由于擴(kuò)容機(jī)制

到了這里,關(guān)于Java八股文的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 八股文 -- Java基礎(chǔ)和集合框架

    JVM是虛擬機(jī), 負(fù)責(zé)運(yùn)行Java程序 JRE是Java運(yùn)行環(huán)境, 包括Java虛擬機(jī), Java類庫(kù) JDK是Java Development Kit 包括JRE和編譯器和其他工具, 比如Java Doc 可以是 byte, short, char, int, string, enum 訪問(wèn)修飾符可以修飾方法, 成員變量. 默認(rèn)是default public 是對(duì)所有類可見 protected是只對(duì)一個(gè)包內(nèi)的本類和子

    2024年02月01日
    瀏覽(54)
  • 2023面試八股文 ——Java基礎(chǔ)知識(shí)

    2023面試八股文 ——Java基礎(chǔ)知識(shí)

    編程就是讓計(jì)算機(jī)為解決某個(gè)問(wèn)題而使用某種程序設(shè)計(jì)語(yǔ)言編寫程序代碼,并 終得到結(jié)果的過(guò)程。 為了使計(jì)算機(jī)能夠理解人的意圖,人類就必須要將需解決的問(wèn)題的思路、方法、 和手段通過(guò)計(jì)算機(jī)能夠理解的形式告訴計(jì)算機(jī),使得計(jì)算機(jī)能夠根據(jù)人的指令一 步一步去工作,

    2024年02月12日
    瀏覽(30)
  • 【java八股文】之JVM基礎(chǔ)篇

    【java八股文】之JVM基礎(chǔ)篇

    【java八股文】之JVM基礎(chǔ)篇-CSDN博客 【java八股文】之MYSQL基礎(chǔ)篇-CSDN博客 【java八股文】之Redis基礎(chǔ)篇-CSDN博客 【java八股文】之Spring系列篇-CSDN博客 【java八股文】之分布式系列篇-CSDN博客 【java八股文】之多線程篇-CSDN博客 【java八股文】之JVM基礎(chǔ)篇-CSDN博客 【java八股文】之計(jì)算

    2024年01月17日
    瀏覽(70)
  • java 八股文 基礎(chǔ) 每天筆記隨機(jī)刷

    java 八股文 基礎(chǔ) 每天筆記隨機(jī)刷

    被@Component注解標(biāo)識(shí)的類在應(yīng)用程序啟動(dòng)時(shí)會(huì)被實(shí)例化,并由Spring容器進(jìn)行管理。 @PostConstruct是一個(gè)Java注解,用于標(biāo)記一個(gè)方法在類被實(shí)例化后自動(dòng)執(zhí)行。該方法必須是非靜態(tài)的,沒有參數(shù),且不能拋出異常。 他們搭配起來(lái)使用在同一個(gè)類中,會(huì)讓被@PostConstruct修飾的方法,

    2024年02月10日
    瀏覽(22)
  • java八股文面試[java基礎(chǔ)]——面相對(duì)象特點(diǎn)

    java八股文面試[java基礎(chǔ)]——面相對(duì)象特點(diǎn)

    三大特點(diǎn): 封裝 繼承 多態(tài) ? 面試題:java如何實(shí)現(xiàn)多繼承(除了使用接口之外) 實(shí)現(xiàn)多繼承有三個(gè)方法 : 多層繼承 內(nèi)部類 接口 參考?java實(shí)現(xiàn)多繼承的三種方式 多層繼承 ?如果要直接繼承類,子類是不可以直接多繼承的,但是可以通過(guò)多層繼承來(lái)實(shí)現(xiàn)多繼承,但多層繼承

    2024年02月12日
    瀏覽(23)
  • java八股文面試[java基礎(chǔ)]—— 重載 和 重寫

    java八股文面試[java基礎(chǔ)]—— 重載 和 重寫

    ? Overload Override Overwrite三者區(qū)別: ? Java中,有一個(gè)名叫方法簽名的東西,它的定義是這樣的 Definition: Two of the components of a method declaration comprise the method signature—the method’s name and the parameter types. 大概意思是,方法簽名有兩部分組成——方法名和參數(shù)列表 我上面的函數(shù)的方法

    2024年02月12日
    瀏覽(29)
  • java八股文面試[數(shù)據(jù)庫(kù)]——B樹和B+樹的區(qū)別

    java八股文面試[數(shù)據(jù)庫(kù)]——B樹和B+樹的區(qū)別

    B樹是一種樹狀數(shù)據(jù)結(jié)構(gòu),它能夠存儲(chǔ)數(shù)據(jù)、對(duì)其進(jìn)行排序并允許以 O(logn) 的時(shí)間復(fù)雜度進(jìn)行查找、順序讀取、插入和刪除等操作。 B樹中允許一個(gè)結(jié)點(diǎn)中包含多個(gè)key,可以是3個(gè)、4個(gè)、5個(gè)甚至更多,并不確定,需要看具體的實(shí)現(xiàn)。現(xiàn)在我們選 擇一個(gè)參數(shù)M,來(lái)構(gòu)造一個(gè)B樹,我

    2024年02月09日
    瀏覽(55)
  • java八股文面試[java基礎(chǔ)]——淺拷貝和深拷貝

    java八股文面試[java基礎(chǔ)]——淺拷貝和深拷貝

    ? 自驗(yàn)證:創(chuàng)建Class Student兩個(gè)類, Student中含有Class對(duì)象 測(cè)試代碼: 輸出: 可以看到不同的Student對(duì)象,但是有相同的Class對(duì)象 修改Student clone方法: 可以看到不同的class對(duì)象,不同的值: 知識(shí)來(lái)源: 【23版面試突擊】什么是淺拷貝和深拷貝_嗶哩嗶哩_bilibili 強(qiáng)引用、弱引用介

    2024年02月11日
    瀏覽(22)
  • Python八股文 python中的is和==區(qū)別

    靜/動(dòng)態(tài): 編繹/運(yùn)行 時(shí)確定變量類型; 弱/強(qiáng)類型: 會(huì)/不會(huì)發(fā)生隱式類型轉(zhuǎn)換。在強(qiáng)類型中,不管在編譯時(shí)還是運(yùn)行時(shí),一旦某個(gè)類型賦值給某個(gè)變量,它會(huì)持有這個(gè)類型,并且不能同其他類型在計(jì)算某個(gè)表達(dá)式時(shí)混合計(jì)算。 語(yǔ)言簡(jiǎn)單靈活,開發(fā)效率高 膠水語(yǔ)言,輪子多,擁

    2024年02月10日
    瀏覽(15)
  • 前端基礎(chǔ)面試題八股文

    前端基礎(chǔ)面試題八股文

    代碼結(jié)構(gòu): 使頁(yè)面在沒有css的情況下,也能夠呈現(xiàn)出好的內(nèi)容結(jié)構(gòu) 有利于SEO: 爬蟲根據(jù)標(biāo)簽來(lái)分配的權(quán)重,因此可以和搜索引擎建立良好的溝通,幫助爬蟲抓取更多的有效信息 方便其他設(shè)備解析: 如屏幕閱讀器、盲人閱讀器、移動(dòng)設(shè)備等,以有意義的方式來(lái)渲染頁(yè)面 便于

    2024年02月07日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包