各大公司Java面試題超詳細(xì)總結(jié)

各大公司Java面試題超詳細(xì)總結(jié)

ThreadLocal(線(xiàn)程變量副本)

Synchronized實(shí)現(xiàn)內(nèi)存共享梢灭,ThreadLocal為每個(gè)線(xiàn)程維護(hù)一個(gè)本地變量。

采用空間換時(shí)間术裸,它用于線(xiàn)程間的數(shù)據(jù)隔離,為每一個(gè)使用該變量的線(xiàn)程提供一個(gè)副本级遭,每個(gè)線(xiàn)程都可以獨(dú)立地改變自己的副本芬位,而不會(huì)和其他線(xiàn)程的副本沖突。

ThreadLocal類(lèi)中維護(hù)一個(gè)Map笼呆,用于存儲(chǔ)每一個(gè)線(xiàn)程的變量副本熊响,Map中元素的鍵為線(xiàn)程對(duì)象,而值為對(duì)應(yīng)線(xiàn)程的變量副本诗赌。

ThreadLocal在Spring中發(fā)揮著巨大的作用汗茄,在管理Request作用域中的Bean、事務(wù)管理铭若、任務(wù)調(diào)度洪碳、AOP等模塊都出現(xiàn)了它的身影。

Spring中絕大部分Bean都可以聲明成Singleton作用域叼屠,采用ThreadLocal進(jìn)行封裝瞳腌,因此有狀態(tài)的Bean就能夠以singleton的方式在多線(xiàn)程中正常工作了。

友情鏈接:深入研究java.lang.ThreadLocal類(lèi)

Java內(nèi)存模型:

Java虛擬機(jī)規(guī)范中將Java運(yùn)行時(shí)數(shù)據(jù)分為六種环鲤。

1.程序計(jì)數(shù)器:是一個(gè)數(shù)據(jù)結(jié)構(gòu)纯趋,用于保存當(dāng)前正常執(zhí)行的程序的內(nèi)存地址。Java虛擬機(jī)的多線(xiàn)程就是通過(guò)線(xiàn)程輪流切換并分配處理器時(shí)間來(lái)實(shí)現(xiàn)的冷离,為了線(xiàn)程切換后能恢復(fù)到正確的位置吵冒,每條線(xiàn)程都需要一個(gè)獨(dú)立的程序計(jì)數(shù)器,互不影響西剥,該區(qū)域?yàn)椤熬€(xiàn)程私有”痹栖。

2.Java虛擬機(jī)棧:線(xiàn)程私有的,與線(xiàn)程生命周期相同瞭空,用于存儲(chǔ)局部變量表揪阿,操作棧,方法返回值咆畏。局部變量表放著基本數(shù)據(jù)類(lèi)型南捂,還有對(duì)象的引用扫沼。

3.本地方法棧:跟虛擬機(jī)棧很像鲸匿,不過(guò)它是為虛擬機(jī)使用到的Native方法服務(wù)。

4.Java堆:所有線(xiàn)程共享的一塊內(nèi)存區(qū)域惰蜜,對(duì)象實(shí)例幾乎都在這分配內(nèi)存钮蛛。

5.方法區(qū):各個(gè)線(xiàn)程共享的區(qū)域鞭缭,儲(chǔ)存虛擬機(jī)加載的類(lèi)信息剖膳,常量,靜態(tài)變量岭辣,編譯后的代碼吱晒。

6.運(yùn)行時(shí)常量池:代表運(yùn)行時(shí)每個(gè)class文件中的常量表。包括幾種常量:編譯時(shí)的數(shù)字常量沦童、方法或者域的引用仑濒。

友情鏈接:?Java中JVM虛擬機(jī)詳解

“你能不能談?wù)劊琷ava GC是在什么時(shí)候搞动,對(duì)什么東西躏精,做了什么事情渣刷?”

在什么時(shí)候:

1.新生代有一個(gè)Eden區(qū)和兩個(gè)survivor區(qū)鹦肿,首先將對(duì)象放入Eden區(qū),如果空間不足就向其中的一個(gè)survivor區(qū)上放辅柴,如果仍然放不下就會(huì)引發(fā)一次發(fā)生在新生代的minor GC箩溃,將存活的對(duì)象放入另一個(gè)survivor區(qū)中,然后清空Eden和之前的那個(gè)survivor區(qū)的內(nèi)存碌嘀。在某次GC過(guò)程中涣旨,如果發(fā)現(xiàn)仍然又放不下的對(duì)象,就將這些對(duì)象放入老年代內(nèi)存里去股冗。

2.大對(duì)象以及長(zhǎng)期存活的對(duì)象直接進(jìn)入老年區(qū)霹陡。

3.當(dāng)每次執(zhí)行minor GC的時(shí)候應(yīng)該對(duì)要晉升到老年代的對(duì)象進(jìn)行分析,如果這些馬上要到老年區(qū)的老年對(duì)象的大小超過(guò)了老年區(qū)的剩余大小止状,那么執(zhí)行一次Full GC以盡可能地獲得老年區(qū)的空間烹棉。

對(duì)什么東西:從GC Roots搜索不到,而且經(jīng)過(guò)一次標(biāo)記清理之后仍沒(méi)有復(fù)活的對(duì)象怯疤。

做什么: 新生代:復(fù)制清理浆洗; 老年代:標(biāo)記-清除和標(biāo)記-壓縮算法; 永久代:存放Java中的類(lèi)和加載類(lèi)的類(lèi)加載器本身集峦。

GC Roots都有哪些: 1. 虛擬機(jī)棧中的引用的對(duì)象 2. 方法區(qū)中靜態(tài)屬性引用的對(duì)象伏社,常量引用的對(duì)象 3. 本地方法棧中JNI(即一般說(shuō)的Native方法)引用的對(duì)象。

友情鏈接:Java GC的那些事(上)

友情鏈接:Java GC的那些事(下)

友情鏈接:CMS垃圾收集器介紹

Synchronized 與Lock都是可重入鎖塔淤,同一個(gè)線(xiàn)程再次進(jìn)入同步代碼的時(shí)候.可以使用自己已經(jīng)獲取到的鎖摘昌。

Synchronized是悲觀(guān)鎖機(jī)制,獨(dú)占鎖高蜂。而Locks.ReentrantLock是聪黎,每次不加鎖而是假設(shè)沒(méi)有沖突而去完成某項(xiàng)操作,如果因?yàn)闆_突失敗就重試挺举,直到成功為止杀赢。 ReentrantLock適用場(chǎng)景

某個(gè)線(xiàn)程在等待一個(gè)鎖的控制權(quán)的這段時(shí)間需要中斷

需要分開(kāi)處理一些wait-notify,ReentrantLock里面的Condition應(yīng)用湘纵,能夠控制notify哪個(gè)線(xiàn)程脂崔,鎖可以綁定多個(gè)條件。

具有公平鎖功能梧喷,每個(gè)到來(lái)的線(xiàn)程都將排隊(duì)等候砌左。

友情鏈接:?Synchronized關(guān)鍵字、Lock铺敌,并解釋它們之間的區(qū)別

StringBuffer是線(xiàn)程安全的汇歹,每次操作字符串,String會(huì)生成一個(gè)新的對(duì)象偿凭,而StringBuffer不會(huì)产弹;StringBuilder是非線(xiàn)程安全的

