- N +

java基礎(chǔ)筆試題大全帶答案?java常見(jiàn)編程筆試題

剛?cè)腴Tjava,有什么網(wǎng)站可以有題讓我練習(xí)呢

本人計(jì)算機(jī)科學(xué)與技術(shù)專業(yè),從事java有4年了。分享下自己的學(xué)習(xí)網(wǎng)站吧。

1.??途W(wǎng)

主要服務(wù)于國(guó)內(nèi)廣大程序員。產(chǎn)品規(guī)模很大,包括了it題庫(kù)、在線編程練習(xí)、線上課程、社區(qū)、筆試服務(wù)、還有競(jìng)賽。用戶基本覆蓋全國(guó)高校百萬(wàn)的程序員學(xué)習(xí)者。在國(guó)內(nèi)互聯(lián)網(wǎng)公司有良好的口碑,為國(guó)內(nèi)眾多的互聯(lián)網(wǎng)公司提供了校園招聘,競(jìng)賽等服務(wù)。具備基本每個(gè)領(lǐng)域的筆試算法題,值得收藏。

2.利扣leetcode

這個(gè)網(wǎng)站有國(guó)際版和國(guó)內(nèi)版,平常我們進(jìn)國(guó)內(nèi)版的就行了啊,當(dāng)然英文好的也可以使用國(guó)際版,這里非常建議大家使用國(guó)際版,交流的技術(shù)存在差異,但是題目基本一致,不需要擔(dān)心。

地址:leetcode-cn.com

利扣被國(guó)內(nèi)外程序員稱為刷題神器。甚至有人說(shuō),你如果掌握了百分之80左右,各互聯(lián)網(wǎng)公司提供的算法崗位你只要對(duì)比下誰(shuí)的工資高就好了。

它基本覆蓋了全互聯(lián)網(wǎng)公司的算法題目,還有數(shù)據(jù)庫(kù)等技術(shù),并且提供了交流平臺(tái),國(guó)內(nèi)過(guò)各種大神將自己的解答想法分享出來(lái),有些巧妙的解答確實(shí)會(huì)令人拍案叫絕。普遍都是國(guó)外人,但是國(guó)內(nèi)人也特別多,當(dāng)然是國(guó)際版才是這樣的。

如果單單是學(xué)習(xí)練習(xí)java編程的,這兩個(gè)網(wǎng)站可以滿足了,關(guān)鍵就是提升你的編程思維能力。

要學(xué)習(xí)java核心技術(shù)還是建議購(gòu)買java相關(guān)書(shū)籍或者在網(wǎng)上課堂學(xué)習(xí)。

Java開(kāi)發(fā)程序員該如何應(yīng)對(duì)公司的筆試題

謝謝邀請(qǐng)!

雖然現(xiàn)在很多科技公司已經(jīng)取消了主力程序員的面試題,但是不少公司并沒(méi)有取消初級(jí)程序員的筆試題,因?yàn)楣P試題能夠考察出一個(gè)初級(jí)程序員的知識(shí)結(jié)構(gòu),對(duì)于項(xiàng)目經(jīng)驗(yàn)比較少甚至是沒(méi)有項(xiàng)目經(jīng)驗(yàn)的初級(jí)程序員來(lái)說(shuō),筆試是公司考察一個(gè)初級(jí)程序員能力的基本依據(jù)。所以,很多筆試成績(jī)是初級(jí)程序員進(jìn)入下一個(gè)環(huán)節(jié)的重要基礎(chǔ)。

對(duì)于初級(jí)程序員來(lái)說(shuō),筆試都考察什么知識(shí)呢?其實(shí)大部分筆試的考試內(nèi)容都是非?;A(chǔ)的內(nèi)容,比如Java初級(jí)程序員的筆試題往往就是考察對(duì)Java基礎(chǔ)概念的理解是否清晰,是否掌握基本的語(yǔ)法,能否建立起面向?qū)ο蟮木幊趟季S等等,看一個(gè)簡(jiǎn)單的題目:

這個(gè)程序在語(yǔ)法上有沒(méi)有問(wèn)題呢?這個(gè)題目考察的是Java程序員對(duì)“接口可以多擴(kuò)展”這個(gè)概念的掌握,這個(gè)程序是沒(méi)有語(yǔ)法問(wèn)題的。再看一個(gè)例子:

