一. Java基礎(chǔ)
- 在java中String類為什么要設(shè)計(jì)成final?
- ClassLoader.loadClass()與Class.forName()的區(qū)別
- String 編碼UTF-8 和GBK的區(qū)別?
字符編碼筆記:ASCII,Unicode和UTF-8 忆首。
(精)字符集GBK和UTF8的區(qū)別說(shuō)明 - 什么時(shí)候使用字節(jié)流盟蚣、什么時(shí)候使用字符流,二者的區(qū)別
JVM
1笤虫、JVM初始化步驟 ? 2、類初始化時(shí)機(jī) 见坑?3嚷掠、哪幾種情況下,Java虛擬機(jī)將結(jié)束生命周期荞驴?
初始化不皆,為類的靜態(tài)變量賦予正確的初始值,JVM負(fù)責(zé)對(duì)類進(jìn)行初始化熊楼,主要對(duì)類變量進(jìn)行初始化霹娄。在Java中對(duì)類變量進(jìn)行初始值設(shè)定有兩種方式:
①聲明類變量是指定初始值
②使用靜態(tài)代碼塊為類變量指定初始值
- JVM初始化步驟
1、假如這個(gè)類還沒(méi)有被加載和連接鲫骗,則程序先加載并連接該類
2犬耻、假如該類的直接父類還沒(méi)有被初始化,則先初始化其直接父類
3执泰、假如類中有初始化語(yǔ)句枕磁,則系統(tǒng)依次執(zhí)行這些初始化語(yǔ)句 - 類初始化時(shí)機(jī):只有當(dāng)對(duì)類的主動(dòng)使用的時(shí)候才會(huì)導(dǎo)致類的初始化,類的主動(dòng)使用包括以下六種:
- 創(chuàng)建類的實(shí)例术吝,也就是new的方式
- 訪問(wèn)某個(gè)類或接口的靜態(tài)變量计济,或者對(duì)該靜態(tài)變量賦值
- 調(diào)用類的靜態(tài)方法
- 反射(如Class.forName(“com.shengsiyuan.Test”))
- 初始化某個(gè)類的子類,則其父類也會(huì)被初始化
- Java虛擬機(jī)啟動(dòng)時(shí)被標(biāo)明為啟動(dòng)類的類(Java Test)排苍,直接使用java.exe命令來(lái)運(yùn)行某個(gè)主類
- 結(jié)束生命周期
在如下幾種情況下沦寂,Java虛擬機(jī)將結(jié)束生命周期- 執(zhí)行了System.exit()方法
- 程序正常執(zhí)行結(jié)束
- 程序在執(zhí)行過(guò)程中遇到了異常或錯(cuò)誤而異常終止
- 由于操作系統(tǒng)出現(xiàn)錯(cuò)誤而導(dǎo)致Java虛擬機(jī)進(jìn)程終止
Java 并發(fā)
如何合理的配置java線程池淘衙?如CPU密集型的任務(wù)传藏,基本線程池應(yīng)該配置多大?IO密集型的任務(wù)幔翰,基本線程池應(yīng)該配置多大漩氨?用有界隊(duì)列好還是無(wú)界隊(duì)列好?任務(wù)非常多的時(shí)候遗增,使用什么阻塞隊(duì)列能獲取最好的吞吐量叫惊?
答:1)配置線程池時(shí)CPU密集型任務(wù)可以少配置線程數(shù),大概和機(jī)器的cpu核數(shù)相當(dāng)做修,可以使得每個(gè)線程都在執(zhí)行任務(wù)
2)IO密集型時(shí)霍狰,大部分線程都阻塞,故需要多配置線程數(shù)饰及,2*cpu核數(shù)
3)有界隊(duì)列和無(wú)界隊(duì)列的配置需區(qū)分業(yè)務(wù)場(chǎng)景蔗坯,一般情況下配置有界隊(duì)列,在一些可能會(huì)有爆發(fā)性增長(zhǎng)的情況下使用無(wú)界隊(duì)列燎含。
4)任務(wù)非常多時(shí)宾濒,使用非阻塞隊(duì)列使用CAS操作替代鎖可以獲得好的吞吐量。
動(dòng)態(tài)代理
在程序運(yùn)行時(shí)屏箍,運(yùn)用反射機(jī)制動(dòng)態(tài)創(chuàng)建而成绘梦。動(dòng)態(tài)代理的優(yōu)勢(shì)就是實(shí)現(xiàn)無(wú)侵入式的代碼擴(kuò)展橘忱。
應(yīng)用場(chǎng)景
- 方法增強(qiáng),Spring AOP
- 遠(yuǎn)程調(diào)用卸奉,RPC
JDK動(dòng)態(tài)代理與CGLIB區(qū)別
- JDK動(dòng)態(tài)代理只能對(duì)實(shí)現(xiàn)了接口的類生成代理钝诚,而不能針對(duì)類。
- CGLIB是針對(duì)類實(shí)現(xiàn)代理榄棵,主要是對(duì)指定的類生成一個(gè)子類凝颇,覆蓋其中的方法。
CGLIB是一個(gè)強(qiáng)大的高性能的代碼生成庫(kù)疹鳄。作為JDK動(dòng)態(tài)代理的互補(bǔ)拧略,它對(duì)于那些沒(méi)有實(shí)現(xiàn)接口的類提供了代理方案。在底層尚辑,它使用ASM字節(jié)碼操縱框架辑鲤。本質(zhì)上來(lái)說(shuō),CGLIB通過(guò)產(chǎn)生子類覆蓋非final方法來(lái)進(jìn)行代理杠茬。它比使用Java反射的JDK動(dòng)態(tài)代理方法更快。CGLIB不能代理一個(gè)final類或者final方法弛随。通常來(lái)說(shuō)瓢喉,你可以使用JDK動(dòng)態(tài)代理方法來(lái)創(chuàng)建代理,對(duì)于沒(méi)有接口的情況或者性能因素舀透,CGLIB是一個(gè)很好的選擇栓票。