友情鏈接:String、StringBuffer與StringBuilder之間區(qū)別

fail-fast:機(jī)制是java集合(Collection)中的一種錯(cuò)誤機(jī)制弯囊。當(dāng)多個(gè)線(xiàn)程對(duì)同一個(gè)集合的內(nèi)容進(jìn)行操作時(shí)痰哨,就可能會(huì)產(chǎn)生fail-fast事件。

例如:當(dāng)某一個(gè)線(xiàn)程A通過(guò)iterator去遍歷某集合的過(guò)程中匾嘱,若該集合的內(nèi)容被其他線(xiàn)程所改變了斤斧;那么線(xiàn)程A訪(fǎng)問(wèn)集合時(shí),就會(huì)拋出ConcurrentModificationException異常霎烙,產(chǎn)生fail-fast事件

happens-before:如果兩個(gè)操作之間具有happens-before 關(guān)系撬讽,那么前一個(gè)操作的結(jié)果就會(huì)對(duì)后面一個(gè)操作可見(jiàn)。

1.程序順序規(guī)則:一個(gè)線(xiàn)程中的每個(gè)操作悬垃,happens- before 于該線(xiàn)程中的任意后續(xù)操作游昼。

2.監(jiān)視器鎖規(guī)則:對(duì)一個(gè)監(jiān)視器鎖的解鎖,happens- before 于隨后對(duì)這個(gè)監(jiān)視器鎖的加鎖盗忱。

3.volatile變量規(guī)則:對(duì)一個(gè)volatile域的寫(xiě)酱床,happens- before于任意后續(xù)對(duì)這個(gè)volatile域的讀。

4.傳遞性:如果A happens- before B趟佃,且B happens- before C扇谣,那么A happens- before C。

5.線(xiàn)程啟動(dòng)規(guī)則:Thread對(duì)象的start()方法happens- before于此線(xiàn)程的每一個(gè)動(dòng)作闲昭。

Volatile和Synchronized四個(gè)不同點(diǎn):

1 粒度不同罐寨,前者針對(duì)變量 ,后者鎖對(duì)象和類(lèi)

2 syn阻塞序矩,volatile線(xiàn)程不阻塞

3 syn保證三大特性鸯绿,volatile不保證原子性

4 syn編譯器優(yōu)化,volatile不優(yōu)化 volatile具備兩種特性:

1.保證此變量對(duì)所有線(xiàn)程的可見(jiàn)性,指一條線(xiàn)程修改了這個(gè)變量的值瓶蝴,新值對(duì)于其他線(xiàn)程來(lái)說(shuō)是可見(jiàn)的毒返,但并不是多線(xiàn)程安全的。

2.禁止指令重排序優(yōu)化舷手。

Volatile如何保證內(nèi)存可見(jiàn)性:

1.當(dāng)寫(xiě)一個(gè)volatile變量時(shí)拧簸,JMM會(huì)把該線(xiàn)程對(duì)應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存。

2.當(dāng)讀一個(gè)volatile變量時(shí)男窟,JMM會(huì)把該線(xiàn)程對(duì)應(yīng)的本地內(nèi)存置為無(wú)效盆赤。線(xiàn)程接下來(lái)將從主內(nèi)存中讀取共享變量。

同步:就是一個(gè)任務(wù)的完成需要依賴(lài)另外一個(gè)任務(wù)歉眷,只有等待被依賴(lài)的任務(wù)完成后牺六,依賴(lài)任務(wù)才能完成。

異步:不需要等待被依賴(lài)的任務(wù)完成汗捡,只是通知被依賴(lài)的任務(wù)要完成什么工作淑际,只要自己任務(wù)完成了就算完成了,被依賴(lài)的任務(wù)是否完成會(huì)通知回來(lái)凉唐。(異步的特點(diǎn)就是通知)庸追。 打電話(huà)和發(fā)短信來(lái)比喻同步和異步操作。

阻塞:CPU停下來(lái)等一個(gè)慢的操作完成以后台囱,才會(huì)接著完成其他的工作。

非阻塞:非阻塞就是在這個(gè)慢的執(zhí)行時(shí)读整,CPU去做其他工作簿训,等這個(gè)慢的完成后,CPU才會(huì)接著完成后續(xù)的操作米间。

非阻塞會(huì)造成線(xiàn)程切換增加强品,增加CPU的使用時(shí)間能不能補(bǔ)償系統(tǒng)的切換成本需要考慮。

友情鏈接:Java并發(fā)編程之volatile關(guān)鍵字解析

CAS(Compare And Swap) 無(wú)鎖算法: CAS是樂(lè)觀(guān)鎖技術(shù)屈糊,當(dāng)多個(gè)線(xiàn)程嘗試使用CAS同時(shí)更新同一個(gè)變量時(shí)的榛,只有其中一個(gè)線(xiàn)程能更新變量的值,而其它線(xiàn)程都失敗逻锐,失敗的線(xiàn)程并不會(huì)被掛起夫晌,而是被告知這次競(jìng)爭(zhēng)中失敗,并可以再次嘗試昧诱。CAS有3個(gè)操作數(shù)晓淀,內(nèi)存值V,舊的預(yù)期值A(chǔ)盏档,要修改的新值B凶掰。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時(shí),將內(nèi)存值V修改為B,否則什么都不做懦窘。

友情鏈接:非阻塞同步算法與CAS(Compare and Swap)無(wú)鎖算法

線(xiàn)程池的作用: 在程序啟動(dòng)的時(shí)候就創(chuàng)建若干線(xiàn)程來(lái)響應(yīng)處理前翎,它們被稱(chēng)為線(xiàn)程池,里面的線(xiàn)程叫工作線(xiàn)程

第一:降低資源消耗畅涂。通過(guò)重復(fù)利用已創(chuàng)建的線(xiàn)程降低線(xiàn)程創(chuàng)建和銷(xiāo)毀造成的消耗鱼填。

第二:提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時(shí)毅戈,任務(wù)可以不需要等到線(xiàn)程創(chuàng)建就能立即執(zhí)行苹丸。

第三:提高線(xiàn)程的可管理性。

常用線(xiàn)程池:ExecutorService 是主要的實(shí)現(xiàn)類(lèi)苇经,其中常用的有 Executors.newSingleThreadPool(),newFixedThreadPool(),newcachedTheadPool(),newScheduledThreadPool()赘理。

友情鏈接:線(xiàn)程池原理

友情鏈接:線(xiàn)程池原理解析

類(lèi)加載器工作機(jī)制:

1.裝載:將Java二進(jìn)制代碼導(dǎo)入jvm中,生成Class文件扇单。

2.連接:a)校驗(yàn):檢查載入Class文件數(shù)據(jù)的正確性 b)準(zhǔn)備:給類(lèi)的靜態(tài)變量分配存儲(chǔ)空間 c)解析:將符號(hào)引用轉(zhuǎn)成直接引用

3:初始化:對(duì)類(lèi)的靜態(tài)變量商模,靜態(tài)方法和靜態(tài)代碼塊執(zhí)行初始化工作。