這個(gè)例子輸出的結(jié)果是多少呢?輸出的結(jié)果是322,這個(gè)例子考察的是對(duì)集合概念的理解,尤其是對(duì)Set應(yīng)用的理解。再看一個(gè)例子:

這個(gè)例子的運(yùn)行結(jié)果是什么呢?答案是程序在運(yùn)行中會(huì)拋出異常,這個(gè)例子考察的是對(duì)TreeSet概念的掌握。再看一個(gè)例子:

這個(gè)例子考察的是對(duì)內(nèi)部類的理解,包括靜態(tài)內(nèi)部類,要想完成這個(gè)例子需要了解三方面知識(shí),第一是內(nèi)部類,第二是static內(nèi)部類,第三是多態(tài),這個(gè)程序是無(wú)法編譯通過(guò)的,原因在于創(chuàng)建static內(nèi)部類對(duì)象的過(guò)程不能采用基于外部類對(duì)象創(chuàng)建的方式。

通過(guò)以上四個(gè)例子我們會(huì)發(fā)現(xiàn),其實(shí)這些題目并不復(fù)雜,但是卻非??简?yàn)初級(jí)程序員對(duì)基礎(chǔ)概念的掌握情況,如果對(duì)基礎(chǔ)概念掌握的比較清晰就很容易能夠完成,如果掌握的不夠全面,那么這些看似簡(jiǎn)單的題目也無(wú)法完成。所以說(shuō),在參加筆試之前,一定要把這些基本的概念搞清楚。

最后給大家留一道題,看看你能不能回答出正確的答案(開(kāi)啟和不開(kāi)啟斷言兩種情況分別描述):

大家在評(píng)論區(qū)寫出你的答案和理由吧。

我使用Java語(yǔ)言多年,我在頭條上也寫了關(guān)于學(xué)習(xí)Java的系列文章,想學(xué)習(xí)Java的朋友可以關(guān)注我,相信一定會(huì)有所收獲。

如果有Java開(kāi)發(fā)方面的問(wèn)題,也可以咨詢我。

謝謝!

一般java面試都會(huì)問(wèn)些什么問(wèn)題

