1. int 與Integer區(qū)別
- 無論如何痰催,Integer與new Integer不會(huì)相等奴璃。不會(huì)經(jīng)歷拆箱過程,i3的引用指向堆曲梗,而i4指向?qū)iT存放他的內(nèi)存(常量池),他們的內(nèi)存地址不一樣妓忍,所以為false
- 兩個(gè)都是非new出來的Integer虏两,如果數(shù)在-128到127之間,則是true,否則為false
java在編譯Integer i2 = 128的時(shí)候,被翻譯成-> Integer i2 = Integer.valueOf(128);而valueOf()函數(shù)會(huì)對(duì)-128到127之間的數(shù)進(jìn)行緩存 - 兩個(gè)都是new出來的,都為false
- int和integer(無論new否)比世剖,都為true定罢,因?yàn)闀?huì)把Integer自動(dòng)拆箱為int再去比
轉(zhuǎn)載:https://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html
int占用內(nèi)存比integer要小,integer是對(duì)象類型旁瘫,需要儲(chǔ)存對(duì)象元數(shù)
JVM JRE JDK JIT之間的區(qū)別
2.java虛擬機(jī)(JVM)
使用java編程語言的主要優(yōu)勢(shì)就是平臺(tái)的獨(dú)立性祖凫。你曾經(jīng)想知道過java怎么實(shí)現(xiàn)平臺(tái)的獨(dú)立性嗎?對(duì)酬凳,就是虛擬機(jī)惠况,它抽象化了硬件設(shè)備,開發(fā)者和他們的程序的得以操作系統(tǒng)宁仔。虛擬機(jī)的職責(zé)就是處理和操作系統(tǒng)的交流稠屠。java不同的接口規(guī)范對(duì)任何平臺(tái)都有良好的支持,因?yàn)閖vm很好的實(shí)現(xiàn)了每個(gè)平臺(tái)的規(guī)范翎苫。jvm可以理解偽代碼字節(jié)碼权埠,在用戶和操作系統(tǒng)之間建立了一層樞紐。
java運(yùn)行時(shí)環(huán)境(JRE)
java運(yùn)行時(shí)環(huán)境是JVM的一個(gè)超集煎谍。JVM對(duì)于一個(gè)平臺(tái)或者操作系統(tǒng)是明確的攘蔽,而JRE確實(shí)一個(gè)一般的概念,他代表了完整的運(yùn)行時(shí)環(huán)境呐粘。我們?cè)趈re文件夾中看到的所有的jar文件和可執(zhí)行文件都會(huì)變成運(yùn)行時(shí)的一部分满俗。事實(shí)上转捕,運(yùn)行時(shí)JRE變成了JVM。所以對(duì)于一般情況時(shí)候使用JRE漫雷,對(duì)于明確的操作系統(tǒng)來說使用JVM。當(dāng)你下載了JRE的時(shí)候鳍咱,也就自動(dòng)下載了JVM降盹。
java開發(fā)工具箱(JDK)
java開發(fā)工具箱指的是編寫一個(gè)java應(yīng)用所需要的所有jar文件和可執(zhí)行文件。事實(shí)上谤辜,JRE是JKD的一部分蓄坏。如果你下載了JDK,你會(huì)看到一個(gè)名叫JRE的文件夾在里面。JDK中要被牢記的jar文件就是tools.jar,它包含了用于執(zhí)行java文檔的類還有用于類簽名的jar包丑念。
即時(shí)編譯器(JIT)
即時(shí)編譯器是種特殊的編譯器涡戳,它通過有效的把字節(jié)碼變成機(jī)器碼來提高JVM的效率。JIT這種功效很特殊脯倚,因?yàn)樗褭z測到的相似的字節(jié)碼編譯成單一運(yùn)行的機(jī)器碼渔彰,從而節(jié)省了CPU的使用。這和其他的字節(jié)碼編譯器不同推正,因?yàn)樗沁\(yùn)行時(shí)(第一類執(zhí)行的編譯恍涂?)the firs of its kind to perform the compilation(從字節(jié)碼到機(jī)器碼)而不是在程序運(yùn)行之前。正是因?yàn)檫@些植榕,動(dòng)態(tài)編譯這個(gè)詞匯才和JIT有那么緊密的關(guān)系再沧。
轉(zhuǎn)載:https://blog.csdn.net/orangleliu/article/details/38309407
3.抽象類和接口區(qū)別
- 抽象類中可以包含非抽象的普通方法,而接口中所有的方法必須是抽象的尊残,不能有非抽象的普通方法炒瘸。
- 一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類寝衫。
- 抽象類里可以有構(gòu)造方法顷扩,而接口內(nèi)不能有構(gòu)造方法。
- 抽象類中的抽象方法的訪問類型可以是public 慰毅,protected和默認(rèn)類型屎即,但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型事富。
- 抽象類中可以包含靜態(tài)方法技俐,接口內(nèi)不能包含靜態(tài)方法。
- 抽象類和接口中都可以包含靜態(tài)成員變量统台,抽象類中的靜態(tài)成員變量的訪問類型可以任意雕擂,但接口中定義的變量只能是public static final類型,并且默認(rèn)為public static final類型贱勃。
- 抽象類中可以有普通成員變量井赌,而接口中不能有普通成員變量谤逼。
4.用SQL查找表中多余的重復(fù)記錄,重復(fù)記錄根據(jù)單個(gè)字段(ID)來判斷
4.對(duì)線程的理解
1).線程是進(jìn)程的子集仇穗,一個(gè)進(jìn)程可有多個(gè)線程
2).是cup執(zhí)行的基本單位流部,擁有代理的寄存器和棧
3).同一進(jìn)程下,線程共享地址和內(nèi)存空間
4).線程的狀態(tài):新建纹坐,就緒(等待cup使用權(quán))枝冀,運(yùn)行,堵塞(暫時(shí)放棄cup使用權(quán)耘子,等待資源)
5.SpringMVC執(zhí)行流程
- 客戶端發(fā)起請(qǐng)求到DispatcherServlet(前端控制器)
- 前端控制器請(qǐng)求HandlerMapping(處理器映射器)查找 Handle根據(jù)xml配置果漾、注解進(jìn)行查找
- HandlerMapping(處理器映射器)向DispatcherServlet(前端控器)返回Handler
- DispatcherServlet(前端控制器)調(diào)用HandlerAdapter(處理器適配器)去執(zhí)行Handler
- HandlerAdapter(處理器適配器)去執(zhí)行Handler
- Handler執(zhí)行完成給HandlerAdapter(處理器適配器)返回ModelAndView
- HandlerAdapter(處理器適配器)向前端控制器返ModelAndView
- 前端控制器請(qǐng)求ResolverView(視圖解析器)去進(jìn)行視圖解析根據(jù)邏輯視圖名解析成真正的視圖(jsp)
- ResolverView(視圖解析器)向DispatcherServlet(前端控制器)返回View
- DispatcherServlet(前端控制器)進(jìn)行視圖渲染
視圖渲染將模型數(shù)據(jù)(在ModelAndView對(duì)象中)填充到request域
最后DispatcherServlet(前端控制器)向用戶響應(yīng)(response)結(jié)果
6.struts2執(zhí)行流程
- 用戶發(fā)送請(qǐng)求;
- 這個(gè)請(qǐng)求經(jīng)過一系列的過濾器(Filter)(這些過濾器中有一個(gè)叫做ActionContextCleanUp的可選過濾器谷誓,這個(gè)過濾器對(duì)于Struts2和其他框架的集成很有幫助绒障,例如:SiteMesh Plugin)
- 接著FilterDispatcher被調(diào)用,F(xiàn)ilterDispatcher詢問ActionMapper來決定這個(gè)請(qǐng)求是否需要調(diào)用某個(gè)Action 捍歪;
- 如果需要處理户辱,ActionMapper會(huì)通知FilterDispatcher,需要處理這個(gè)請(qǐng)求糙臼,F(xiàn)ilterDispatcher會(huì)停止過濾器鏈以后的部分焕妙,(這也就是為什么,F(xiàn)ilterDispatcher應(yīng)該出現(xiàn)在過濾器鏈的最后的原因)弓摘。FilterDispatcher把請(qǐng)求的處理交給ActionProxy 焚鹊;
- ActionProxy通過Configuration Manager詢問框架的配置文件struts.xml,找到需要調(diào)用的Action類 韧献。(在服務(wù)器啟動(dòng)的時(shí)候末患,ConfigurationManager就會(huì)把struts.xml中的所有信息讀到內(nèi)存里,并緩存锤窑,當(dāng)ActionProxy帶著URL向他詢問要運(yùn)行哪個(gè)Action的時(shí)候璧针,就可以直接匹配、查找并回答了)
- ActionProxy創(chuàng)建一個(gè)ActionInvocation的實(shí)例渊啰。
- ActionInvocation實(shí)例使用命名模式來調(diào)用探橱,在調(diào)用Action的過程前后,涉及到一系列相關(guān)攔截器(Intercepter)的調(diào)用绘证。
- 一旦Action執(zhí)行完畢隧膏,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對(duì)應(yīng)的返回結(jié)果。返回結(jié)果通常是(但不總是嚷那,也可 能是另外的一個(gè)Action鏈)一個(gè)需要被表示的JSP或者FreeMarker的模版胞枕。在表示的過程中可以使用Struts2 框架中繼承的標(biāo)簽。
- 最后魏宽,ActionInvocation對(duì)象倒序執(zhí)行攔截器腐泻。
10.ActionInvocation對(duì)象執(zhí)行完畢后决乎,響應(yīng)用戶。
7.如何解決高并發(fā)
- 盡量使用緩存技術(shù)來做派桩。用戶緩存构诚、頁面緩存等一切緩存,使用特定的機(jī)制進(jìn)行刷新铆惑。利用消耗內(nèi)存空間來換取用戶的效率范嘱。同時(shí)減少數(shù)據(jù)庫的訪問次數(shù)。
- 把數(shù)據(jù)庫的查詢語句進(jìn)行優(yōu)化鸭津,一般復(fù)雜的SQL語句就不要使用ORM框架自帶的做法來寫彤侍,采用自己來寫SQL肠缨,例如hibernate的hql中的復(fù)雜語句逆趋,就會(huì)很耗時(shí)
- 優(yōu)化數(shù)據(jù)庫表的結(jié)構(gòu),在關(guān)鍵字晒奕、主鍵闻书、訪問率極高的字段中加入索引。但盡量只是在數(shù)字類型上面加脑慧。因?yàn)槭褂? 字段 is null的時(shí)候魄眉,索引的效果會(huì)失效
- 報(bào)表統(tǒng)計(jì)的模塊,盡量采用定時(shí)任務(wù)執(zhí)行闷袒,如果非得要實(shí)時(shí)進(jìn)行刷新坑律,那么可以采用緩存來做數(shù)據(jù)。
- 可以使用靜態(tài)頁面的地方囊骤,使用靜態(tài)頁面晃择,減少頁面解析時(shí)間,同時(shí)由于頁面中有許多圖片的這種也物,可以考慮一下把圖片做成一個(gè)服務(wù)器宫屠,這樣可以減少業(yè)務(wù)服務(wù)器的壓力。
- 使用集群的方式來解決滑蚯,單臺(tái)服務(wù)器性能的問題浪蹂。
- 把項(xiàng)目,拆分成為多個(gè)應(yīng)用小型服務(wù)器形式告材,來進(jìn)行分布式部署坤次。采用數(shù)據(jù)同步機(jī)制(可以使用數(shù)據(jù)庫同步形式來做)達(dá)到數(shù)據(jù)一致性。
- 使用負(fù)載均衡模式斥赋,來讓每一個(gè)服務(wù)器資源進(jìn)行合理的利用浙踢。
- 緩存機(jī)制中,可以使用redis來做內(nèi)存數(shù)據(jù)庫緩存起來灿渴。也可以使用鏡像分擔(dān)洛波,這樣可以讓兩臺(tái)服務(wù)器進(jìn)行訪問胰舆,提高服務(wù)器的訪問量
8.數(shù)據(jù)庫優(yōu)化
- 避免在WHERE子句中使用in,not in蹬挤,or 或者h(yuǎn)aving缚窿。
可以使用 exist 和not exist代替 in和not in。
可以使用表鏈接代替 exist焰扳。
Having可以用where代替倦零,如果無法代替可以分兩步處理。
例子
SELECT * FROM ORDERS WHERE CUSTOMER_NAME NOT IN
(SELECT CUSTOMER_NAME FROM CUSTOMER)
優(yōu)化:
SELECT * FROM ORDERS WHERE CUSTOMER_NAME not exist
(SELECT CUSTOMER_NAME FROM CUSTOMER)
- 不要在建立的索引的數(shù)據(jù)列上進(jìn)行下列操作:
(1)避免對(duì)索引字段進(jìn)行計(jì)算操作
(2)避免在索引字段上使用not吨悍,<>扫茅,!=
(3)避免在索引列上使用IS NULL和IS NOT NULL
(4)避免在索引列上出現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換
(5)避免在索引字段上使用函數(shù)