雙親委派模型:類(lèi)加載器收到類(lèi)加載請(qǐng)求蜘澜,首先將請(qǐng)求委派給父類(lèi)加載器完成 用戶(hù)自定義加載器->應(yīng)用程序加載器->擴(kuò)展類(lèi)加載器->啟動(dòng)類(lèi)加載器施流。

友情鏈接:深入理解Java虛擬機(jī)筆記—雙親委派模型?

友情鏈接:JVM類(lèi)加載的那些事

友情鏈接:JVM(1):Java 類(lèi)的加載機(jī)制

一致性哈希:

Memcahed緩存:

數(shù)據(jù)結(jié)構(gòu):key,value對(duì)

使用方法:get,put等方法

友情鏈接:hashcode(),equal()方法深入解析

Redis數(shù)據(jù)結(jié)構(gòu): String—字符串(key-value 類(lèi)型)

Hash—字典(hashmap) Redis的哈希結(jié)構(gòu)可以使你像在數(shù)據(jù)庫(kù)中更新一個(gè)屬性一樣只修改某一項(xiàng)屬性值

List—列表 實(shí)現(xiàn)消息隊(duì)列

Set—集合 利用唯一性

Sorted Set—有序集合 可以進(jìn)行排序 可以實(shí)現(xiàn)數(shù)據(jù)持久化

友情鏈接:?Spring + Redis 實(shí)現(xiàn)數(shù)據(jù)的緩存

java自動(dòng)裝箱拆箱深入剖析

談?wù)凧ava反射機(jī)制

如何寫(xiě)一個(gè)不可變類(lèi)?

索引:B+鄙信,B-,全文索引

Mysql的索引是一個(gè)數(shù)據(jù)結(jié)構(gòu)瞪醋,旨在使數(shù)據(jù)庫(kù)高效的查找數(shù)據(jù)。

常用的數(shù)據(jù)結(jié)構(gòu)是B+Tree装诡,每個(gè)葉子節(jié)點(diǎn)不但存放了索引鍵的相關(guān)信息還增加了指向相鄰葉子節(jié)點(diǎn)的指針银受,這樣就形成了帶有順序訪(fǎng)問(wèn)指針的B+Tree,做這個(gè)優(yōu)化的目的是提高不同區(qū)間訪(fǎng)問(wèn)的性能鸦采。

什么時(shí)候使用索引:

經(jīng)常出現(xiàn)在group by,order by和distinc關(guān)鍵字后面的字段

經(jīng)常與其他表進(jìn)行連接的表宾巍,在連接字段上應(yīng)該建立索引

經(jīng)常出現(xiàn)在Where子句中的字段

經(jīng)常出現(xiàn)用作查詢(xún)選擇的字段

友情鏈接:MySQL:InnoDB存儲(chǔ)引擎的B+樹(shù)索引算法

友情鏈接:MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理

Spring IOC (控制反轉(zhuǎn),依賴(lài)注入)

Spring支持三種依賴(lài)注入方式渔伯,分別是屬性(Setter方法)注入顶霞,構(gòu)造注入和接口注入。

在Spring中锣吼,那些組成應(yīng)用的主體及由Spring IOC容器所管理的對(duì)象被稱(chēng)之為Bean选浑。

Spring的IOC容器通過(guò)反射的機(jī)制實(shí)例化Bean并建立Bean之間的依賴(lài)關(guān)系。

簡(jiǎn)單地講吐限,Bean就是由Spring IOC容器初始化鲜侥、裝配及被管理的對(duì)象。

獲取Bean對(duì)象的過(guò)程诸典,首先通過(guò)Resource加載配置文件并啟動(dòng)IOC容器描函,然后通過(guò)getBean方法獲取bean對(duì)象崎苗,就可以調(diào)用他的方法。

Spring Bean的作用域:

Singleton:Spring IOC容器中只有一個(gè)共享的Bean實(shí)例舀寓,一般都是Singleton作用域胆数。

Prototype:每一個(gè)請(qǐng)求,會(huì)產(chǎn)生一個(gè)新的Bean實(shí)例互墓。

Request:每一次http請(qǐng)求會(huì)產(chǎn)生一個(gè)新的Bean實(shí)例必尼。

友情鏈接:?Spring框架IOC容器和AOP解析

友情鏈接:淺談Spring框架注解的用法分析

友情鏈接:關(guān)于Spring的69個(gè)面試問(wèn)答——終極列表

代理的共有優(yōu)點(diǎn):業(yè)務(wù)類(lèi)只需要關(guān)注業(yè)務(wù)邏輯本身,保證了業(yè)務(wù)類(lèi)的重用性篡撵。

Java靜態(tài)代理:

代理對(duì)象和目標(biāo)對(duì)象實(shí)現(xiàn)了相同的接口判莉,目標(biāo)對(duì)象作為代理對(duì)象的一個(gè)屬性,具體接口實(shí)現(xiàn)中育谬,代理對(duì)象可以在調(diào)用目標(biāo)對(duì)象相應(yīng)方法前后加上其他業(yè)務(wù)處理邏輯券盅。

缺點(diǎn):一個(gè)代理類(lèi)只能代理一個(gè)業(yè)務(wù)類(lèi)。如果業(yè)務(wù)類(lèi)增加方法時(shí)膛檀,相應(yīng)的代理類(lèi)也要增加方法锰镀。

Java動(dòng)態(tài)代理:

Java動(dòng)態(tài)代理是寫(xiě)一個(gè)類(lèi)實(shí)現(xiàn)InvocationHandler接口,重寫(xiě)Invoke方法咖刃,在Invoke方法可以進(jìn)行增強(qiáng)處理的邏輯的編寫(xiě)泳炉,這個(gè)公共代理類(lèi)在運(yùn)行的時(shí)候才能明確自己要代理的對(duì)象,同時(shí)可以實(shí)現(xiàn)該被代理類(lèi)的方法的實(shí)現(xiàn)嚎杨,然后在實(shí)現(xiàn)類(lèi)方法的時(shí)候可以進(jìn)行增強(qiáng)處理花鹅。

實(shí)際上:代理對(duì)象的方法 = 增強(qiáng)處理 + 被代理對(duì)象的方法

JDK和CGLIB生成動(dòng)態(tài)代理類(lèi)的區(qū)別:

JDK動(dòng)態(tài)代理只能針對(duì)實(shí)現(xiàn)了接口的類(lèi)生成代理(實(shí)例化一個(gè)類(lèi))。此時(shí)代理對(duì)象和目標(biāo)對(duì)象實(shí)現(xiàn)了相同的接口磕潮,目標(biāo)對(duì)象作為代理對(duì)象的一個(gè)屬性翠胰,具體接口實(shí)現(xiàn)中,可以在調(diào)用目標(biāo)對(duì)象相應(yīng)方法前后加上其他業(yè)務(wù)處理邏輯

CGLIB是針對(duì)類(lèi)實(shí)現(xiàn)代理自脯,主要是對(duì)指定的類(lèi)生成一個(gè)子類(lèi)(沒(méi)有實(shí)例化一個(gè)類(lèi)),覆蓋其中的方法 斤富。

Spring AOP應(yīng)用場(chǎng)景

性能檢測(cè)膏潮,訪(fǎng)問(wèn)控制,日志管理满力,事務(wù)等焕参。