Java的數(shù)據(jù)結(jié)構(gòu)有哪些?Map與Set的本質(zhì)區(qū)別是什么?分析:Java常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)有Collection和Map,其中Collection接口下包括List和Set接口,其下又有多個(gè)實(shí)現(xiàn)類如List下有ArrayList、LinkedList和Vector等實(shí)現(xiàn)類,Set下有HashSet、LinkedSet等實(shí)現(xiàn)類和SortedSet接口,HashSet下有LinkedHashSet子類,SortedSet接口下有TreeSet實(shí)現(xiàn)類。Map接口下有HashMap(有LinkedHashMap子類)、HashTable(有Properties子類)實(shí)現(xiàn)類和SortedMap接口(有TreeMap實(shí)現(xiàn)類)。JAVA的數(shù)據(jù)結(jié)構(gòu)主要有List、Set、Map、ArrayList、HashSet、HashMap、Properties等。Map與Set的本質(zhì)區(qū)別有:Set不能包含重復(fù)的元素,最多有一個(gè)空值,繼承自Collection接口,底層是Map實(shí)現(xiàn)機(jī)制。Map不能包含重復(fù)的鍵,每個(gè)鍵最多對(duì)應(yīng)一個(gè)映射的值,不能有空值鍵。兩接口提供的方法不完全一樣。Java中的Annotation的工作原理是什么?Annotation提供一種機(jī)制,將程序的元素如:類,方法,屬性,參數(shù),本地變量,包和元數(shù)據(jù)聯(lián)系起來(lái)。這樣編譯器可以將元數(shù)據(jù)存儲(chǔ)在Class文件中。這樣虛擬機(jī)和其它對(duì)象可以根據(jù)這些元數(shù)據(jù)來(lái)決定如何使用這些程序元素或改變它們的行為。Http協(xié)議工作過(guò)程、?文件上傳時(shí),進(jìn)度條的設(shè)計(jì)原理是什么?Http協(xié)議即超文本傳輸協(xié)議,屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議。它支持客戶/服務(wù)器模式,簡(jiǎn)單快速、靈活、無(wú)連接和無(wú)狀態(tài)。http請(qǐng)求由請(qǐng)求行、消息報(bào)頭、請(qǐng)求正文組成,http響應(yīng)由狀態(tài)行、消息報(bào)頭和響應(yīng)正文組成。文件上傳時(shí)進(jìn)度條的設(shè)計(jì)原理:在java中主要用到I/O原理,已上傳的數(shù)據(jù)值除以文件總大小的比值即實(shí)時(shí)進(jìn)度的值。通過(guò)File類獲取文件的總大小,在讀取或?qū)懗鑫募r(shí)加一個(gè)進(jìn)度計(jì)算的步驟,每讀取或?qū)懗鲆淮尉陀?jì)算進(jìn)度值,更新進(jìn)度條。Spring整合ORM框架時(shí),事務(wù)管理用哪個(gè)類?是Spring控制事務(wù)的提交還是ORM框架控制?同一事務(wù)中執(zhí)行兩個(gè)更新操作,它的工作原理是怎樣的?Spring整合ORM框架時(shí)事務(wù)管理用的是相應(yīng)ORM框架的事務(wù)管理器類如Hibernate對(duì)應(yīng)于HibernateTransactionManager,JPA對(duì)應(yīng)于JpaTransactionManager等。整合過(guò)后可配置由Spring控制事務(wù)的提交。事務(wù)提交前執(zhí)行兩個(gè)更新操作。其工作原理是采用AOP編程的原理來(lái)進(jìn)行控制。分層架構(gòu)中,Dao層的作用是什么?如果不要DAO層,能不能實(shí)現(xiàn)有Dao層時(shí)的優(yōu)點(diǎn)?Dao層又叫數(shù)據(jù)訪問(wèn)對(duì)象層,封裝數(shù)據(jù)庫(kù)的底層操作細(xì)節(jié)如數(shù)據(jù)庫(kù)的連接及對(duì)數(shù)據(jù)的CRUD等操作,它不但屏蔽了數(shù)據(jù)存儲(chǔ)最終介質(zhì)的不同,也屏蔽了具體實(shí)現(xiàn)技術(shù)的不同。一般在其上還會(huì)有Service層來(lái)封裝業(yè)務(wù)操作進(jìn)行進(jìn)一步的解耦。不用DAO層也能實(shí)現(xiàn)Dao層時(shí)的優(yōu)點(diǎn)如自己封裝一個(gè)類似Dao層功能的數(shù)據(jù)庫(kù)操作模板類,可參考Spring的DAO層思想。HibernateDaoSupport,ActionSupport等類中所指的Support,是不是一種設(shè)計(jì)模式?若是,那說(shuō)說(shuō)你對(duì)這種設(shè)計(jì)模式的理解?它們用到了IoC和工廠模式,即依賴注入,將程序代碼中依賴對(duì)象的管理交由相應(yīng)的容器去管理如在配置文件中進(jìn)行注入配置。怎樣實(shí)現(xiàn)分頁(yè)顯示的?具體原理怎么樣?Hibernate的setMaxResults和setFirstResult內(nèi)部是怎么實(shí)現(xiàn)分頁(yè)查詢的?實(shí)現(xiàn)一個(gè)分頁(yè)組件,可自實(shí)現(xiàn)或借用相應(yīng)框架的實(shí)現(xiàn)。原理是求出所查數(shù)據(jù)總記錄數(shù),設(shè)置每頁(yè)要顯示的記錄數(shù),然后計(jì)算每頁(yè)要顯示的第一條記錄數(shù),根據(jù)每頁(yè)要顯示的記錄數(shù)和總記錄數(shù)來(lái)求出頁(yè)數(shù)等。Hibernate的setMaxResults和setFirstResult內(nèi)部是通過(guò)SQL語(yǔ)句來(lái)實(shí)現(xiàn)分頁(yè)查詢的,Hibernate框架的設(shè)計(jì)有什么不足的地方?XML配置麻煩、映射文件可能過(guò)于冗余、查詢慢、對(duì)海量數(shù)據(jù)無(wú)能為力、太對(duì)象化限制了查詢、級(jí)聯(lián)關(guān)系也影響查詢速度等。當(dāng)然,最新版本的Hibernate采用EJB3注解的方式,大大的提高了它的應(yīng)用效率。學(xué)習(xí)JSF,Richface,JBossSeam,JBPM該按什么順序,步驟去學(xué)習(xí)?先需要學(xué)習(xí)JAVAEE相關(guān)技術(shù),如JSF2,EJB3,學(xué)完這些技術(shù)后,就可以學(xué)習(xí)Seam技術(shù)和Richface.

