java葵花宝典_JAVA程序员想入职跳槽,这些基本功一定要做好,你给自己打几分?...
基礎(chǔ)篇
Q1
訪問修飾符 public , private , protected 以及不寫時(shí)的區(qū)別?
類的成員不寫訪問修飾符時(shí),默認(rèn)的是default。
Q2
Stirng是最基本的數(shù)據(jù)類型嗎?
不是。
java中的基本數(shù)據(jù)類型就八種: byte, short, int, long, float, double, char,
boolean。
剩下的都是引用類型(reference type)。
Q3
float f = 1.1; 正確嗎?
不正確。
1.1是雙精度, 將雙精度賦值給浮點(diǎn)型,屬于向下轉(zhuǎn)型,會(huì)造成精度的丟失.如果要強(qiáng)制類型轉(zhuǎn)換,可以寫成這樣 float f = (float)1.1; 或者 float f=1.1F;
Q4
short a = 1; a = a + 1 和 short a = 1 ; a += 1 有什么區(qū)別?
對(duì)于a = a + 1 因?yàn)?是int值類型,所以計(jì)算的結(jié)果是int,要賦值給short,需要強(qiáng)制類型裝換才能賦值給short。
對(duì)于a += 1; 其相當(dāng)于 a = (short)(a+1) ;其中已經(jīng)做了強(qiáng)制類型裝換。
Q5
下面代碼打印結(jié)果?
Integer a = 100, b = 100, c = 130, d = 130 ;
System.out.println(a ==> b);
System.out.println(c == d);
第一個(gè)是true,第二個(gè)是false.
因?yàn)閍,b,c,d四個(gè)變量都是integer對(duì)象的引用,所以==比較的不是值,而是引用。如果整型字面量的值在-128到127之間,那么不會(huì)new新的Integer對(duì)象,而是直接引用常量池中的Integer對(duì)象。
Q6
Java中如何跳出多重嵌套循環(huán)?
在最外層循環(huán)前加標(biāo)記A,利用break A;可以跳出循環(huán)。
Q7
String類可以被繼承嗎?
不可以。因?yàn)镾tring類是final類。
Q8
String 和 StringBuilder , StringBuffer 的區(qū)別?
String是只讀字符串,String引用的字符串內(nèi)容是不能被改變的。而StringBuffer和StringBuilder是可變字符串。
StringBuilder和StringBuffer的用法相同, 區(qū)別是StringBuffer被synchronized修飾,效率比StringBuilder低。
Q9
構(gòu)造器是否可以被重寫?
構(gòu)造器不能被繼承,因此不能被重寫,但是可以被重載。
Q10
int a = 1; int b = 2; 怎么讓a,b值交換?
a = a ^ b;
b = a ^ b;
a = a ^ b;
中級(jí)篇
Q1
抽象類和接口的相同點(diǎn)和不同點(diǎn)。
1.抽象類和接口都不能實(shí)例化對(duì)象,但是可以定義抽象類和接口類型的引用。
2.繼承抽象類和實(shí)現(xiàn)接口都要對(duì)其中的抽象方法全部實(shí)現(xiàn)。
3.接口比抽象類更加抽象,抽象類中可以定義構(gòu)造器,可以有抽象方法和具體方法。
4.接口中方法全部都是抽象方法。
5.抽象類中的成員可以是 private , protected , public ,接口全部都是 public 。
6.抽象類中可以定義成員變量,而接口中定義的成員變量實(shí)際上都是常量。
7.有抽象方法的類必須聲明為抽象類,而抽象類未必要有抽象方法。
Q2
java中會(huì)存在內(nèi)存泄露嗎?
理論上java不會(huì)存在內(nèi)存泄露的問題,應(yīng)為有垃圾回收機(jī)制(GC).然而在實(shí)際開發(fā)中,可能會(huì)存在無用但可達(dá)的對(duì)象,這些對(duì)象不能被GC回收,因此會(huì)導(dǎo)致內(nèi)存泄露。
例如:hibernated的Session中的對(duì)象屬于持久態(tài),垃圾回收器不會(huì)回收這些對(duì)象,這些對(duì)象中有可能存在無用的垃圾對(duì)象。如果關(guān)閉不及時(shí),一級(jí)緩存就可能導(dǎo)致內(nèi)存泄露。
Q3
try{ }里面return, finally里的代碼會(huì)不會(huì)執(zhí)行,什么時(shí)候被執(zhí)行?
會(huì)執(zhí)行。在方法返回給調(diào)用者前執(zhí)行,因?yàn)槿绻嬖趂inally代碼塊, try中的return語句不會(huì)立馬返回調(diào)用者,而是記錄下返回值待finally代碼塊執(zhí)行完畢之后在返回。
Q4
List,Map,Set 三個(gè)接口存取元素時(shí),各自有什么特點(diǎn)?
List以特定的索引來存取元素,可以有重復(fù)元素,Set不能存放重復(fù)元素。
Map保存鍵值對(duì)的映射,映射關(guān)系可以是一對(duì)一或多對(duì)一。
Set和Map容器都有基于哈希存儲(chǔ)和排序樹的兩種實(shí)現(xiàn)版本,基于哈希存儲(chǔ)理論存取時(shí)間復(fù)雜度是O(1)。
Q5
Thread類中的sleep()和對(duì)象的wait()有什么區(qū)別?
sleep()方法是線程類的靜態(tài)方法,調(diào)用此方法會(huì)讓當(dāng)前線程暫停執(zhí)行指定時(shí)間。將CPU時(shí)間片分給其他線程,但是對(duì)象的鎖依然保持, 休眠時(shí)間結(jié)束會(huì)自動(dòng)回復(fù)到就緒狀態(tài)。
wait()是Object類的方法,調(diào)用對(duì)象的wait()方法導(dǎo)致當(dāng)前線程放棄對(duì)象的鎖,線程暫停執(zhí)行,進(jìn)入對(duì)象的等待池,只有調(diào)用對(duì)象的notify()方法或notifyAll()方法時(shí),才能喚醒等待池中的線程進(jìn)入等鎖池,如果線程重新獲得對(duì)象的鎖就可以進(jìn)入就緒狀態(tài)。
Q6
當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的synchronized方法A之后,其它線程是否可進(jìn)入此對(duì)象的synchronized方法B?
不能。其它線程只能訪問該對(duì)象的非同步方法,同步方法則不能進(jìn)入。
因?yàn)榉庆o態(tài)方法上的synchronized修飾符要求執(zhí)行方法時(shí)要獲得對(duì)象的鎖,如果已經(jīng)進(jìn)入A方法說明對(duì)象鎖已經(jīng)被取走,那么試圖進(jìn)入B方法的線程就只能在等鎖池(注意不是等待池哦)中等待對(duì)象的鎖。
Q7
說說synchronized關(guān)鍵字的用法?
synchronized關(guān)鍵字可以將對(duì)象或者方法標(biāo)記為同步,以實(shí)現(xiàn)對(duì)對(duì)象和方法的互斥訪問,可以用synchronized(對(duì)象) { … }定義同步代碼塊,或者在聲明方法時(shí)將 synchronized 作為方法的修飾符。
Q8
Java如何實(shí)現(xiàn)序列化,有什么意義?
序列化就是一種用來處理對(duì)象流的機(jī)制,所謂對(duì)象流也就是將對(duì)象的內(nèi)容進(jìn)行流化。可以對(duì)流化后的對(duì)象進(jìn)行讀寫操作,也可將流化后的對(duì)象傳輸于網(wǎng)絡(luò)之間。
序列化是為了解決對(duì)象流讀寫操作時(shí)可能引發(fā)的問題(如果不進(jìn)行序列化可能會(huì)存在數(shù)據(jù)亂序的問題),要實(shí)現(xiàn)序列化,讓類實(shí)現(xiàn)Serializable接口.該接口是一個(gè)標(biāo)識(shí)性接口,標(biāo)注該類對(duì)象是可被序列化的,然后使用一個(gè)輸出流來構(gòu)造一個(gè)對(duì)象輸出流并通過writeObject(Object)方法就可以將實(shí)現(xiàn)對(duì)象寫出。
如果需要反序列化則可以用一個(gè)輸入流建立對(duì)象輸入流,然后通過readObject方法從流中讀取對(duì)象。序列化除了能夠?qū)崿F(xiàn)對(duì)象的持久化之外,還能夠用于對(duì)象的深度克隆。
Q9
線程的sleep()方法和yield()方法有什么區(qū)別?
sleep()方法給其他線程運(yùn)行機(jī)會(huì)時(shí)不考慮線程的優(yōu)先級(jí),因此會(huì)給低優(yōu)先級(jí)的線程以運(yùn)行的機(jī)會(huì);yield()方法只會(huì)給相同優(yōu)先級(jí)或更高優(yōu)先級(jí)的線程以運(yùn)行的機(jī)會(huì);
線程執(zhí)行sleep()方法后轉(zhuǎn)入阻塞(blocked)狀態(tài),而執(zhí)行yield()方法后轉(zhuǎn)入就緒(ready)狀態(tài);
sleep() 方法聲明拋出 InterruptedException ,而yield()方法沒有聲明任何異常;
sleep()方法比yield()方法(跟操作系統(tǒng)CPU調(diào)度相關(guān))具有更好的可移植性。
Q10
說說你對(duì)同步和異步的理解。
如果系統(tǒng)中存在臨界資源(資源數(shù)量少于競(jìng)爭(zhēng)資源的線程數(shù)量的資源),例如正在寫的數(shù)據(jù)以后可能被另一個(gè)線程讀到,或者正在讀的數(shù)據(jù)可能已經(jīng)被另一個(gè)線程寫過了,那么這些數(shù)據(jù)就必須進(jìn)行同步存取(數(shù)據(jù)庫操作中的排他鎖就是最好的例子)。
當(dāng)應(yīng)用程序在對(duì)象上調(diào)用了一個(gè)需要花費(fèi)很長(zhǎng)時(shí)間來執(zhí)行的方法,并且不希望讓程序等待方法的返回時(shí),就應(yīng)該使用異步編程,在很多情況下采用異步途徑往往更有效率。事實(shí)上,所謂的同步就是指阻塞式操作,而異步就是非阻塞式操作。
高級(jí)篇
Q1
轉(zhuǎn)發(fā) (forward) 和重定向 (redirect) 的區(qū)別?
forward是容器中控制權(quán)的轉(zhuǎn)向,是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL 的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的。
所以它的地址欄中還是原來的地址redirect就是服務(wù)器端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址,因此從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址,很明顯redirect無法訪問到服務(wù)器保護(hù)起來資源,但是可以從一個(gè)網(wǎng)站redirect到其他網(wǎng)站。
Q2
說一說spring 中依賴注入和AOP的實(shí)現(xiàn)機(jī)制。
實(shí)現(xiàn)依賴注入的方式包括:構(gòu)造器注入、設(shè)值注入和接口(回調(diào))注入。Spring中可以通過設(shè)值注入(setter方法注入)和構(gòu)造器注入實(shí)現(xiàn)IoC,推薦使用的方式為設(shè)值注入。
實(shí)現(xiàn)AOP的方式包括:編譯時(shí)AOP(需要特殊的編譯器)、運(yùn)行時(shí)AOP(代理模式)、加載時(shí)AOP(需要特殊的類加載器)。
Spring中使用了運(yùn)行時(shí)的AOP,主要通過代理的方式對(duì)原來的代碼進(jìn)行增強(qiáng)實(shí)現(xiàn)。對(duì)于實(shí)現(xiàn)了接口的類,Spring通過Java的動(dòng)態(tài)代理(請(qǐng)參考Proxy類和InvocationHandler接口)來進(jìn)行增強(qiáng);對(duì)于沒有實(shí)現(xiàn)接口的類,Spring使用第三方字節(jié)碼生成工具CGLIB,通過繼承的方式對(duì)原有代碼進(jìn)行增強(qiáng)。
Q3
什么是ORM?
對(duì)象關(guān)系映射(Object-Relational Mapping,簡(jiǎn)稱ORM)是一種為了解決程序的面向?qū)ο竽P团c數(shù)據(jù)庫的關(guān)系模型互不匹配問題的技術(shù);
簡(jiǎn)單的說,ORM是通過使用描述對(duì)象和數(shù)據(jù)庫之間映射的元數(shù)據(jù)(在Java中可以用XML或者是注解),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中或者將關(guān)系數(shù)據(jù)庫表中的行轉(zhuǎn)換成Java對(duì)象,其本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。
Q4
簡(jiǎn)述一下面向?qū)ο蟮?#34;六原則一法則"。
單一職責(zé)原則:一個(gè)類只做它該做的事情。其核心就是我們常說的"高內(nèi)聚",寫代碼最終極的原則只有六個(gè)字"高內(nèi)聚、低耦合",就像葵花寶典的八字中心思想一樣"欲練此功必先自宮"一樣重要。
開閉原則:軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。
要做到開閉有兩個(gè)要點(diǎn):抽象是關(guān)鍵,一個(gè)系統(tǒng)中如果沒有抽象類或接口系統(tǒng)就沒有擴(kuò)展點(diǎn);封裝可變性,將系統(tǒng)中的各種可變因素封裝到一個(gè)繼承結(jié)構(gòu)中。
依賴倒轉(zhuǎn)原則:面向接口編程,就是聲明方法的參數(shù)類型、方法的返回類型、變量的引用類型時(shí),盡可能使用抽象類型而不用具體類型,因?yàn)槌橄箢愋涂梢员凰娜魏我粋€(gè)子類型所替代
里氏替換原則:任何時(shí)候都可以用子類型替換掉父類型接口。
隔離原則:接口要小而專,絕不能大而全。接口也應(yīng)該是高度內(nèi)聚的。Java中的接口代表能力、代表約定、代表角色,能否正確的使用接口一定是編程水平高低的重要標(biāo)識(shí)。
聚合復(fù)用原則:優(yōu)先使用聚合或合成關(guān)系復(fù)用代碼。
迪米特法則:迪米特法則又叫最少知識(shí)原則,一個(gè)對(duì)象應(yīng)當(dāng)對(duì)其他對(duì)象有盡可能少的了解。
今天的文章就分享到這里啦,喜歡編程的小伙伴可以關(guān)注我哦!有學(xué)習(xí)方面的問題可以私信回復(fù):學(xué)習(xí)!
總結(jié)
以上是生活随笔為你收集整理的java葵花宝典_JAVA程序员想入职跳槽,这些基本功一定要做好,你给自己打几分?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: none是不是python的保留字_Py
- 下一篇: C# 子类实例化基类 基类使用不了子类的