默認(rèn)的策略是如果目標(biāo)類(lèi)實(shí)現(xiàn)接口,則使用JDK動(dòng)態(tài)代理技術(shù)油额,如果目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)接口叠纷,則默認(rèn)會(huì)采用CGLIB代理

SpringMVC運(yùn)行原理

客戶(hù)端請(qǐng)求提交到DispatcherServlet

由DispatcherServlet控制器查詢(xún)HandlerMapping,找到并分發(fā)到指定的Controller中潦嘶。

Controller調(diào)用業(yè)務(wù)邏輯處理后涩嚣,返回ModelAndView

DispatcherServlet查詢(xún)一個(gè)或多個(gè)ViewResoler視圖解析器,找到ModelAndView指定的視圖

視圖負(fù)責(zé)將結(jié)果顯示到客戶(hù)端

友情鏈接:Spring:基于注解的Spring MVC(上)

友情鏈接:?Spring:基于注解的Spring MVC(下)?

友情鏈接:SpringMVC與Struts2區(qū)別與比較總結(jié)

友情鏈接:SpringMVC與Struts2的對(duì)比

一個(gè)Http請(qǐng)求

DNS域名解析 –> 發(fā)起TCP的三次握手 –> 建立TCP連接后發(fā)起http請(qǐng)求 –> 服務(wù)器響應(yīng)http請(qǐng)求,瀏覽器得到html代碼 –> 瀏覽器解析html代碼航厚,并請(qǐng)求html代碼中的資源(如javascript顷歌、css、圖片等) –> 瀏覽器對(duì)頁(yè)面進(jìn)行渲染呈現(xiàn)給用戶(hù)

設(shè)計(jì)存儲(chǔ)海量數(shù)據(jù)的存儲(chǔ)系統(tǒng):設(shè)計(jì)一個(gè)叫“中間層”的一個(gè)邏輯層幔睬,在這個(gè)層眯漩,將數(shù)據(jù)庫(kù)的海量數(shù)據(jù)抓出來(lái),做成緩存麻顶,運(yùn)行在服務(wù)器的內(nèi)存中赦抖,同理,當(dāng)有新的數(shù)據(jù)到來(lái)辅肾,也先做成緩存队萤,再想辦法,持久化到數(shù)據(jù)庫(kù)中宛瞄,這是一個(gè)簡(jiǎn)單的思路浮禾。主要的步驟是負(fù)載均衡,將不同用戶(hù)的請(qǐng)求分發(fā)到不同的處理節(jié)點(diǎn)上份汗,然后先存入緩存盈电,定時(shí)向主數(shù)據(jù)庫(kù)更新數(shù)據(jù)。讀寫(xiě)的過(guò)程采用類(lèi)似樂(lè)觀(guān)鎖的機(jī)制杯活,可以一直讀(在寫(xiě)數(shù)據(jù)的時(shí)候也可以)匆帚,但是每次讀的時(shí)候會(huì)有個(gè)版本的標(biāo)記,如果本次讀的版本低于緩存的版本旁钧,會(huì)重新讀數(shù)據(jù)吸重,這樣的情況并不多,可以忍受歪今。

友情鏈接:?HTTP與HTTPS的區(qū)別

友情鏈接:?HTTPS 為什么更安全嚎幸,先看這些?

友情鏈接:?HTTP請(qǐng)求報(bào)文和HTTP響應(yīng)報(bào)文

友情鏈接:?HTTP 請(qǐng)求方式: GET和POST的比較

Session與Cookie:Cookie可以讓服務(wù)端跟蹤每個(gè)客戶(hù)端的訪(fǎng)問(wèn),但是每次客戶(hù)端的訪(fǎng)問(wèn)都必須傳回這些Cookie寄猩,如果Cookie很多嫉晶,則無(wú)形的增加了客戶(hù)端與服務(wù)端的數(shù)據(jù)傳輸量皂岔,

而Session則很好地解決了這個(gè)問(wèn)題兜蠕,同一個(gè)客戶(hù)端每次和服務(wù)端交互時(shí)海雪,將數(shù)據(jù)存儲(chǔ)通過(guò)Session到服務(wù)端颅崩,不需要每次都傳回所有的Cookie值胶滋,而是傳回一個(gè)ID汤功,每個(gè)客戶(hù)端第一次訪(fǎng)問(wèn)服務(wù)器生成的唯一的ID艺晴,客戶(hù)端只要傳回這個(gè)ID就行了庶艾,這個(gè)ID通常為NAME為JSESSIONID的一個(gè)Cookie兽赁。這樣服務(wù)端就可以通過(guò)這個(gè)ID状答,來(lái)將存儲(chǔ)到服務(wù)端的KV值取出了冷守。

Session和Cookie的超時(shí)問(wèn)題,Cookie的安全問(wèn)題

分布式Session框架

配置服務(wù)器剪况,Zookeeper集群管理服務(wù)器可以統(tǒng)一管理所有服務(wù)器的配置文件

共享這些Session存儲(chǔ)在一個(gè)分布式緩存中教沾,可以隨時(shí)寫(xiě)入和讀取,而且性能要很好译断,如Memcache授翻,Tair。

封裝一個(gè)類(lèi)繼承自HttpSession孙咪,將Session存入到這個(gè)類(lèi)中然后再存入分布式緩存中

由于Cookie不能跨域訪(fǎng)問(wèn)堪唐,要實(shí)現(xiàn)Session同步,要同步SessionID寫(xiě)到不同域名下翎蹈。

適配器模式:將一個(gè)接口適配到另一個(gè)接口淮菠,Java I/O中InputStreamReader將Reader類(lèi)適配到InputStream,從而實(shí)現(xiàn)了字節(jié)流到字符流的準(zhǔn)換荤堪。

裝飾者模式:保持原來(lái)的接口合陵,增強(qiáng)原來(lái)有的功能。

FileInputStream 實(shí)現(xiàn)了InputStream的所有接口澄阳,BufferedInputStreams繼承自FileInputStream是具體的裝飾器實(shí)現(xiàn)者拥知,將InputStream讀取的內(nèi)容保存在內(nèi)存中,而提高讀取的性能碎赢。

Spring事務(wù)配置方法:

1.切點(diǎn)信息低剔,用于定位實(shí)施事物切面的業(yè)務(wù)類(lèi)方法

2.控制事務(wù)行為的事務(wù)屬性,這些屬性包括事物隔離級(jí)別肮塞,事務(wù)傳播行為襟齿,超時(shí)時(shí)間,回滾規(guī)則枕赵。

Spring通過(guò)aop/tx Schema 命名空間和@Transaction注解技術(shù)來(lái)進(jìn)行聲明式事物配置猜欺。

Mybatis

每一個(gè)Mybatis的應(yīng)用程序都以一個(gè)SqlSessionFactory對(duì)象的實(shí)例為核心。首先用字節(jié)流通過(guò)Resource將配置文件讀入拷窜,然后通過(guò)SqlSessionFactoryBuilder().build方法創(chuàng)建SqlSessionFactory替梨,然后再通過(guò)SqlSessionFactory.openSession()方法創(chuàng)建一個(gè)SqlSession為每一個(gè)數(shù)據(jù)庫(kù)事務(wù)服務(wù)。

經(jīng)歷了Mybatis初始化 –>創(chuàng)建SqlSession –>運(yùn)行SQL語(yǔ)句装黑,返回結(jié)果三個(gè)過(guò)程