java面試的那些題目在工作中有用嗎

java的面試題也分很多,針對(duì)于不同的面試目標(biāo),面試的題目自然也不同。比如剛畢業(yè)的大學(xué)生,主要問(wèn)基礎(chǔ),如數(shù)據(jù)結(jié)構(gòu)、算法等;針對(duì)于有幾年工作經(jīng)驗(yàn)的人,重點(diǎn)問(wèn)項(xiàng)目經(jīng)驗(yàn)、主流的開(kāi)發(fā)技術(shù);針對(duì)于再牛逼些的人,則會(huì)問(wèn)些架構(gòu)、基礎(chǔ)原理等方面的問(wèn)題。不清楚題主問(wèn)這個(gè)問(wèn)題的初衷是什么,我猜想可能題主是剛畢業(yè)的學(xué)生,大部分項(xiàng)目中數(shù)據(jù)結(jié)構(gòu)、算法用的并不是很多,即使用到也都會(huì)有封裝好的類庫(kù)可以拿來(lái)直接使用。但這些東西肯定是有用的,當(dāng)遇到更復(fù)雜更需要精益求精的需求時(shí),就需要追本溯源,用到很多基礎(chǔ)的理論。之前一直覺(jué)得大學(xué)學(xué)的計(jì)算機(jī)理論沒(méi)什么用,但這行做的越久越發(fā)現(xiàn)這些東西的必要性。

java程序設(shè)計(jì)題目

我是java開(kāi)發(fā)工程師,這種題一般面試時(shí)候會(huì)遇到。

首先此題考察的是字符串的打印以及數(shù)學(xué)公式

題目中分子和分母的關(guān)系可以通過(guò)一個(gè)簡(jiǎn)單的數(shù)學(xué)公式來(lái)表示

假設(shè)項(xiàng)數(shù)為n

分子:n

分母:2n-1

所以:?jiǎn)雾?xiàng)表示為n/2n-1

但是如果要輸出此數(shù)列就不能使用int類型來(lái)輸出,不然會(huì)使得結(jié)果變成相除的結(jié)果

如下圖是正確答案

以下是輸出結(jié)果

這種程序一般比較基礎(chǔ),考察的點(diǎn)也都是細(xì)節(jié)。

java類面試題哪里有哦

對(duì)于大部分人而言,在找工作之前少不了準(zhǔn)備工作,有一份全面細(xì)致面試題將幫助大家減少許多麻煩。所以準(zhǔn)備找工作的小伙伴可以看參考一下哦!

ThreadLocal(線程變量副本)

Synchronized實(shí)現(xiàn)內(nèi)存共享,ThreadLocal為每個(gè)線程維護(hù)一個(gè)本地變量。采用空間換時(shí)間,它用于線程間的數(shù)據(jù)隔離,為每一個(gè)使用該變量的線程提供一個(gè)副本,每個(gè)線程都可以獨(dú)立地改變自己的副本,而不會(huì)和其他線程的副本沖突。ThreadLocal類中維護(hù)一個(gè)Map,用于存儲(chǔ)每一個(gè)線程的變量副本,Map中元素的鍵為線程對(duì)象,而值為對(duì)應(yīng)線程的變量副本。ThreadLocal在Spring中發(fā)揮著巨大的作用,在管理Request作用域中的Bean、事務(wù)管理、任務(wù)調(diào)度、AOP等模塊都出現(xiàn)了它的身影。Spring中絕大部分Bean都可以聲明成Singleton作用域,采用ThreadLocal進(jìn)行封裝,因此有狀態(tài)的Bean就能夠以singleton的方式在多線程中正常工作了。

“你能不能談?wù)?,javaGC是在什么時(shí)候,對(duì)什么東西,做了什么事情?”

