Java基礎(chǔ)筆試題及答案_第1頁(yè)
Java基礎(chǔ)筆試題及答案_第2頁(yè)
Java基礎(chǔ)筆試題及答案_第3頁(yè)
Java基礎(chǔ)筆試題及答案_第4頁(yè)
Java基礎(chǔ)筆試題及答案_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java基礎(chǔ)筆試題及答案1.簡(jiǎn)述Java中基本數(shù)據(jù)類型的分類及各自的取值范圍Java基本數(shù)據(jù)類型分為4類8種:(1)整數(shù)型:byte(-128~127)、short(-32768~32767)、int(-2^31~2^31-1)、long(-2^63~2^63-1);(2)浮點(diǎn)型:float(約±3.40282347E+38F)、double(約±1.79769313486231570E+308);(3)字符型:char(0~65535);(4)布爾型:boolean(true/false)。注意:Java中沒(méi)有無(wú)符號(hào)整數(shù)類型,所有數(shù)值類型均有符號(hào);boolean在JVM中通常用1字節(jié)或4字節(jié)表示,但規(guī)范未明確規(guī)定具體大小。2.分析以下代碼的輸出結(jié)果并說(shuō)明原因```javapublicclassTest{publicstaticvoidmain(String[]args){Integera=127;Integerb=127;Integerc=128;Integerd=128;System.out.println(a==b);//①System.out.println(c==d);//②inte=128;System.out.println(c==e);//③}}```輸出結(jié)果:①true;②false;③true。原因:Integer通過(guò)`valueOf()`方法創(chuàng)建對(duì)象時(shí),對(duì)于-128~127范圍內(nèi)的數(shù)值會(huì)直接從緩存(IntegerCache)中獲取已存在的對(duì)象,因此a和b指向同一對(duì)象,==比較為true。超出該范圍時(shí)(如128),會(huì)新建不同的Integer對(duì)象,故c和d的==比較為false。當(dāng)Integer對(duì)象與基本類型int比較時(shí),會(huì)自動(dòng)拆箱為int值,因此c(128)與e(128)的數(shù)值相等,結(jié)果為true。3.說(shuō)明Java中方法重載(Overload)與方法重寫(xiě)(Override)的區(qū)別(1)定義位置:重載發(fā)生在同一類中,重寫(xiě)發(fā)生在子類與父類(或接口實(shí)現(xiàn)類)之間;(2)參數(shù)列表:重載要求參數(shù)類型、個(gè)數(shù)或順序至少有一個(gè)不同,與返回值無(wú)關(guān);重寫(xiě)要求參數(shù)列表和返回值類型必須與父類方法完全一致(協(xié)變返回類型允許子類返回值為父類返回值的子類);(3)訪問(wèn)權(quán)限:重載無(wú)限制;重寫(xiě)時(shí)子類方法的訪問(wèn)權(quán)限不能小于父類方法(如父類方法為protected,子類不能為默認(rèn)或private);(4)異常聲明:重載無(wú)限制;重寫(xiě)時(shí)子類方法聲明的異常不能是父類方法聲明異常的父類(可更小或不聲明);(5)靜態(tài)綁定與動(dòng)態(tài)綁定:重載在編譯期通過(guò)參數(shù)類型靜態(tài)綁定;重寫(xiě)在運(yùn)行期根據(jù)對(duì)象實(shí)際類型動(dòng)態(tài)綁定。4.寫(xiě)出以下代碼的執(zhí)行順序及輸出結(jié)果```javaclassGrandfather{publicGrandfather(){System.out.println("Grandfather構(gòu)造");method();}publicvoidmethod(){System.out.println("Grandfathermethod");}}classFatherextendsGrandfather{privateintx=10;publicFather(){super();System.out.println("Father構(gòu)造");method();}@Overridepublicvoidmethod(){System.out.println("Fathermethod,x="+x);}}classSonextendsFather{privateintx=20;publicSon(){System.out.println("Son構(gòu)造");}@Overridepublicvoidmethod(){System.out.println("Sonmethod,x="+x);}}publicclassTest{publicstaticvoidmain(String[]args){newSon();}}```執(zhí)行順序及輸出:(1)調(diào)用Son構(gòu)造方法,隱式調(diào)用父類Father的構(gòu)造方法;(2)Father構(gòu)造方法調(diào)用super(),即Grandfather的構(gòu)造方法;(3)Grandfather構(gòu)造方法執(zhí)行,輸出"Grandfather構(gòu)造",然后調(diào)用method()。此時(shí)實(shí)際對(duì)象是Son(多態(tài)),因此調(diào)用Son的method(),但Son的實(shí)例變量x尚未初始化(對(duì)象構(gòu)造順序?yàn)椋焊割愳o態(tài)成員→子類靜態(tài)成員→父類實(shí)例成員初始化→父類構(gòu)造方法→子類實(shí)例成員初始化→子類構(gòu)造方法),此時(shí)Son的x為默認(rèn)值0,輸出"Sonmethod,x=0";(4)Grandfather構(gòu)造完成,回到Father構(gòu)造方法,執(zhí)行實(shí)例變量x的初始化(x=10),輸出"Father構(gòu)造",然后調(diào)用method()。此時(shí)對(duì)象類型是Son,調(diào)用Son的method(),Son的x仍未初始化(父類構(gòu)造未完成時(shí)子類實(shí)例變量未初始化),輸出"Sonmethod,x=0";(5)Father構(gòu)造完成,回到Son構(gòu)造方法,初始化Son的x=20,輸出"Son構(gòu)造"。最終輸出:Grandfather構(gòu)造Sonmethod,x=0Father構(gòu)造Sonmethod,x=0Son構(gòu)造5.解釋Java中finally塊的執(zhí)行時(shí)機(jī)及與return語(yǔ)句的關(guān)系finally塊在以下情況執(zhí)行:(1)try塊正常執(zhí)行完畢;(2)try塊拋出異常被catch塊捕獲并處理;(3)try塊拋出異常未被catch塊捕獲(此時(shí)finally執(zhí)行后異常繼續(xù)向上拋出)。finally塊不執(zhí)行的唯一情況是:JVM退出(如System.exit(0))或線程被終止。與return語(yǔ)句的關(guān)系:當(dāng)try或catch塊中存在return時(shí),finally塊會(huì)在return之前執(zhí)行。若finally塊中也有return語(yǔ)句,則會(huì)覆蓋try/catch中的return結(jié)果(不推薦這種寫(xiě)法,易導(dǎo)致邏輯混亂)。例如:```javapublicstaticinttest(){try{return1;}finally{return2;}}```此方法返回2,因?yàn)閒inally的return覆蓋了try的return。若finally中無(wú)return,但修改了返回值(如返回對(duì)象的屬性),則會(huì)影響最終結(jié)果:```javapublicstaticList<Integer>test(){List<Integer>list=newArrayList<>();try{list.add(1);returnlist;}finally{list.add(2);}}```此方法返回[1,2],因?yàn)閒inally修改了list的內(nèi)容,而list是引用類型,return返回的是引用。6.比較ArrayList、LinkedList和Vector的區(qū)別(1)底層結(jié)構(gòu):ArrayList基于動(dòng)態(tài)數(shù)組(Object[]);LinkedList基于雙向鏈表(Node節(jié)點(diǎn));Vector基于動(dòng)態(tài)數(shù)組(與ArrayList類似);(2)線程安全:ArrayList和LinkedList非線程安全;Vector通過(guò)synchronized修飾方法實(shí)現(xiàn)線程安全(性能較低);(3)隨機(jī)訪問(wèn):ArrayList和Vector支持O(1)時(shí)間的隨機(jī)訪問(wèn)(通過(guò)索引);LinkedList需O(n)時(shí)間遍歷;(4)插入/刪除效率:ArrayList在中間插入/刪除需移動(dòng)元素(O(n)時(shí)間),尾部操作O(1);LinkedList在任意位置插入/刪除均為O(1)(需定位到節(jié)點(diǎn),定位時(shí)間O(n));(5)擴(kuò)容機(jī)制:ArrayList默認(rèn)初始容量10,擴(kuò)容為原容量的1.5倍;Vector默認(rèn)擴(kuò)容為原容量的2倍(可通過(guò)構(gòu)造函數(shù)指定擴(kuò)容增量);(6)使用場(chǎng)景:頻繁隨機(jī)訪問(wèn)選ArrayList;頻繁插入/刪除(尤其首尾)選LinkedList;需要線程安全時(shí)優(yōu)先選擇CopyOnWriteArrayList(Vector已過(guò)時(shí))。7.簡(jiǎn)述HashMap的底層實(shí)現(xiàn)(JDK8及以上)JDK8中HashMap的底層結(jié)構(gòu)為“數(shù)組+鏈表+紅黑樹(shù)”:(1)數(shù)組(稱為“桶”,table):初始容量16(DEFAULT_INITIAL_CAPACITY),負(fù)載因子0.75(DEFAULT_LOAD_FACTOR),當(dāng)元素?cái)?shù)量超過(guò)capacityloadFactor時(shí)觸發(fā)擴(kuò)容(resize),容量翻倍;(2)鏈表:當(dāng)多個(gè)鍵的哈希值碰撞時(shí)(即哈希桶下標(biāo)相同),元素以鏈表形式存儲(chǔ)。鏈表節(jié)點(diǎn)為Node類型,包含hash、key、value、next屬性;(3)紅黑樹(shù):當(dāng)鏈表長(zhǎng)度≥8(TREEIFY_THRESHOLD)且數(shù)組長(zhǎng)度≥64(MIN_TREEIFY_CAPACITY)時(shí),鏈表轉(zhuǎn)換為紅黑樹(shù)(TreeNode類型),以減少查找時(shí)間(鏈表查找O(n)→紅黑樹(shù)O(logn));當(dāng)樹(shù)的大小≤6(UNTREEIFY_THRESHOLD)時(shí),紅黑樹(shù)退化為鏈表;put()方法流程:①計(jì)算key的哈希值(hash=key.hashCode()^(hash>>>16),高位參與運(yùn)算減少碰撞);②若數(shù)組為空(table==null),調(diào)用resize()初始化;③計(jì)算桶下標(biāo)(i=(n-1)&hash,n為數(shù)組長(zhǎng)度);④若桶中無(wú)元素,直接插入新節(jié)點(diǎn);⑤若桶中第一個(gè)元素的key與當(dāng)前key相等(hash和equals均相同),覆蓋value;⑥若桶中是紅黑樹(shù)節(jié)點(diǎn),調(diào)用putTreeVal()插入樹(shù)中;⑦若是鏈表節(jié)點(diǎn),遍歷鏈表:若找到相同key則覆蓋;若遍歷到末尾仍無(wú)相同key,則新增節(jié)點(diǎn),若鏈表長(zhǎng)度≥8,檢查數(shù)組長(zhǎng)度是否≥64,是則樹(shù)化,否則擴(kuò)容;⑧插入成功后,若size超過(guò)threshold(capacityloadFactor),調(diào)用resize()擴(kuò)容。注意:HashMap允許null鍵和null值(鍵最多一個(gè)null,值可多個(gè));非線程安全,多線程環(huán)境下可能導(dǎo)致擴(kuò)容時(shí)的死循環(huán)(JDK7)或數(shù)據(jù)丟失(JDK8),應(yīng)使用ConcurrentHashMap。8.說(shuō)明synchronized和ReentrantLock的區(qū)別(1)鎖類型:synchronized是關(guān)鍵字,JVM層面實(shí)現(xiàn);ReentrantLock是java.util.concurrent.locks包下的類,API層面實(shí)現(xiàn);(2)獲取鎖方式:synchronized自動(dòng)獲取和釋放鎖(作用域結(jié)束自動(dòng)釋放);ReentrantLock需手動(dòng)調(diào)用lock()獲取,unlock()釋放(通常在finally塊中釋放);(3)公平性:synchronized是非公平鎖(線程獲取鎖的順序與等待順序無(wú)關(guān));ReentrantLock可通過(guò)構(gòu)造函數(shù)指定公平鎖(newReentrantLock(true)),公平鎖會(huì)優(yōu)先分配給等待時(shí)間最長(zhǎng)的線程;(4)可中斷性:synchronized不可中斷(除非拋出異常);ReentrantLock可通過(guò)lockInterruptibly()方法實(shí)現(xiàn)可中斷獲取鎖;(5)條件變量:synchronized配合wait()/notify()/notifyAll()使用,只能有一個(gè)等待隊(duì)列;ReentrantLock通過(guò)Condition對(duì)象(如newCondition())支持多個(gè)等待隊(duì)列(如生產(chǎn)者-消費(fèi)者模型中可分別為生產(chǎn)者和消費(fèi)者創(chuàng)建不同的Condition);(6)性能:JDK6后synchronized通過(guò)鎖升級(jí)(偏向鎖→輕量級(jí)鎖→重量級(jí)鎖)優(yōu)化,性能與ReentrantLock接近,但高競(jìng)爭(zhēng)場(chǎng)景下ReentrantLock性能更穩(wěn)定。9.寫(xiě)出實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型的兩種方式(要求使用wait/notify和Lock/Condition各一種)方式一:使用synchronized+wait/notify```javaimportjava.util.LinkedList;publicclassProducerConsumer{privatestaticfinalintMAX_SIZE=5;privatestaticLinkedList<Integer>queue=newLinkedList<>();publicstaticvoidmain(String[]args){Threadproducer=newThread(()->{while(true){synchronized(queue){while(queue.size()==MAX_SIZE){try{queue.wait();//隊(duì)列滿,生產(chǎn)者等待}catch(InterruptedExceptione){e.printStackTrace();}}intproduct=newjava.util.Random().nextInt(100);queue.add(product);System.out.println("生產(chǎn):"+product+",隊(duì)列大?。?+queue.size());queue.notifyAll();//喚醒消費(fèi)者}try{Thread.sleep(500);//模擬生產(chǎn)耗時(shí)}catch(InterruptedExceptione){e.printStackTrace();}}});Threadconsumer=newThread(()->{while(true){synchronized(queue){while(queue.isEmpty()){try{queue.wait();//隊(duì)列空,消費(fèi)者等待}catch(InterruptedExceptione){e.printStackTrace();}}intproduct=queue.poll();System.out.println("消費(fèi):"+product+",隊(duì)列大?。?+queue.size());queue.notifyAll();//喚醒生產(chǎn)者}try{Thread.sleep(800);//模擬消費(fèi)耗時(shí)}catch(InterruptedExceptione){e.printStackTrace();}}});producer.start();consumer.start();}}```方式二:使用ReentrantLock+Condition```javaimportjava.util.LinkedList;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassProducerConsumerWithLock{privatestaticfinalintMAX_SIZE=5;privatestaticLinkedList<Integer>queue=newLinkedList<>();privatestaticLocklock=newReentrantLock();privatestaticConditionnotFull=lock.newCondition();//隊(duì)列未滿條件privatestaticConditionnotEmpty=lock.newCondition();//隊(duì)列未空條件publicstaticvoidmain(String[]args){Threadproducer=newThread(()->{while(true){lock.lock();try{while(queue.size()==MAX_SIZE){notFull.await();//隊(duì)列滿,等待}intproduct=newjava.util.Random().nextInt(100);queue.add(product);System.out.println("生產(chǎn):"+product+",隊(duì)列大?。?+queue.size());notEmpty.signal();//喚醒消費(fèi)者}catch(InterruptedExceptione){e.printStackTrace();}finally{lock.unlock();}try{Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}}});Threadconsumer=newThread(()->{while(true){lock.lock();try{while(queue.isEmpty()){notEmpty.await();//隊(duì)列空,等待}intproduct=queue.poll();System.out.println("消費(fèi):"+product+",隊(duì)列大?。?+queue.size());notFull.signal();//喚醒生產(chǎn)者}catch(InterruptedExceptione){e.printStackTrace();}finally{lock.unlock();}try{Thread.sleep(800);}catch(InterruptedExceptione){e.printStackTrace();}}});producer.start();consumer.start();}}```10.簡(jiǎn)述JavaIO流的分類及常用類JavaIO流按數(shù)據(jù)流向分為輸入流(InputStream/Reader)和輸出流(OutputStream/Writer);按處理數(shù)據(jù)類型分為字節(jié)流(處理二進(jìn)制數(shù)據(jù),以byte為單位)和字符流(處理文本數(shù)據(jù),以char為單位,內(nèi)部使用編碼轉(zhuǎn)換);按功能分為節(jié)點(diǎn)流(直接操作數(shù)據(jù)源,如FileInputStream)和處理流(包裝節(jié)點(diǎn)流以增強(qiáng)功能,如BufferedInputStream)。常用字節(jié)流類:節(jié)點(diǎn)流:FileInputStream(文件輸入)、FileOutputStream(文件輸出)、ByteArrayInputStream(字節(jié)數(shù)組輸入)、ByteArrayOutputStream(字節(jié)數(shù)組輸出);處理流:BufferedInputStream(緩沖輸入)、BufferedOutputStream(緩沖輸出)、DataInputStream(基本類型輸入)、DataOutputStream(基本類型輸出)、ObjectInputStream(對(duì)象反序列化)、ObjectOutputStream(對(duì)象序列化)。常用字符流類:節(jié)點(diǎn)流:FileReader(文件字符輸入)、FileWriter(文件字符輸出)、CharArrayReader(字符數(shù)組輸入)、CharArrayWriter(字符數(shù)組輸出);處理流:BufferedReader(緩沖字符輸入,支持readLine())、BufferedWriter(緩沖字符輸出)、InputStreamReader(字節(jié)流轉(zhuǎn)字符流,可指定編碼)、OutputStreamWriter(字符流轉(zhuǎn)字節(jié)流,可指定編碼)、PrintWriter(格式化輸出)。注意:字符流默認(rèn)使用平臺(tái)編碼(如Windows的GBK,Linux的UTF-8),建議通過(guò)InputStreamReader/OutputStreamWriter顯式指定編碼(如newInputStreamReader(fileInputStream,"UTF-8"))。11.解釋JVM的內(nèi)存區(qū)域劃分及各區(qū)域的作用JVM內(nèi)存區(qū)域分為線程共享區(qū)和線程獨(dú)占區(qū):(1)線程獨(dú)占區(qū)(隨線程創(chuàng)建和銷毀):程序計(jì)數(shù)器(ProgramCounterRegister):記錄當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào),線程切換時(shí)恢復(fù)執(zhí)行位置。唯一不會(huì)發(fā)生內(nèi)存溢出的區(qū)域;虛擬機(jī)棧(VMStack):存儲(chǔ)棧幀(每個(gè)方法調(diào)用對(duì)應(yīng)一個(gè)棧幀),包含局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。若線程請(qǐng)求的棧深度超過(guò)最大值(-Xss設(shè)置),拋出StackOverflowError;若棧擴(kuò)展失敗,拋出OutOfMemoryError;本地方法棧(NativeMethodStack):與虛擬機(jī)棧類似,用于本地方法(如C語(yǔ)言實(shí)現(xiàn)的方法)的調(diào)用。HotSpot虛擬機(jī)將其與虛擬機(jī)棧合并。(2)線程共享區(qū):堆(Heap):JVM管理的最大內(nèi)存區(qū)域,所有對(duì)象實(shí)例和數(shù)組在此分配。通過(guò)-XX:Xms(初始大?。┖?XX:Xmx(最大大小)設(shè)置。堆內(nèi)存不足時(shí)拋出OutOfMemoryError(Javaheapspace);方法區(qū)(MethodArea):存儲(chǔ)類信息(類版本、字段、方法、接口)、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等。JDK7前稱為“永久代”(PermanentGeneration),使用堆的一部分;JDK8后改為“元空間”(Metaspace),使用本地內(nèi)存(NativeMemory),通過(guò)-XX:MaxMetaspaceSize設(shè)置上限;運(yùn)行時(shí)常量池(RuntimeConstantPool):方法區(qū)的一部分,存儲(chǔ)編譯期提供的字面量(如字符串、數(shù)字)和符號(hào)引用(如類名、方法名)。JDK7后字符串常量池從方法區(qū)移至堆中;直接內(nèi)存(DirectMemory):非JVM規(guī)范定義的區(qū)域,通過(guò)Unsafe類或NIO的ByteBuffer.allocateDirect()分配,不受堆內(nèi)存限制,但受物理內(nèi)存和-XX:MaxDirectMemorySize(默認(rèn)與堆最大值相同)限制,溢出時(shí)拋出OutOfMemoryError(Directbuffermemory)。12.說(shuō)明Java中類加載的過(guò)程及雙親委派機(jī)制類加載過(guò)程分為5個(gè)階段(注意:解析階段可能在初始化之后,稱為“動(dòng)態(tài)綁定”):(1)加載(Loading):通過(guò)類加載器將.class文件的二進(jìn)制字節(jié)流加載到內(nèi)存,提供java.lang.Class對(duì)象;(2)驗(yàn)證(Verification):檢查字節(jié)流是否符合JVM規(guī)范(如文件格式、元數(shù)據(jù)、字節(jié)碼、符號(hào)引用驗(yàn)證),確保安全;(3)準(zhǔn)備(Preparation):為類的靜態(tài)變量分配內(nèi)存并設(shè)置初始值(如int型初始為0,引用類型初始為null)。常量(staticfinal)在此階段直接賦值為編譯期常量值;(4)解析(Resolution):將符號(hào)引用(如“java.lang.Object”)替換為直接引用(內(nèi)存地址);(5)初始化(Initialization):執(zhí)行類構(gòu)造器<clinit>()方法(由編譯器自動(dòng)收集類中所有靜態(tài)變量的賦值動(dòng)作和靜態(tài)代碼塊合并提供),按順序執(zhí)行。雙親委派機(jī)制:類加載器收到類加載請(qǐng)求時(shí),不會(huì)立即自己加載,而是先委托給父類加載器(非繼承關(guān)系,而是組合關(guān)系),父類加載器再繼續(xù)向上委托,直到啟動(dòng)類加載器(BootstrapClassLoader)。若父類加載器無(wú)法加載(未找到對(duì)應(yīng).class文件),則子類加載器嘗試自己加載。作用:(1)避免重復(fù)加載:確保同一個(gè)類只被加載一次;(2)保證安全:防止用戶自定義的類覆蓋核心API(如自定義java.lang.String會(huì)被父類加載器加載為rt.jar中的String,不會(huì)使用用戶自定義的版本)。打破雙親委派的場(chǎng)景:(1)熱部署/熱替換:如OSGi框架中,每個(gè)模塊有獨(dú)立的類加載器,可自定義加載順序;(2)JNDI、JDBC等需要調(diào)用SPI實(shí)現(xiàn)類的場(chǎng)景:父類加載器(如啟動(dòng)類加載器)無(wú)法加載子類路徑的實(shí)現(xiàn)類,需通過(guò)線程上下文類加載器(ThreadContextClassLoader)反向委托;(3)自定義類加載器:某些框架(如Tomcat)為隔離不同應(yīng)用的類,會(huì)自定義類加載器并覆蓋loadClass()方法。13.簡(jiǎn)述Java垃圾回收(GC)的常見(jiàn)算法及HotSpot的常用收集器常見(jiàn)GC算法:(1)標(biāo)記-清除(Mark-Sweep):標(biāo)記不可達(dá)對(duì)象,然后清除。缺點(diǎn):產(chǎn)生內(nèi)存碎片,可能導(dǎo)致大對(duì)象無(wú)法分配;(2)復(fù)制(Copying):將內(nèi)存分為大小相等的兩塊,每次只使用一塊,回收時(shí)將存活對(duì)象復(fù)制到另一塊,然后清除當(dāng)前塊。缺點(diǎn):可用內(nèi)存減半,適用于存活對(duì)象少的區(qū)域(如新生代);(3)標(biāo)記-整理(Mark-Compact):標(biāo)記存活對(duì)象后,將其向內(nèi)存一端移動(dòng),然后清除邊界外的內(nèi)存。避免碎片,適用于存活對(duì)象多的區(qū)域(如老年代);(4)分代收集(GenerationalCollection):根據(jù)對(duì)象存活周期分為新生代(Eden區(qū)+兩個(gè)Survivor區(qū))和老年代。新生代使用復(fù)制算法(Eden:Survivor1:Survivor2=8:1:1,每次使用Eden+一個(gè)Survivor,回收后存活對(duì)象復(fù)制到另一個(gè)Survivor或老年代);老年代使用標(biāo)記-清除或標(biāo)記-整理算法。HotSpot常用收集器(JDK8及以上):(1)Serial收集器:?jiǎn)尉€程,新生代使用復(fù)制算法,老年代使用標(biāo)記-整理。適用于客戶端模式或單核環(huán)境;(2)ParNew收集器:Serial的多線程版本,與CMS配合使用(JDK9后不再推薦);(3)ParallelScavenge(ParallelYoung):多線程,新生代復(fù)制算法,目標(biāo)是達(dá)到可控制的吞吐量(吞吐量=運(yùn)行用戶代碼時(shí)間/(用戶代碼時(shí)間+GC時(shí)間)),適用于后臺(tái)計(jì)算;(4)ParallelOld:ParallelScavenge的老年代版本,標(biāo)記-整理算法,與ParallelScavenge配合實(shí)現(xiàn)“吞吐量?jī)?yōu)先”;(5)CMS(ConcurrentMarkSweep):老年代收集器,目標(biāo)是低停頓。流程:初始標(biāo)記→并發(fā)標(biāo)記→重新標(biāo)記→并發(fā)清除。缺點(diǎn):占用CPU資源,無(wú)法處理浮動(dòng)垃圾(并發(fā)標(biāo)記期間新產(chǎn)生的垃圾),標(biāo)記-清除算法產(chǎn)生碎片;(6)G1(Garbage-First):JDK9默認(rèn)收集器,跨新生代和老年代,將內(nèi)存劃分為多個(gè)Region,優(yōu)先回收垃圾多的Region(GarbageFirst)。流程:初始標(biāo)記→并發(fā)標(biāo)記→最終標(biāo)記→篩選回收。支持預(yù)測(cè)停頓時(shí)間,適用于大內(nèi)存、低延遲場(chǎng)景;(7)ZGC(JDK11+):基于Region和讀屏障,支持TB級(jí)內(nèi)存,停頓時(shí)間不超過(guò)10ms,適用于超大型應(yīng)用。14.分析以下代碼可能存在的問(wèn)題及改進(jìn)方法```javapublicclassUnsafeCache{privateMap<String,Object>cache=newHashMap<>();publicObjectget(Stringkey){Objectvalue=cache.get(key);if(value==null){value=loadFromDB(key);//從數(shù)據(jù)庫(kù)加載cache.put(key,value);}returnvalue;}privateObjectloadFromDB(Stringkey){//模擬數(shù)據(jù)庫(kù)查詢r(jià)eturnnewObject();}}```存在的問(wèn)題:(1)線程不安全:多線程并發(fā)調(diào)用get()時(shí),可能出現(xiàn)多個(gè)線程同時(shí)檢測(cè)到value為null,導(dǎo)致重復(fù)加載數(shù)據(jù)庫(kù)并多次put(),浪費(fèi)資源;(2)可能的空指針:若loadFromDB返回null(數(shù)據(jù)庫(kù)無(wú)對(duì)應(yīng)數(shù)據(jù)),cache中會(huì)存儲(chǔ)null,后續(xù)線程獲取到null后可能再次加載(需根據(jù)業(yè)務(wù)需求決定是否緩存null);(3)HashMap非線程安全:多線程put()可能導(dǎo)致數(shù)據(jù)丟失或死循環(huán)(JDK7)。改進(jìn)方法:使用ConcurrentHashMap替代HashMap,并通過(guò)putIfAbsent()原子操作避免重復(fù)加載:```javaimportjava.util.concurrent.ConcurrentHashMap;publicclassSafeCache{privateConcurrentHashMap<String,Object>cache=newConcurrentHashMap<>();publicObjectget(Stringkey){Objectvalue

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論