Servlet和Filter的區(qū)別:

整的流程是:Filter對(duì)用戶(hù)請(qǐng)求進(jìn)行預(yù)處理,接著將請(qǐng)求交給Servlet進(jìn)行處理并生成響應(yīng)弓熏,最后Filter再對(duì)服務(wù)器響應(yīng)進(jìn)行后處理恋谭。

Filter有如下幾個(gè)用處:

Filter可以進(jìn)行對(duì)特定的url請(qǐng)求和相應(yīng)做預(yù)處理和后處理。

在HttpServletRequest到達(dá)Servlet之前挽鞠,攔截客戶(hù)的HttpServletRequest疚颊。

根據(jù)需要檢查HttpServletRequest狈孔,也可以修改HttpServletRequest頭和數(shù)據(jù)。

在HttpServletResponse到達(dá)客戶(hù)端之前材义,攔截HttpServletResponse均抽。

根據(jù)需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數(shù)據(jù)其掂。

實(shí)際上Filter和Servlet極其相似油挥,區(qū)別只是Filter不能直接對(duì)用戶(hù)生成響應(yīng)。實(shí)際上Filter里doFilter()方法里的代碼就是從多個(gè)Servlet的service()方法里抽取的通用代碼款熬,通過(guò)使用Filter可以實(shí)現(xiàn)更好的復(fù)用深寥。

Filter和Servlet的生命周期:

1.Filter在web服務(wù)器啟動(dòng)時(shí)初始化

2.如果某個(gè)Servlet配置了 1 ,該Servlet也是在Tomcat(Servlet容器)啟動(dòng)時(shí)初始化贤牛。

3.如果Servlet沒(méi)有配置1 惋鹅,該Servlet不會(huì)在Tomcat啟動(dòng)時(shí)初始化,而是在請(qǐng)求到來(lái)時(shí)初始化殉簸。

4.每次請(qǐng)求闰集, Request都會(huì)被初始化,響應(yīng)請(qǐng)求后般卑,請(qǐng)求被銷(xiāo)毀武鲁。

5.Servlet初始化后,將不會(huì)隨著請(qǐng)求的結(jié)束而注銷(xiāo)椭微。

6.關(guān)閉Tomcat時(shí)洞坑,Servlet、Filter依次被注銷(xiāo)蝇率。

HashMap與HashTable的區(qū)別迟杂。

1、HashMap是非線(xiàn)程安全的本慕,HashTable是線(xiàn)程安全的排拷。

2、HashMap的鍵和值都允許有null值存在锅尘,而HashTable則不行监氢。

3、因?yàn)榫€(xiàn)程安全的問(wèn)題藤违,HashMap效率比HashTable的要高浪腐。

HashMap的實(shí)現(xiàn)機(jī)制:

維護(hù)一個(gè)每個(gè)元素是一個(gè)鏈表的數(shù)組,而且鏈表中的每個(gè)節(jié)點(diǎn)是一個(gè)Entry[]鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)顿乒。

實(shí)現(xiàn)了數(shù)組+鏈表的特性议街,查找快,插入刪除也快璧榄。

對(duì)于每個(gè)key,他對(duì)應(yīng)的數(shù)組索引下標(biāo)是 int i = hash(key.hashcode)&(len-1);

每個(gè)新加入的節(jié)點(diǎn)放在鏈表首特漩,然后該新加入的節(jié)點(diǎn)指向原鏈表首

HashMap和TreeMap區(qū)別

友情鏈接:?Java中HashMap和TreeMap的區(qū)別深入理解

HashMap沖突

友情鏈接:?HashMap沖突的解決方法以及原理分析

友情鏈接:?HashMap的工作原理

友情鏈接:?HashMap和Hashtable的區(qū)別

友情鏈接:?2種辦法讓HashMap線(xiàn)程安全

HashMap吧雹,ConcurrentHashMap與LinkedHashMap的區(qū)別

ConcurrentHashMap是使用了鎖分段技術(shù)技術(shù)來(lái)保證線(xiàn)程安全的,鎖分段技術(shù):首先將數(shù)據(jù)分成一段一段的存儲(chǔ)涂身,然后給每一段數(shù)據(jù)配一把鎖雄卷,當(dāng)一個(gè)線(xiàn)程占用鎖訪(fǎng)問(wèn)其中一個(gè)段數(shù)據(jù)的時(shí)候,其他段的數(shù)據(jù)也能被其他線(xiàn)程訪(fǎng)問(wèn)

ConcurrentHashMap 是在每個(gè)段(segment)中線(xiàn)程安全的

LinkedHashMap維護(hù)一個(gè)雙鏈表蛤售,可以將里面的數(shù)據(jù)按寫(xiě)入的順序讀出

ConcurrentHashMap應(yīng)用場(chǎng)景

1:ConcurrentHashMap的應(yīng)用場(chǎng)景是高并發(fā)丁鹉,但是并不能保證線(xiàn)程安全,而同步的HashMap和HashMap的是鎖住整個(gè)容器悍抑,而加鎖之后ConcurrentHashMap不需要鎖住整個(gè)容器鳄炉,只需要鎖住對(duì)應(yīng)的Segment就好了,所以可以保證高并發(fā)同步訪(fǎng)問(wèn)搜骡,提升了效率拂盯。

2:可以多線(xiàn)程寫(xiě)。

ConcurrentHashMap把HashMap分成若干個(gè)Segmenet

1.get時(shí)记靡,不加鎖谈竿,先定位到segment然后在找到頭結(jié)點(diǎn)進(jìn)行讀取操作。而value是volatile變量摸吠,所以可以保證在競(jìng)爭(zhēng)條件時(shí)保證讀取最新的值空凸,如果讀到的value是null,則可能正在修改寸痢,那么就調(diào)用ReadValueUnderLock函數(shù)呀洲,加鎖保證讀到的數(shù)據(jù)是正確的。

2.Put時(shí)會(huì)加鎖啼止,一律添加到hash鏈的頭部道逗。

3.Remove時(shí)也會(huì)加鎖,由于next是final類(lèi)型不可改變献烦,所以必須把刪除的節(jié)點(diǎn)之前的節(jié)點(diǎn)都復(fù)制一遍滓窍。

4.ConcurrentHashMap允許多個(gè)修改操作并發(fā)進(jìn)行,其關(guān)鍵在于使用了鎖分離技術(shù)巩那。它使用了多個(gè)鎖來(lái)控制對(duì)Hash表的不同Segment進(jìn)行的修改吏夯。

ConcurrentHashMap的應(yīng)用場(chǎng)景是高并發(fā),但是并不能保證線(xiàn)程安全即横,而同步的HashMap和HashTable的是鎖住整個(gè)容器噪生,而加鎖之后ConcurrentHashMap不需要鎖住整個(gè)容器,只需要鎖住對(duì)應(yīng)的segment就好了东囚,所以可以保證高并發(fā)同步訪(fǎng)問(wèn)杠园,提升了效率。

ConcurrentHashMap能夠保證每一次調(diào)用都是原子操作,但是并不保證多次調(diào)用之間也是原子操作抛蚁。

友情鏈接:Java集合—ConcurrentHashMap原理分析

Vector和ArrayList的區(qū)別