在什么時(shí)候:1、新生代有一個(gè)Eden區(qū)和兩個(gè)survivor區(qū),首先將對(duì)象放入Eden區(qū),如果空間不足就向其中的一個(gè)survivor區(qū)上放,如果仍然放不下就會(huì)引發(fā)一次發(fā)生在新生代的minorGC,將存活的對(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í)行minorGC的時(shí)候應(yīng)該對(duì)要晉升到老年代的對(duì)象進(jìn)行分析,如果這些馬上要到老年區(qū)的老年對(duì)象的大小超過(guò)了老年區(qū)的剩余大小,那么執(zhí)行一次FullGC以盡可能地獲得老年區(qū)的空間。

對(duì)什么東西:

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

做什么:

新生代:復(fù)制清理;老年代:標(biāo)記-清除和標(biāo)記-壓縮算法;永久代:存放Java中的類和加載類的類加載器本身。GCRoots都有哪些:1.虛擬機(jī)棧中的引用的對(duì)象2.方法區(qū)中靜態(tài)屬性引用的對(duì)象,常量引用的對(duì)象3.本地方法棧中JNI(即一般說(shuō)的Native方法)引用的對(duì)象。

Synchronized與Loc

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

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

ReentrantLock適用場(chǎng)景

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

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

3、具有公平鎖功能,每個(gè)到來(lái)的線程都將排隊(duì)等候。

StringBuffer是線程安全的,每次操作字符串,String會(huì)生成一個(gè)新的對(duì)象,而StringBuffer不會(huì);StringBuilder是非線程安全的。

fail-fast是什么?

fail-fast:機(jī)制是java集合(Collection)中的一種錯(cuò)誤機(jī)制。當(dāng)多個(gè)線程對(duì)同一個(gè)集合的內(nèi)容進(jìn)行操作時(shí),就可能會(huì)產(chǎn)生fail-fast事件。例如:當(dāng)某一個(gè)線程A通過(guò)iterator去遍歷某集合的過(guò)程中,若該集合的內(nèi)容被其他線程所改變了;那么線程A訪問(wèn)集合時(shí),就會(huì)拋出ConcurrentModificationException異常,產(chǎn)生fail-fast事件。

happens-before

happens-before:如果兩個(gè)操作之間具有happens-before關(guān)系,那么前一個(gè)操作的結(jié)果就會(huì)對(duì)后面一個(gè)操作可見(jiàn)。1、程序順序規(guī)則:一個(gè)線程中的每個(gè)操作,happens-before于該線程中的任意后續(xù)操作。2、監(jiān)視器鎖規(guī)則:對(duì)一個(gè)監(jiān)視器鎖的解鎖,happens-before于隨后對(duì)這個(gè)監(jiān)視器鎖的加鎖。3、volatile變量規(guī)則:對(duì)一個(gè)volatile域的寫,happens-before于任意后續(xù)對(duì)這個(gè)volatile域的讀。4、傳遞性:如果Ahappens-beforeB,且Bhappens-beforeC,那么Ahappens-beforeC。5、線程啟動(dòng)規(guī)則:Thread對(duì)象的start()方法happens-before于此線程的每一個(gè)動(dòng)作。

Volatile和Synchronized的不同點(diǎn)

Volatile和Synchronized四個(gè)不同點(diǎn):1、粒度不同,前者針對(duì)變量,后者鎖對(duì)象和類;2、syn阻塞,volatile線程不阻塞;3、syn保證三大特性,volatile不保證原子性;

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

保證此變量對(duì)所有線程的可見(jiàn)性,指一條線程修改了這個(gè)變量的值,新值對(duì)于其他線程來(lái)說(shuō)是可見(jiàn)的,但并不是多線程安全的;禁止指令重排序優(yōu)化。

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

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

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

同步:就是一個(gè)任務(wù)的完成需要依賴另外一個(gè)任務(wù),只有等待被依賴的任務(wù)完成后,依賴任務(wù)才能完成。異步:不需要等待被依賴的任務(wù)完成,只是通知被依賴的任務(wù)要完成什么工作,只要自己任務(wù)完成了就算完成了,被依賴的任務(wù)是否完成會(huì)通知回來(lái)。(異步的特點(diǎn)就是通知)。打電話和發(fā)短信來(lái)比喻同步和異步操作。阻塞:CPU停下來(lái)等一個(gè)慢的操作完成以后,才會(huì)接著完成其他的工作。非阻塞:非阻塞就是在這個(gè)慢的執(zhí)行時(shí),CPU去做其他工作,等這個(gè)慢的完成后,CPU才會(huì)接著完成后續(xù)的操作。非阻塞會(huì)造成線程切換增加,增加CPU的使用時(shí)間能不能補(bǔ)償系統(tǒng)的切換成本需要考慮。

