更新時(shí)間:2020-01-03 15:18:41 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3308次
1、set集合從原理上如何保證不重復(fù)
1)在往set中添加元素時(shí),如果指定元素不存在,則添加成功。也就是說(shuō),如果set中不存在(e==null ? e1==null :
e.queals(e1))的元素e1,則e1能添加到set中。
2)具體來(lái)講:當(dāng)向HashSet中添加元素的時(shí)候,首先計(jì)算元素的hashcode值,然后用這個(gè)(元素的hashcode)%(HashMap集合的大小)+1計(jì)算出這個(gè)元素的存儲(chǔ)位置,如果這個(gè)位置位空,就將元素添加進(jìn)去;如果不為空,則用equals方法比較元素是否相等,相等就不添加,否則找一個(gè)空位添加。
2、HashMap和HashTable的主要區(qū)別是什么?,兩者底層實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)是什么?
HashMap和HashTable的區(qū)別:
二者都實(shí)現(xiàn)了Map 接口,是將惟一鍵映射到特定的值上;主要區(qū)別在于:
1)HashMap 沒(méi)有排序,允許一個(gè)null 鍵和多個(gè)null 值,而Hashtable 不允許;
2)HashMap 把Hashtable 的contains 方法去掉了,改成containsvalue 和containsKey,因?yàn)閏ontains 方法容易讓人引起誤解;
3)Hashtable 繼承自Dictionary 類(lèi),HashMap 是Java1.2 引進(jìn)的Map 接口的實(shí)現(xiàn);
4)Hashtable 的方法是Synchronize 的,而HashMap 不是,在多個(gè)線(xiàn)程訪(fǎng)問(wèn)Hashtable 時(shí),不需要自己為它的方法實(shí)現(xiàn)同步,而HashMap 就必須為之提供外同步。Hashtable 和HashMap 采用的hash/rehash 算法大致一樣,所以性能不會(huì)有很大的差異。
HashMap和HashTable的底層實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu):
HashMap和Hashtable的底層實(shí)現(xiàn)都是數(shù)組+鏈表結(jié)構(gòu)實(shí)現(xiàn)的
3、HashMap何時(shí)擴(kuò)容,擴(kuò)容的算法是什么?
HashMap何時(shí)擴(kuò)容:
當(dāng)向容器添加元素的時(shí)候,會(huì)判斷當(dāng)前容器的元素個(gè)數(shù),如果大于等于閾值---即當(dāng)前數(shù)組的長(zhǎng)度乘以加載因子的值的時(shí)候,就要自動(dòng)擴(kuò)容
擴(kuò)容的算法是什么:
擴(kuò)容(resize)就是重新計(jì)算容量,向HashMap對(duì)象里不停的添加元素,而HashMap對(duì)象內(nèi)部的數(shù)組無(wú)法裝載更多的元素時(shí),對(duì)象就需要擴(kuò)大數(shù)組的長(zhǎng)度,以便能裝入更多的元素。當(dāng)然Java里的數(shù)組是無(wú)法自動(dòng)擴(kuò)容的,方法是使用一個(gè)新的數(shù)組代替已有的容量小的數(shù)組
4、Java的虛擬機(jī)JVM的兩個(gè)內(nèi)存:棧內(nèi)存和堆內(nèi)存的區(qū)別是什么?
Java把內(nèi)存劃分成兩種:一種是棧內(nèi)存,一種是堆內(nèi)存。兩者的區(qū)別是:
1)棧內(nèi)存:在函數(shù)中定義的一些基本類(lèi)型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配。 當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java就在棧中為這個(gè)變量分配內(nèi)存空間,當(dāng)超過(guò)變量的作用域后,Java會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作他用。
2)堆內(nèi)存:堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組。在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理。
5、Java中對(duì)異常是如何進(jìn)行分類(lèi)的?
異常整體分類(lèi):
1)Java異常結(jié)構(gòu)中定義有Throwable類(lèi)。 Exception和Error為其子類(lèi)。
2)其中Exception表示由于網(wǎng)絡(luò)故障、文件損壞、設(shè)備錯(cuò)誤、用戶(hù)輸入非法情況導(dǎo)致的異常;
3)而Error標(biāo)識(shí)Java運(yùn)行時(shí)環(huán)境出現(xiàn)的錯(cuò)誤,例如:JVM內(nèi)存耗盡。
6、數(shù)據(jù)庫(kù)設(shè)計(jì)中常講的三范式是指什么?
1)第一范式1NF(域的原子性)
如果數(shù)據(jù)庫(kù)表中的所有字段值都是不可分解的原子值,就說(shuō)明該數(shù)據(jù)庫(kù)表滿(mǎn)足了第一范式
2)第二范式2NF(表中除主鍵外的字段都完全依賴(lài)主鍵)
第二范式是在第一范式基礎(chǔ)上建立的。第二范式有兩個(gè)重點(diǎn):(1)表中必須有主鍵;(2)其他非主屬性必須完全依賴(lài)主鍵,不能只依賴(lài)主鍵的一部分(主要針對(duì)聯(lián)合主鍵而言)。
3)第三范式3NF(表中除主鍵外的字段都完全直接依賴(lài),不能是傳遞依賴(lài))
不能是傳遞依賴(lài),即不能存在:非主鍵列 A 依賴(lài)于非主鍵列 B,非主鍵列 B 依賴(lài)于主鍵的情況。第二范式和第三范式區(qū)分的關(guān)鍵點(diǎn):2NF:非主鍵列是否完全依賴(lài)于主鍵,還是依賴(lài)于主鍵的一部分;3NF:非主鍵列是直接依賴(lài)于主鍵,還是直接依賴(lài)于非主鍵列。
7、Java中的線(xiàn)程池共有幾種?
Java四種線(xiàn)程池
第一種:newCachedThreadPool
創(chuàng)建一個(gè)可根據(jù)需要?jiǎng)?chuàng)建新線(xiàn)程的線(xiàn)程池,但是在以前構(gòu)造的線(xiàn)程可用時(shí)將重用它們。
第二種:newFixedThreadPool
創(chuàng)建一個(gè)指定工作線(xiàn)程數(shù)量的線(xiàn)程池
第三種:newScheduledThreadPool
創(chuàng)建一個(gè)線(xiàn)程池,它可安排在給定延遲后運(yùn)行命令或者定期地執(zhí)行。
第四種:newSingleThreadExecutor
創(chuàng)建一個(gè)使用單個(gè) worker 線(xiàn)程的 Executor,以無(wú)界隊(duì)列方式來(lái)運(yùn)行該線(xiàn)程。
8、volatile和synchronized區(qū)別
volatile和synchronized簡(jiǎn)介:
在Java中,為了保證多線(xiàn)程讀寫(xiě)數(shù)據(jù)時(shí)保證數(shù)據(jù)的一致性,可以采用兩種方式:
1)使用synchronized關(guān)鍵字
2)使用volatile關(guān)鍵字:用一句話(huà)概括volatile,它能夠使變量在值發(fā)生改變時(shí)能盡快地讓其他線(xiàn)程知道。
兩者的區(qū)別:
1)volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器中的值是不確定的,需要從主存中讀取,synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線(xiàn)程可以訪(fǎng)問(wèn)該變量,其他線(xiàn)程被阻塞住.
2)volatile僅能使用在變量級(jí)別,synchronized則可以使用在變量,方法.
3)volatile僅能實(shí)現(xiàn)變量的修改可見(jiàn)性,而synchronized則可以保證變量的修改可見(jiàn)性和原子性.
4)volatile不會(huì)造成線(xiàn)程的阻塞,而synchronized可能會(huì)造成線(xiàn)程的阻塞.
9、Spring的特性
1.方便解耦,簡(jiǎn)化開(kāi)發(fā)
通過(guò)Spring提供的IoC容器,我們可以將對(duì)象之間的依賴(lài)關(guān)系交由Spring進(jìn)行控制,避免硬編碼所造成的過(guò)度程序耦合。
2.AOP編程的支持
通過(guò)Spring提供的AOP功能,方便進(jìn)行面向切面的編程。
3.聲明事物的支持
在Spring中,我們可以從單調(diào)煩悶的事務(wù)管理代碼中解脫出來(lái),通過(guò)聲明式方式靈活地進(jìn)行事務(wù)的管理,提高開(kāi)發(fā)效率和質(zhì)量。
4.方便程序的測(cè)試
可以用非容器依賴(lài)的編程方式進(jìn)行幾乎所有的測(cè)試工作。例如:Spring對(duì)Junit4支持,可以通過(guò)注解方便的測(cè)試Spring程序。
5.方便集成各種優(yōu)秀框架
Spring不排斥各種優(yōu)秀的開(kāi)源框架,相反,Spring可以降低各種框架的使用難度,Spring提供了對(duì)各種優(yōu)秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用難度
Spring對(duì)很多難用的Java EE API(如JDBC,JavaMail,遠(yuǎn)程調(diào)用等)提供了一個(gè)薄薄的封裝層,通過(guò)Spring的簡(jiǎn)易封裝,這些Java EE API的使用難度大為降低。
10、spring aop的應(yīng)用場(chǎng)景:
AOP用來(lái)封裝橫切關(guān)注點(diǎn),具體可以在下面的場(chǎng)景中使用
Authentication 權(quán)限
Caching 緩存
Context passing 內(nèi)容傳遞
Error handling 錯(cuò)誤處理
Lazy loading 懶加載
Debugging 調(diào)試
logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準(zhǔn)
Performance optimization 性能優(yōu)化
Persistence 持久化
Resource pooling 資源池
Synchronization 同步
Transactions 事務(wù)
以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“京東Java算法筆試精選題”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)推薦
最新最全java面試題及答案(初級(jí)到高級(jí))
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743