友情鏈接:Java中Vector和ArrayList的區(qū)別

ExecutorService service = Executors…. ExecutorService service = new ThreadPoolExecutor() ExecutorService service = new ScheduledThreadPoolExecutor();

ThreadPoolExecutor源碼分析

線(xiàn)程池本身的狀態(tài):

等待任務(wù)隊(duì)列和工作集:

線(xiàn)程池的主要狀態(tài)鎖:

線(xiàn)程池的存活時(shí)間和大小:

1.2 ThreadPoolExecutor 的內(nèi)部工作原理

有了以上定義好的數(shù)據(jù)惕橙,下面來(lái)看看內(nèi)部是如何實(shí)現(xiàn)的 瞧甩。 Doug Lea 的整個(gè)思路總結(jié)起來(lái)就是 5 句話(huà):

如果當(dāng)前池大小 poolSize 小于 corePoolSize ,則創(chuàng)建新線(xiàn)程執(zhí)行任務(wù)弥鹦。

如果當(dāng)前池大小 poolSize 大于 corePoolSize 肚逸,且等待隊(duì)列未滿(mǎn),則進(jìn)入等待隊(duì)列

如果當(dāng)前池大小 poolSize 大于 corePoolSize 且小于 maximumPoolSize 彬坏,且等待隊(duì)列已滿(mǎn)朦促,則創(chuàng)建新線(xiàn)程執(zhí)行任務(wù)。

如果當(dāng)前池大小 poolSize 大于 corePoolSize 且大于 maximumPoolSize 栓始,且等待隊(duì)列已滿(mǎn)务冕,則調(diào)用拒絕策略來(lái)處理該任務(wù)。

線(xiàn)程池里的每個(gè)線(xiàn)程執(zhí)行完任務(wù)后不會(huì)立刻退出幻赚,而是會(huì)去檢查下等待隊(duì)列里是否還有線(xiàn)程任務(wù)需要執(zhí)行禀忆,如果在 keepAliveTime 里等不到新的任務(wù)了,那么線(xiàn)程就會(huì)退出落恼。

Executor包結(jié)構(gòu)

CopyOnWriteArrayList : 寫(xiě)時(shí)加鎖箩退,當(dāng)添加一個(gè)元素的時(shí)候,將原來(lái)的容器進(jìn)行copy佳谦,復(fù)制出一個(gè)新的容器戴涝,然后在新的容器里面寫(xiě),寫(xiě)完之后再將原容器的引用指向新的容器钻蔑,而讀的時(shí)候是讀舊容器的數(shù)據(jù)啥刻,所以可以進(jìn)行并發(fā)的讀,但這是一種弱一致性的策略矢棚。

使用場(chǎng)景:CopyOnWriteArrayList適合使用在讀操作遠(yuǎn)遠(yuǎn)大于寫(xiě)操作的場(chǎng)景里郑什,比如緩存。

Linux常用命令:cd蒲肋,cp蘑拯,mv,rm兜粘,ps(進(jìn)程)申窘,tar,cat(查看內(nèi)容)孔轴,chmod剃法,vim,find路鹰,ls

死鎖的必要條件

互斥 至少有一個(gè)資源處于非共享狀態(tài)

占有并等待

非搶占

循環(huán)等待

解決死鎖贷洲,第一個(gè)是死鎖預(yù)防收厨,就是不讓上面的四個(gè)條件同時(shí)成立。二是优构,合理分配資源诵叁。

三是使用銀行家算法,如果該進(jìn)程請(qǐng)求的資源操作系統(tǒng)剩余量可以滿(mǎn)足钦椭,那么就分配拧额。

進(jìn)程間的通信方式

管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動(dòng)彪腔,而且只能在具有親緣關(guān)系的進(jìn)程間使用侥锦。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。

有名管道 (named pipe) : 有名管道也是半雙工的通信方式德挣,但是它允許無(wú)親緣關(guān)系進(jìn)程間的通信恭垦。

信號(hào)量( semophore ) : 信號(hào)量是一個(gè)計(jì)數(shù)器,可以用來(lái)控制多個(gè)進(jìn)程對(duì)共享資源的訪(fǎng)問(wèn)盲厌。它常作為一種鎖機(jī)制署照,防止某進(jìn)程正在訪(fǎng)問(wèn)共享資源時(shí),其他進(jìn)程也訪(fǎng)問(wèn)該資源吗浩。因此建芙,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線(xiàn)程之間的同步手段。

消息隊(duì)列( message queue ) : 消息隊(duì)列是由消息的鏈表懂扼,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)禁荸。消息隊(duì)列克服了信號(hào)傳遞信息少、管道只能承載無(wú)格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)阀湿。

信號(hào) ( sinal ) : 信號(hào)是一種比較復(fù)雜的通信方式赶熟,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生。

共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪(fǎng)問(wèn)的內(nèi)存陷嘴,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建映砖,但多個(gè)進(jìn)程都可以訪(fǎng)問(wèn)。共享內(nèi)存是最快的 IPC 方式灾挨,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專(zhuān)門(mén)設(shè)計(jì)的邑退。它往往與其他通信機(jī)制,如信號(hào)量劳澄,配合使用地技,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。

套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制秒拔,與其他通信機(jī)制不同的是莫矗,它可用于不同機(jī)器間的進(jìn)程通信。

進(jìn)程與線(xiàn)程的區(qū)別和聯(lián)系

操作系統(tǒng)的進(jìn)程調(diào)度算法

計(jì)算機(jī)系統(tǒng)的層次存儲(chǔ)結(jié)構(gòu)詳解

數(shù)據(jù)庫(kù)事務(wù)是指作為單個(gè)邏輯工作單元執(zhí)行的一系列操作。

友情鏈接:數(shù)據(jù)庫(kù)事務(wù)的四大特性以及事務(wù)的隔離級(jí)別

MySQL數(shù)據(jù)庫(kù)優(yōu)化總結(jié)

MYSQL 優(yōu)化常用方法

MySQL存儲(chǔ)引擎--MyISAM與InnoDB區(qū)別

關(guān)于SQL數(shù)據(jù)庫(kù)中的范式

Hibernate的一級(jí)緩存是由Session提供的作谚,因此它只存在于Session的生命周期中三娩,當(dāng)程序調(diào)用save(),update(),saveOrUpdate()等方法 及調(diào)用查詢(xún)接口list,filter,iterate時(shí),如Session緩存中還不存在相應(yīng)的對(duì)象食磕,Hibernate會(huì)把該對(duì)象加入到一級(jí)緩存中尽棕,當(dāng)Session關(guān)閉的時(shí)候緩存也會(huì)消失。

Hibernate的一級(jí)緩存是Session所內(nèi)置的彬伦,不能被卸載,也不能進(jìn)行任何配置一級(jí)緩存采用的是key-value的Map方式來(lái)實(shí)現(xiàn)的伊诵,在緩存實(shí)體對(duì)象時(shí)单绑,對(duì)象的主關(guān)鍵字ID是Map的key,實(shí)體對(duì)象就是對(duì)應(yīng)的值曹宴。