CAS

CAS(CompareAndSwap)無(wú)鎖算法:CAS是樂(lè)觀鎖技術(shù),當(dāng)多個(gè)線程嘗試使用CAS同時(shí)更新同一個(gè)變量時(shí),只有其中一個(gè)線程能更新變量的值,而其它線程都失敗,失敗的線程并不會(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,否則什么都不做。

線程池的作用

線程池的作用:在程序啟動(dòng)的時(shí)候就創(chuàng)建若干線程來(lái)響應(yīng)處理,它們被稱為線程池,里面的線程叫工作線程。第一:降低資源消耗。通過(guò)重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。第二:提高響應(yīng)速度。當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行。第三:提高線程的可管理性。常用線程池:ExecutorService是主要的實(shí)現(xiàn)類,其中常用的有Executors.newSingleThreadPool()、newFixedThreadPool()、newcachedTheadPool()、newScheduledThreadPool()。

類加載器工作機(jī)制

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

a)校驗(yàn):檢查載入Class文件數(shù)據(jù)的正確性;

b)準(zhǔn)備:給類的靜態(tài)變量分配存儲(chǔ)空間;

c)解析:將符號(hào)引用轉(zhuǎn)成直接引用。初始化:對(duì)類的靜態(tài)變量,靜態(tài)方法和靜態(tài)代碼塊執(zhí)行初始化工作。雙親委派模型:類加載器收到類加載請(qǐng)求,首先將請(qǐng)求委派給父類加載器完成,用戶自定義加載器-應(yīng)用程序加載器-擴(kuò)展類加載器-啟動(dòng)類加載器。

Redis數(shù)據(jù)結(jié)構(gòu)

String—字符串(key-value類型)

Hash—字典(hashmap)Redis的哈希結(jié)構(gòu)可以使你像在數(shù)據(jù)庫(kù)中更新一個(gè)屬性一樣只修改某一項(xiàng)屬性值List—列表實(shí)現(xiàn)消息隊(duì)列Set—集合利用唯一性SortedSet—有序集合可以進(jìn)行排序可以實(shí)現(xiàn)數(shù)據(jù)持久化

索引: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)的指針,這樣就形成了帶有順序訪問(wèn)指針的B+Tree,做這個(gè)優(yōu)化的目的是提高不同區(qū)間訪問(wèn)的性能。什么時(shí)候使用索引:

1、經(jīng)常出現(xiàn)在groupby,orderby和distinc關(guān)鍵字后面的字段。

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

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

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

SpringIOC

Spring支持三種依賴注入方式,分別是屬性(Setter方法)注入,構(gòu)造注入和接口注入。在Spring中,那些組成應(yīng)用的主體及由SpringIOC容器所管理的對(duì)象被稱之為Bean。Spring的IOC容器通過(guò)反射的機(jī)制實(shí)例化Bean并建立Bean之間的依賴關(guān)系。簡(jiǎn)單地講,Bean就是由SpringIOC容器初始化、裝配及被管理的對(duì)象。獲取Bean對(duì)象的過(guò)程,首先通過(guò)Resource加載配置文件并啟動(dòng)IOC容器,然后通過(guò)getBean方法獲取bean對(duì)象,就可以調(diào)用他的方法。SpringBean的作用域:Singleton:SpringIOC容器中只有一個(gè)共享的Bean實(shí)例,一般都是Singleton作用域。Prototype:每一個(gè)請(qǐng)求,會(huì)產(chǎn)生一個(gè)新的Bean實(shí)例。Request:每一次http請(qǐng)求會(huì)產(chǎn)生一個(gè)新的Bean實(shí)例。

代理都有哪些?

