1. 程式人生 > >Java面試之前複習總結(一)

Java面試之前複習總結(一)


1、String類都有那些常用的方法。
  • length(); split(); replace();
  • equals(); subString(); charAt();
  • concat(); 大小寫轉換; indexOf();
  • trim(); isEmpty(); contains();
  • startWith()
補充:Object類方法
  • clone、 equals finalize getClass
  • hashCode notify notifyAll toString
  • wait
補充:異常分類
  • 算數異常 型別轉換異常 非法引數異常
  • 下標越界異常 空指標異常 安全性檢查異常
2、StringBuilder和StringBuffer區別
  • 根本區別就是StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的。
  • 速度,StringBuilder > StringBuffer > String
  • String是不可變的,其他兩個是可變的
  • 按照效能排序 String(大姐,jdk1.0) < StringBuffer(二姐,jdk1.0) <StringBuilder(小妹,jdk1.5).
  • StringBuffer很多方法都被synchronized修飾了,而StringBuilder沒有,所以StringBuilder速度比StringBuffer快。建議用StringBuilder。
  • JVM執行程式主要時間都是浪費在建立物件和回收物件上。
  • eg:String s = “this is”+“only”“simple test”;等同於 String s = “this is only simple test”。
3、Map和List的遍歷區別 List:增強的for迴圈(最差)、for(int i=0;i<list.length;i++) 、Interator List:對越arrayList、Vector遍歷應該採用隨機訪問get LinkedList:採用迭代器 關於Map<K,V>能不能儲存null情況
key value
TreeMap 不允許 允許 執行緒不安全
HashMap 允許 允許 執行緒不安全
關於Map遍歷的entrySet和keySet 推薦使用entrySet,說明,keySet其實是遍歷了兩次,一次轉化為Iterator物件,另一次是從HashMap中取出key所對應的value,而entrySet只遍歷了一次就把他key和value全部都存到entry中了,效率更高。 Set代表無序,不重複,Map代表key-value組成的集合,Map的key要求是不能重複,沒有順序,把Map的所有key組合起來就是Set。 4、陣列與List區別 ArrayList的底層實現還是陣列,索引速度快。 LinkedList:是基於連結串列。 對於隨機訪問,get set ArrayList優秀。 對於新增和刪除,LinkedList優秀 5、Set和List區別 根本:Set 無序,不重複。 List:有序,元素可重複 Java遍歷List 第一種:   
  1. for(Iterator<A> it = list.iterator(); it.hasNext();) {     
  2.     ......  
  3. }  
這種方式在迴圈執行過程中會進行資料鎖定,    效能稍差,    同時,如果你想在迴圈過程中去掉某個元素,只能呼叫it.remove方法, 不能使用list.remove方法,  否則一定出併發訪問的錯誤.    第二種:
  1. for(A a : list) {  
  2.     ......  
  3. }  
它內部還是呼叫第一種,    換湯不換藥,    這種迴圈方式還有其他限制,    不建議使用它    第三種:   
  1. for(int i = 0; i < list.size(); i++) {  
  2.     A a = list.get(i);  
  3.     ......  
  4. }  