Hibernate二級(jí)緩存:把獲得的所有數(shù)據(jù)對(duì)象根據(jù)ID放入到第二級(jí)緩存中搂橙。Hibernate二級(jí)緩存策略,是針對(duì)于ID查詢(xún)的緩存策略笛坦,刪除区转、更新、增加數(shù)據(jù)的時(shí)候版扩,同時(shí)更新緩存废离。

進(jìn)程和線(xiàn)程的區(qū)別:

進(jìn)程:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(進(jìn)程上下文),進(jìn)程間的切換會(huì)有較大的開(kāi)銷(xiāo)礁芦,一個(gè)進(jìn)程包含1–n個(gè)線(xiàn)程蜻韭。

線(xiàn)程:同一類(lèi)線(xiàn)程共享代碼和數(shù)據(jù)空間,每個(gè)線(xiàn)程有獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC)柿扣,線(xiàn)程切換開(kāi)銷(xiāo)小肖方。

線(xiàn)程和進(jìn)程一樣分為五個(gè)階段:創(chuàng)建、就緒未状、運(yùn)行俯画、阻塞、終止司草。

多進(jìn)程是指操作系統(tǒng)能同時(shí)運(yùn)行多個(gè)任務(wù)(程序)艰垂。

多線(xiàn)程是指在同一程序中有多個(gè)順序流在執(zhí)行。

在java中要想實(shí)現(xiàn)多線(xiàn)程翻伺,有三種手段材泄,一種是繼續(xù)Thread類(lèi),另外一種是實(shí)現(xiàn)Runable接口吨岭,還有就是實(shí)現(xiàn)Callable接口拉宗。

Switch能否用string做參數(shù)?

a.在 Java 7 之前, switch 只能支持byte,short,char,int 或者其對(duì)應(yīng)的封裝類(lèi)以及 Enum 類(lèi)型。在Java 7中,String 支持被加上了旦事。

Object有哪些公用方法魁巩?

a.方法equals測(cè)試的是兩個(gè)對(duì)象是否相等

b.方法clone進(jìn)行對(duì)象拷貝

c.方法getClass返回和當(dāng)前對(duì)象相關(guān)的Class對(duì)象

d.方法notify,notifyall,wait都是用來(lái)對(duì)給定對(duì)象進(jìn)行線(xiàn)程同步的

Java的四種引用,強(qiáng)弱軟虛姐浮,以及用到的場(chǎng)景

a.利用軟引用和弱引用解決OOM問(wèn)題:用一個(gè)HashMap來(lái)保存圖片的路徑和相應(yīng)圖片對(duì)象關(guān)聯(lián)的軟引用之間的映射關(guān)系谷遂,在內(nèi)存不足時(shí),JVM會(huì)自動(dòng)回收這些緩存圖片對(duì)象所占用的空間卖鲤,從而有效地避免了OOM的問(wèn)題肾扰。

b.通過(guò)軟可及對(duì)象重獲方法實(shí)現(xiàn)Java對(duì)象的高速緩存:比如我們創(chuàng)建了一Employee的類(lèi),如果每次需要查詢(xún)一個(gè)雇員的信息蛋逾。哪怕是幾秒中之前剛剛查詢(xún)過(guò)的集晚,都要重新構(gòu)建一個(gè)實(shí)例,這是需要消耗很多時(shí)間的区匣。我們可以通過(guò)軟引用和 HashMap 的結(jié)合偷拔,先是保存引用方面:以軟引用的方式對(duì)一個(gè)Employee對(duì)象的實(shí)例進(jìn)行引用并保存該引用到HashMap 上熔号,key 為此雇員的 id芍秆,value為這個(gè)對(duì)象的軟引用,另一方面是取出引用观堂,緩存中是否有該Employee實(shí)例的軟引用姑丑,如果有蛤签,從軟引用中取得。如果沒(méi)有軟引用彻坛,或者從軟引用中得到的實(shí)例是null顷啼,重新構(gòu)建一個(gè)實(shí)例,并保存對(duì)這個(gè)新建實(shí)例的軟引用昌屉。

c.強(qiáng)引用:如果一個(gè)對(duì)象具有強(qiáng)引用钙蒙,它就不會(huì)被垃圾回收器回收。即使當(dāng)前內(nèi)存空間不足间驮,JVM也不會(huì)回收它躬厌,而是拋出 OutOfMemoryError 錯(cuò)誤,使程序異常終止竞帽。如果想中斷強(qiáng)引用和某個(gè)對(duì)象之間的關(guān)聯(lián)扛施,可以顯式地將引用賦值為null,這樣一來(lái)的話(huà)屹篓,JVM在合適的時(shí)間就會(huì)回收該對(duì)象疙渣。

d.軟引用:在使用軟引用時(shí),如果內(nèi)存的空間足夠堆巧,軟引用就能繼續(xù)被使用妄荔,而不會(huì)被垃圾回收器回收泼菌,只有在內(nèi)存不足時(shí),軟引用才會(huì)被垃圾回收器回收啦租。

e.弱引用:具有弱引用的對(duì)象擁有的生命周期更短暫哗伯。因?yàn)楫?dāng) JVM 進(jìn)行垃圾回收,一旦發(fā)現(xiàn)弱引用對(duì)象篷角,無(wú)論當(dāng)前內(nèi)存空間是否充足焊刹,都會(huì)將弱引用回收。不過(guò)由于垃圾回收器是一個(gè)優(yōu)先級(jí)較低的線(xiàn)程恳蹲,所以并不一定能迅速發(fā)現(xiàn)弱引用對(duì)象虐块。

f.虛引用:顧名思義,就是形同虛設(shè)嘉蕾,如果一個(gè)對(duì)象僅持有虛引用非凌,那么它相當(dāng)于沒(méi)有引用,在任何時(shí)候都可能被垃圾回收器回收荆针。

Hashcode的作用,與 equal 有什么區(qū)別颁糟?

a.同樣用于鑒定2個(gè)對(duì)象是否相等的航背,java集合中有 list 和 set 兩類(lèi),其中 set不允許元素重復(fù)實(shí)現(xiàn)棱貌,那個(gè)這個(gè)不允許重復(fù)實(shí)現(xiàn)的方法玖媚,如果用 equal 去比較的話(huà),如果存在1000個(gè)元素婚脱,你 new 一個(gè)新的元素出來(lái)今魔,需要去調(diào)用1000次 equal 去逐個(gè)和他們比較是否是同一個(gè)對(duì)象,這樣會(huì)大大降低效率障贸。hashcode實(shí)際上是返回對(duì)象的存儲(chǔ)地址错森,如果這個(gè)位置上沒(méi)有元素,就把元素直接存儲(chǔ)在上面篮洁,如果這個(gè)位置上已經(jīng)存在元素涩维,這個(gè)時(shí)候才去調(diào)用equal方法與新元素進(jìn)行比較,相同的話(huà)就不存了袁波,散列到其他地址上瓦阐。

Override和Overload的含義以及區(qū)別

a.Overload顧名思義是重新加載,它可以表現(xiàn)類(lèi)的多態(tài)性篷牌,可以是函數(shù)里面可以有相同的函數(shù)名但是參數(shù)名睡蟋、返回值、類(lèi)型不能相同枷颊;或者說(shuō)可以改變參數(shù)戳杀、類(lèi)型该面、返回值但是函數(shù)名字依然不變。