代理的共有優(yōu)點(diǎn):業(yè)務(wù)類只需要關(guān)注業(yè)務(wù)邏輯本身,保證了業(yè)務(wù)類的重用性。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è)代理類只能代理一個(gè)業(yè)務(wù)類。如果業(yè)務(wù)類增加方法時(shí),相應(yīng)的代理類也要增加方法。Java動(dòng)態(tài)代理:Java動(dòng)態(tài)代理是寫一個(gè)類實(shí)現(xiàn)InvocationHandler接口,重寫Invoke方法,在Invoke方法可以進(jìn)行增強(qiáng)處理的邏輯的編寫,這個(gè)公共代理類在運(yùn)行的時(shí)候才能明確自己要代理的對(duì)象,同時(shí)可以實(shí)現(xiàn)該被代理類的方法的實(shí)現(xiàn),然后在實(shí)現(xiàn)類方法的時(shí)候可以進(jìn)行增強(qiáng)處理。實(shí)際上:代理對(duì)象的方法=增強(qiáng)處理+被代理對(duì)象的方法

JDK和CGLIB生成動(dòng)態(tài)代理類的區(qū)別:JDK動(dòng)態(tài)代理只能針對(duì)實(shí)現(xiàn)了接口的類生成代理(實(shí)例化一個(gè)類)。此時(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ì)類實(shí)現(xiàn)代理,主要是對(duì)指定的類生成一個(gè)子類(沒(méi)有實(shí)例化一個(gè)類),覆蓋其中的方法。

SpringMVC運(yùn)行原理

1、客戶端請(qǐng)求提交到DispatcherServlet。

2、由DispatcherServlet控制器查詢HandlerMapping,找到并分發(fā)到指定的Controller中。

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

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

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

一個(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)給用戶。

設(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ù)載均衡,將不同用戶的請(qǐng)求分發(fā)到不同的處理節(jié)點(diǎn)上,然后先存入緩存,定時(shí)向主數(shù)據(jù)庫(kù)更新數(shù)據(jù)。讀寫的過(guò)程采用類似樂(lè)觀鎖的機(jī)制,可以一直讀(在寫數(shù)據(jù)的時(shí)候也可以),但是每次讀的時(shí)候會(huì)有個(gè)版本的標(biāo)記,如果本次讀的版本低于緩存的版本,會(huì)重新讀數(shù)據(jù),這樣的情況并不多,可以忍受。

Session與Cookie

Session與Cookie:Cookie可以讓服務(wù)端跟蹤每個(gè)客戶端的訪問(wèn),但是每次客戶端的訪問(wèn)都必須傳回這些Cookie,如果Cookie很多,則無(wú)形的增加了客戶端與服務(wù)端的數(shù)據(jù)傳輸量,而Session則很好地解決了這個(gè)問(wèn)題,同一個(gè)客戶端每次和服務(wù)端交互時(shí),將數(shù)據(jù)存儲(chǔ)通過(guò)Session到服務(wù)端,不需要每次都傳回所有的Cookie值,而是傳回一個(gè)ID,每個(gè)客戶端第一次訪問(wèn)服務(wù)器生成的唯一的ID,客戶端只要傳回這個(gè)ID就行了,這個(gè)ID通常為NAME為JSESSIONID的一個(gè)Cookie。這樣服務(wù)端就可以通過(guò)這個(gè)ID,來(lái)將存儲(chǔ)到服務(wù)端的KV值取出了。

分布式Session框架

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

2、共享這些Session存儲(chǔ)在一個(gè)分布式緩存中,可以隨時(shí)寫入和讀取,而且性能要很好,如Memcache,Tair;

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

4、由于Cookie不能跨域訪問(wèn),要實(shí)現(xiàn)Session同步,要同步SessionID寫到不同域名下。

InputStream