它內部不做鎖定,    效率最高,    但是當寫多執行緒時要考慮併發操作的問題!   注:TreeMap和HashMap,Hash底層採用陣列來儲存key和value 6、垃圾回收 System.gc(); Runtime.gc() 也就是 Runtime.getRuntime().gc(); 7、反射機制 在Java執行環境中獲取類的屬性和方法,呼叫物件的任意一個方法,這種動態獲取類的資訊,以及動態動態呼叫物件的方法的功能,就叫做Java的反射機制。 8、Java的資料型別 補充:關於float與double精度丟失問題 float:有效位是7位。 double:有效位16位 9、Java類載入機制 10、棧和連結串列有什麼區別 棧:先進後出。 連結串列:隨便什麼地方都可以插入刪除 11、Map、HashMap、LinkedHashMap儲存結構以及實現原理 HashMap底層是用陣列實現的。 Map中包括一個內部類Entry,封裝了一個key-value LinkedHashMap採用雙向連結串列來維護元素關係,因為要維護元素順序,所以效能略低於HashMap。 12、short s1 =1, s1 = s1 + 1 有錯嗎,shrot s1 = 1 , s1 +=1有錯嗎。 對於第一種,由於1是int型,因此s1 + 1 運算是int型,需要強制型別轉化, 而第二種相當於 s1 = (short)(s1 + 1)其中隱含了強制型別轉化。 13、Integer 和int區別。 注意:就是涉及到自動裝箱。 Integer a1 = new Integer(3); Integer a2 = 3; System.out.println(a1 == a2); //false 如果a2是int型,就是true Integer a = 15; Integer b = 15; Integer c = 129; Integer d = 128; System.out.println(a == b); //true System.out.println(c ==d ); //false 注:如果整形字面的量值在-128 ~128之間,那麼不new物件,而是引用常量池中的Integer物件。 訪問控制符 類成員:private、default、protected、public 修飾類:public、final、abstract 修飾方法:public、預設、protected、private、|static、find、abstract 修飾變數:public、預設、protected、private、|static、find
型別 private protected public
同一類
同一包中子類
同一包非子類
不同包子類
不同包非子類
14、HashMap採用拉鍊法解決衝突(鏈地址法)
  • HashMap有兩個引數影響效能,初始容量和載入因子(裝填因子)。
  • 連結串列法就是將相同hash值的物件組織成一個連結串列放在hash值對應的槽位中。
  • 開放地址法是通過一個探測演算法,當某個槽位已經被佔據的情況下繼續尋找下一個可以使用的槽位,很顯然,HashMap解決衝突的方法是拉鍊法,也叫鏈地址法。
15、關於Java預設匯入的包。
  • Java.lang,包含如下
  • Object:是所有類的父類。
  • 基礎型別包裝類
  • 數學類
  • String和StringBuilder
  • 系統和執行時類:System.in 和out 是標準的輸入類和輸出類,System所有成員變數和方法都是靜態的。
16、關於==和equals ==可用於基本型別和引用型別的比較,採用Integer比較,只要new,就不同。Integer.valueOf()和Integer a = 53,等價。切記Intger.valueOf()的原始碼,大於127都要new。 17、Java語言中陣列複製的方法. System.arrayCopy() > clone > Arrays.copyOf -> for迴圈賦值。(按效能排序)。 關於clone方法:Java.lang.Object類的clone()方法,為protected型別,不可直接呼叫,需要先對要克隆的物件進行下列操作,首先被克隆的類應該實現Cloneable介面,然後在該類中覆蓋clone方法,並且在該類中呼叫super.clone()方法。 複製引用和賦值物件的區別。 複製引用:是指將某個物件的地址複製,所以複製後的物件副本的地址和源物件相同,這樣,當改變副本的某個值後,源物件值也被改變; 複製物件:是將源物件整個複製,物件副本和源物件的地址並不相同,當改變副本的某個值後,源物件值不會改變;
  1. Cat cat1=new Cat("xiaohua",3);//源物件
  2.         System.out.println("源物件地址"+cat1);  
  3. //呼叫clone方法,複製物件
  4.         Cat cat2=(Cat)cat1.clone();  
  5.         Cat cat3=(Cat)cat1;//複製引用
  6.         System.out.println("複製物件地址:"+cat2);  
  7.         System.out.println("複製引用地址:"+cat3);
可以看出,複製引用的物件和源物件地址相同,複製物件和源物件地址不同 18、關於靜態程式碼塊,程式碼塊,構造方法的執行順序. 父類靜態程式碼塊-》子類靜態程式碼塊-》父類構造程式碼塊-》父類建構函式-》子類構造程式碼塊-》子類建構函式。 注意:構造程式碼塊和建構函式一起執行。 先執行靜態初始化快,普通初始化快和午餐的建構函式一起i執行。 19、&& 和& &&短路,如果&&左邊位false,直接短路掉 &非短路。 20、return、break、和continue
  • return:直接退出迴圈
  • break:跳出本層迴圈
  • continue:跳過本次迴圈
補充:break只能用在迴圈語句中,while,do....while或者for 或者switch中 21、Math.round(11.5等於多少) 12.round其實就是四捨五入 注:關於四捨五入的方法 //第一種方法,使用DecimalFormat來格式化數字。 String ss = new DecimalFormat("#.000").format(s); System.out.println("DecimalFormat四捨五入: "+ ss); //第二種方式,使用String.format System.out.println("使用String.format:" + String.format("%.3f", s)); //第三種方式,使用技巧round 這種方式存在問題 System.out.println("使用技巧round:" + Math.round(s*1000)*0.001d); //錯誤System.out.println("使用技巧round:" + Math.round(s*1000*0.001d)); //第四種方式 BigDecimal big = new BigDecimal(s); double d = big.setScale(3, BigDecimal.ROUND_HALF_EVEN).doubleValue(); System.out.println("第四種方式獲取:" + d); System.out.println(big.setScale(3, BigDecimal.ROUND_HALF_UP)); 22、switch是否作用於byte上,是否作用long,是否String
  • Java5之前,switch(expr)。expr只能是byte,short,int,char
  • Java5之後,enum,
  • Java7,String
  • long,目前還不支援
23、陣列有沒有length()方法,String有沒有length屬性? 陣列有length屬性,String有length方法。 24、構造器不能被繼承,所以不能被重寫,但課過載, 25、為什麼不能通過返回值型別區分過載 例如 int f(),void f(),在方法呼叫時可以省略型別f(),這時系統怎麼處理?會找不到,會迷糊,所以,通過返回值區分過載行不通。 26、String s = new String("xyz"),建立了幾個物件。 建立了兩個物件,一個是靜態區的。 27、Java中的final關鍵字有那些用法,
  • 修飾類,表示該類不能被繼承。
  • 修飾方法
  • 修飾變數
28、關於字元編碼轉換,就是利用String的構造方法和普通方法。 String a = "你好"; String b = new String(a.getBytes("gb2312"),"ISO-8859-1"); System.out.println(b); String c = new String(a,"gbk").getBytes("utf-8");//第二種 29、TreeMap和TreeSet在排序時,如何比較元素,Collection中的sort()方法如何比較元素, TreeSet要求所有存放物件必須實現Comparable介面,該介面提供compareTo()方法, TreeMap要求存放的鍵值對對映的建必須實現Compareable介面,從而根據建進行排序。 Collection.sort()有兩種排序方式:
  • 傳入的物件實現了Comparable
  • 不強制要求傳入元素必須課比較,但如要傳入第二個引數,引數時實現Comparable介面的子型別,相關於臨時定義了一個排序規則。
關於comparable(java.lang)和compartor(java.util)
  • list列表中所有元素必須實現Comparable介面,實現Comparable需要重寫comparTo方法。
  • 使用Comparable有很大侷限性,實現此介面只能按compareTo(T t)定義的方法。
  • 一個類的兌現更要實現多種排序方式,可以為該介面定義不同的比較器,實現comparator介面
補充:執行緒和程序的區別 進行是執行著的應用程式,而執行緒是程序內部的一個執行序列,一個程序可以又多個執行緒, 執行緒同步: 使用lock與使用同步方法有點類似,只是使用lock時顯示使用lock物件作為同步鎖,而使用同步方式時系統隱世使用當前物件作為同步監視器。而使用lock物件時,每個lock物件對應一個Account物件,一樣可以保證對於同一個Account物件,同一時間只能又一個執行緒進入臨界區。 30、關於Thread類的sleep方法和物件(Object)的wait方法。 Thread.sleep() Object.wait()
  • 呼叫了sleep時執行緒類休眠的靜態方法,呼叫此方法會讓當前執行緒暫停執行指定事件,將執行機會(CPU)讓給其他執行緒,但物件的鎖依然保持,因此休眠結束後自動恢復。
  • wait是Object的方法,呼叫wait方法導致當前執行緒放棄物件所進入執行緒池,只有呼叫物件的notify()方法,才能被重新喚醒。
31、建立執行緒的三種方法。
  • 繼承Thread
  • 實現Runnable
  • 使用Callable和FUTURE(2、3實現方式相同,所以歸結到一類)
推薦採用實現Runnable介面,Callable介面來建立執行緒,因為如果是繼承,就浪費了一次繼承的機會,導致無法再繼承其他的類,而介面不一樣。 32、狀態 執行緒是進行內的併發,沒有自己的記憶體空間,共享程序的。 執行緒的四種狀態:就緒,執行,掛起。結束 join:等待另一個執行緒完成 Sleep()之後執行緒進入阻塞狀態,然後進入就緒狀態, wait()之後執行緒進入等待佇列,等待喚醒進入就緒狀態。 yield執行後執行緒進入就緒狀態(直接進入就緒狀態,不進入阻塞) join執行後執行緒進入阻塞狀態
sleep與yield
  • sleep()方法暫停後,會給其他執行緒機會,不會理會優先順序,
  • sleep()方法會將執行緒轉入阻塞狀態,然後進入就緒狀態,而yield()不會將執行緒轉入阻塞,只是i強制當前程序進入就緒,因此完全有可能某個執行緒呼叫yield()方法暫停後,立即再次獲得處理器資源執行
  • sleep()方法丟擲一個InterruptedExecption異常。
  • sleep(0放比yield()方法具有更好的一致性,通常不建議使用yield()方法來控制併發執行緒執行。
執行緒相關: 1、關鍵字synchronized 、static、abstract、final
  • synchronized:用於方法或程式碼塊前,使此方法或者程式碼塊程式設計同步的。
  • static:用於宣告靜態變數,static關鍵字可以修飾變數,方法,靜態程式碼塊
                          靜態變數:                                           由static修飾的變數稱為靜態變數                                           靜態變數屬於類,而不屬於某個物件                                           靜態變數它的副本只有一個(靜態變數在類中只加載一)                          靜態方法:                                           在靜態方法中只能呼叫靜態變數和靜態方法                                           在非靜態方法中,可以呼叫靜態方法或者變數。                                           在靜態方法中不能使用this和super關鍵字。                         靜態程式碼塊                                           作用:用來給靜態成員變數初始化
  • abstract:用於定義抽象類或者方法
  • final:用於宣告常量,即只能賦一次值
  • volatile:用來確保將變數的跟新操作通知到其他執行緒,當把變數宣告為volatile型別後,編譯器與執行時都會注意到這個變數是共享的,因此不會將該變數上的操作與其他記憶體操作一起重排序。然而,在訪問volatile變數時不會執行加鎖操作,因此也就不會使執行執行緒阻塞,因此volatile變數是一種比 synchronized關鍵字更輕量級的同步機制。
  • serialize:Java 物件序列化為二進位制檔案
33、Java中如何實現序列化以及實現序列化的意義。 實現Serializable介面 意義:可以將硫化後的物件進行讀寫操作,也可用於網路之間物件傳輸,序列化是為了解決物件流讀寫坐坐時引發的問題。 34、xml文件有幾種形式?本質?解析。 兩種:dtd schema schema本身也是一個xml檔案,可以被xml解析,約束能力大於dtd 解析xml有兩種: dom:使用dom要預先載入整個檔案適合隨機訪問,(空間換時間) SAX:是事件驅動型,適合對xml順序訪問。 35、簡述JDBC
  1. 載入驅動,Class.forName("com.mysql.jdbc.");
  2. 建立連結,Connention conn = DriverManager.getConnection("")
  3. 建立語句:PrepareStatement ps = conn.prepareStatement("");
  4. 執行語句:ResultSet rs = ps.executeQuery()
  5. 處理結果
  6. 關閉資源
36、事務的ACID:原子性,一致性,隔離性,永續性 髒讀:A事務讀取B事務尚未提交的資料,並再次基礎上操作,而B事務執行回滾,那麼A事務讀到的資料就是髒資料。 不可重複讀:A事務重新讀取前面讀取過的資料,發現該資料已經被另一個已提交的事務B修改了。 幻讀: 37、獲取一個物件
  1. A.class()
  2. a.getClass()
  3. Class.forName()
38、Arrays.toString(int[]),Arrays工具類的頭String方法。 首先檢查是否為空,如果為空就return "[]",否則,StringBuilder,先append一個"[",然後迴圈,append一個數,if 到結尾 return appent ”]“,否則append(",") 39、類變數是指用satic修飾的屬性, 40、在子類構造方法中使用super(),顯示呼叫父類的構造方法,super()必須解除安裝子類構造方法第一行,否則不通過。 41、Java是一次編寫多出執行,c++是一次編寫多處編譯 42、新生代,老年代,持久代 43、LinkedList實現了List,而不是繼承,AbstractSet實現了Set 44、StringBuilder通過呼叫toString()方法轉換為String型。 45、override重寫,overloadding過載。 重寫是子類重新定義了父類的方法,重寫必有相同的方法名,引數列表和返回值型別。 過載是發生在同一個類裡面的兩個或多個方法名相同,但引數不同的情況 46、什麼是java虛擬機器,為什麼java被稱為平臺無關語言, Java虛擬機器是一個可執行Java位元組碼的虛擬機器程序,Java原始檔被編譯成能被Java虛擬機器執行的位元組碼檔案。 47、關於抽象類和介面,區別和共同點。
  1. 介面中的方法都是抽象的,而抽象類則可以同時包含抽象和非抽象方法。
  2. 類可以實現多個介面,但只能繼承一個抽象類。
  3. 類可以不實現抽象類和介面中宣告的方法,當然在這種情況下類也必須是抽象的。
  4. 抽象類可以在比提供介面實現的情況下實現介面。
  5. 介面中宣告的變數預設都是final的,抽象類可以包含非final的
  6. 介面中的成員函式預設都是public的,抽象類的成員函式可以是private、protected或者public
  7. 介面是絕對抽象的,不可以被例項化,抽象類也是不可以被例項化的
48、Iterator,ListIterator Iterator可以遍歷set和list集合,但是ListInterator只能用來遍歷List Itertator只能向前遍歷,ListIterator既可以向前也可以向後, ListIterator實現了Iterator介面。 49、快速失敗和安全失敗的區別是什麼 Java.util都是快速失敗, Java.util.conncurrent包瞎所有類都是安全失敗的。 快速失敗會丟擲ConncurrentModificationException異常,而安全失敗永遠不會丟擲這樣的異常。 50、Java中HashMap的工作原理。 Java中HashMap以鍵值對形式儲存元素,HashMap需要一個hash函式,它使用hashCode()和equals()方法向集合新增元素,當呼叫put()方法時,HashMap會計算key的hash值。 HashMap的一些重要的特性是它的容量、負載因子和擴容極限。 51、陣列和列表(Array和ArrayList)
  • Array可以包括基本資料型別和物件,ArrayList只能包含物件。
  • Array是固定大小的,ArrayList的大小是動態變化的。
  • ArrayList提供了更多的方法和特性。
53、截止jdk1.8,java併發啊框架支援鎖
  • 讀寫鎖
  • 自族鎖
  • 樂觀鎖
54、java偵錯程式jdb.exp 55、得到class的三種方法,以Person為例
  • person.getClass
  • Person.class
  • Class.forName("")
56、解釋JDBC中的角色 JDBC驅動提供了特定廠商對JDBC API介面類的實現,驅動必須提供java.sql包下這些類實現,connection,Statement,PreparedStatement、CallableStatement、ResultSet和Driver 57、Java資料庫連結JDBC用到哪種設計模式 橋接模式 58、I/0用到了裝飾器模式 59、關於java魯棒性(健壯性)體現
  • Java中不採用指標訪問記憶體單元
  • 無用記憶體自動回收機制(垃圾回收機制)
60、關於float與double精度丟失問題 float:有效位是7位。 double:有效位16位 61、產生一個隨機數的兩種方式(Math.random和Random) (1)int a = (int) (Math.random()*100); System.out.println(a);