b.就是ride(重寫(xiě))的意思豺瘤,在子類(lèi)繼承父類(lèi)的時(shí)候子類(lèi)中可以定義某方法與其父類(lèi)有相同的名稱(chēng)和參數(shù)吆倦,當(dāng)子類(lèi)在調(diào)用這一函數(shù)時(shí)自動(dòng)調(diào)用子類(lèi)的方法,而父類(lèi)相當(dāng)于被覆蓋(重寫(xiě))了坐求。

具體可前往C++中重載蚕泽、重寫(xiě)(覆蓋)的區(qū)別實(shí)例分析查看

抽象類(lèi)和接口的區(qū)別

a.一個(gè)類(lèi)只能繼承單個(gè)類(lèi),但是可以實(shí)現(xiàn)多個(gè)接口

b.抽象類(lèi)中可以有構(gòu)造方法桥嗤,接口中不能有構(gòu)造方法

c.抽象類(lèi)中的所有方法并不一定要是抽象的须妻,你可以選擇在抽象類(lèi)中實(shí)現(xiàn)一些基本的方法。而接口要求所有的方法都必須是抽象的

d.抽象類(lèi)中可以包含靜態(tài)方法泛领,接口中不可以

e.抽象類(lèi)中可以有普通成員變量荒吏,接口中不可以

解析XML的幾種方式的原理與特點(diǎn):DOM、SAX渊鞋、PULL

a.DOM:消耗內(nèi)存:先把xml文檔都讀到內(nèi)存中绰更,然后再用DOM API來(lái)訪(fǎng)問(wèn)樹(shù)形結(jié)構(gòu),并獲取數(shù)據(jù)锡宋。這個(gè)寫(xiě)起來(lái)很簡(jiǎn)單儡湾,但是很消耗內(nèi)存。要是數(shù)據(jù)過(guò)大执俩,手機(jī)不夠牛逼徐钠,可能手機(jī)直接死機(jī)

b.SAX:解析效率高,占用內(nèi)存少役首,基于事件驅(qū)動(dòng)的:更加簡(jiǎn)單地說(shuō)就是對(duì)文檔進(jìn)行順序掃描尝丐,當(dāng)掃描到文檔(document)開(kāi)始與結(jié)束、元素(element)開(kāi)始與結(jié)束衡奥、文檔(document)結(jié)束等地方時(shí)通知事件處理函數(shù)爹袁,由事件處理函數(shù)做相應(yīng)動(dòng)作,然后繼續(xù)同樣的掃描杰赛,直至文檔結(jié)束呢簸。

c.PULL:與 SAX 類(lèi)似,也是基于事件驅(qū)動(dòng)乏屯,我們可以調(diào)用它的next()方法根时,來(lái)獲取下一個(gè)解析事件(就是開(kāi)始文檔,結(jié)束文檔辰晕,開(kāi)始標(biāo)簽蛤迎,結(jié)束標(biāo)簽),當(dāng)處于某個(gè)元素時(shí)可以調(diào)用XmlPullParser的getAttributte()方法來(lái)獲取屬性的值含友,也可調(diào)用它的nextText()獲取本節(jié)點(diǎn)的值替裆。

wait()和sleep()的區(qū)別

sleep來(lái)自Thread類(lèi)校辩,和wait來(lái)自O(shè)bject類(lèi)

調(diào)用sleep()方法的過(guò)程中,線(xiàn)程不會(huì)釋放對(duì)象鎖辆童。而 調(diào)用 wait 方法線(xiàn)程會(huì)釋放對(duì)象鎖

sleep睡眠后不出讓系統(tǒng)資源宜咒,wait讓出系統(tǒng)資源其他線(xiàn)程可以占用CPU

sleep(milliseconds)需要指定一個(gè)睡眠時(shí)間,時(shí)間一到會(huì)自動(dòng)喚醒

JAVA 中堆和棧的區(qū)別把鉴,說(shuō)下java 的內(nèi)存機(jī)制

a.基本數(shù)據(jù)類(lèi)型比變量和對(duì)象的引用都是在棧分配的

b.堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組

c.類(lèi)變量(static修飾的變量)故黑,程序在一加載的時(shí)候就在堆中為類(lèi)變量分配內(nèi)存,堆中的內(nèi)存地址存放在棧中

d.實(shí)例變量:當(dāng)你使用java關(guān)鍵字new的時(shí)候庭砍,系統(tǒng)在堆中開(kāi)辟并不一定是連續(xù)的空間分配給變量场晶,是根據(jù)零散的堆內(nèi)存地址,通過(guò)哈希算法換算為一長(zhǎng)串?dāng)?shù)字以表征這個(gè)變量在堆中的”物理位置”,實(shí)例變量的生命周期–當(dāng)實(shí)例變量的引用丟失后怠缸,將被GC(垃圾回收器)列入可回收“名單”中诗轻,但并不是馬上就釋放堆中內(nèi)存

e.局部變量: 由聲明在某方法,或某代碼段里(比如for循環(huán))揭北,執(zhí)行到它的時(shí)候在棧中開(kāi)辟內(nèi)存扳炬,當(dāng)局部變量一但脫離作用域,內(nèi)存立即釋放

JAVA多態(tài)的實(shí)現(xiàn)原理

a.抽象的來(lái)講搔体,多態(tài)的意思就是同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式鞠柄。(發(fā)送消息就是函數(shù)調(diào)用)

b.實(shí)現(xiàn)的原理是動(dòng)態(tài)綁定,程序調(diào)用的方法在運(yùn)行期才動(dòng)態(tài)綁定嫉柴,追溯源碼可以發(fā)現(xiàn),JVM 通過(guò)參數(shù)的自動(dòng)轉(zhuǎn)型來(lái)找到合適的辦法奉呛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末计螺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瞧壮,更是在濱河造成了極大的恐慌登馒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咆槽,死亡現(xiàn)場(chǎng)離奇詭異陈轿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)秦忿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)麦射,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人灯谣,你說(shuō)我怎么就攤上這事潜秋。” “怎么了胎许?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵峻呛,是天一觀(guān)的道長(zhǎng)罗售。 經(jīng)常有香客問(wèn)我,道長(zhǎng)钩述,這世上最難降的妖魔是什么寨躁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮牙勘,結(jié)果婚禮上职恳,老公的妹妹穿的比我還像新娘。我一直安慰自己谜悟,他們只是感情好话肖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著葡幸,像睡著了一般最筒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔚叨,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天床蜘,我揣著相機(jī)與錄音,去河邊找鬼蔑水。 笑死邢锯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搀别。 我是一名探鬼主播丹擎,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼歇父!你這毒婦竟也來(lái)了蒂培?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤榜苫,失蹤者是張志新(化名)和其女友劉穎护戳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體垂睬,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡媳荒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驹饺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钳枕。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赏壹,靈堂內(nèi)的尸體忽然破棺而出么伯,到底是詐尸還是另有隱情,我是刑警寧澤卡儒,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布田柔,位于F島的核電站俐巴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硬爆。R本人自食惡果不足惜欣舵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缀磕。 院中可真熱鬧缘圈,春花似錦、人聲如沸袜蚕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牲剃。三九已至遣疯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凿傅,已是汗流浹背缠犀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聪舒,地道東北人辨液。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像箱残,于是被迫代替她去往敵國(guó)和親滔迈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容