適配器模式:將一個(gè)接口適配到另一個(gè)接口,JavaI/O中InputStreamReader將Reader類適配到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ù)類方法。2、控制事務(wù)行為的事務(wù)屬性,這些屬性包括事物隔離級(jí)別,事務(wù)傳播行為,超時(shí)時(shí)間,回滾規(guī)則。Spring通過(guò)aop/txSchema命名空間和@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ì)用戶請(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之前,攔截客戶的HttpServletRequest。根據(jù)需要檢查HttpServletRequest,也可以修改HttpServletRequest頭和數(shù)據(jù)。在HttpServletResponse到達(dá)客戶端之前,攔截HttpServletResponse。根據(jù)需要檢查HttpServletResponse,也可以修改HttpServletResponse頭和數(shù)據(jù)。

實(shí)際上Filter和Servlet極其相似,區(qū)別只是Filter不能直接對(duì)用戶生成響應(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)求被銷毀。5、Servlet初始化后,將不會(huì)隨著請(qǐng)求的結(jié)束而注銷。6、關(guān)閉Tomcat時(shí),Servlet、Filter依次被注銷。

HashMap與HashTable的區(qū)別

1、HashMap是非線程安全的,HashTable是線程安全的。2、HashMap的鍵和值都允許有null值存在,而HashTable則不行。3、因?yàn)榫€程安全的問(wèn)題,HashMap效率比HashTable的要高。

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

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

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

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

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

Linux常用命令

cd,cp,mv,rm,ps(進(jìn)程),tar,cat(查看內(nèi)容),chmod,vim,find,ls

死鎖的必要條件

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

2、占有并等待;

3、非搶占;

4、循環(huán)等待。

解決死鎖,第一個(gè)是死鎖預(yù)防,就是不讓上面的四個(gè)條件同時(shí)成立。二是,合理分配資源。三是使用銀行家算法,如果該進(jìn)程請(qǐng)求的資源操作系統(tǒng)剩余量可以滿足,那么就分配。

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

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

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

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

消息隊(duì)列(messagequeue):消息隊(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)存(sharedmemory):共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問(wèn)的內(nèi)存,這段共享內(nèi)存由一個(gè)進(jìn)程創(chuàng)建,但多個(gè)進(jìn)程都可以訪問(wèn)。共享內(nèi)存是最快的IPC方式,它是針對(duì)其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號(hào)量,配合使用,來(lái)實(shí)現(xiàn)進(jìn)程間的同步和通信。

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

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

在Java7之前,switch只能支持byte、short、char、int或者其對(duì)應(yīng)的封裝類以及Enum類型。在Java7中、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)行線程同步的。

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

利用軟引用和弱引用解決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)題。

通過(guò)軟可及對(duì)象重獲方法實(shí)現(xiàn)Java對(duì)象的高速緩存:比如我們創(chuàng)建了一Employee的類,如果每次需要查詢一個(gè)雇員的信息。哪怕是幾秒中之前剛剛查詢過(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í)例的軟引用。

強(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)的話,JVM在合適的時(shí)間就會(huì)回收該對(duì)象。

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

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

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

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

同樣用于鑒定2個(gè)對(duì)象是否相等的,java集合中有l(wèi)ist和set兩類,其中set不允許元素重復(fù)實(shí)現(xiàn),那個(gè)這個(gè)不允許重復(fù)實(shí)現(xiàn)的方法,如果用equal去比較的話,如果存在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)行比較,相同的話就不存了,散列到其他地址上。

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

a、Overload顧名思義是重新加載,它可以表現(xiàn)類的多態(tài)性,可以是函數(shù)里面可以有相同的函數(shù)名但是參數(shù)名、返回值、類型不能相同;或者說(shuō)可以改變參數(shù)、類型、返回值但是函數(shù)名字依然不變。b、就是ride(重寫)的意思,在子類繼承父類的時(shí)候子類中可以定義某方法與其父類有相同的名稱和參數(shù),當(dāng)子類在調(diào)用這一函數(shù)時(shí)自動(dòng)調(diào)用子類的方法,而父類相當(dāng)于被覆蓋(重寫)了。具體可前往C++中重載、重寫(覆蓋)的區(qū)別實(shí)例分析查看。

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

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

b、抽象類中可以有構(gòu)造方法,接口中不能有構(gòu)造方法;

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

d、抽象類中可以包含靜態(tài)方法,接口中不可以;

e、抽象類中可以有普通成員變量,接口中不可以。

解析XML的幾種方式的原理與特點(diǎn)

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

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é)束。

PULL:與SAX類似,也是基于事件驅(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類,和wait來(lái)自O(shè)bject類。

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

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

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

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

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

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

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

實(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)存;

局部變量:由聲明在某方法,或某代碼段里(比如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)找到合適的辦法。

返回列表
上一篇:
下一篇: