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