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接口
附:compartor與comparable區別:comparator接口與Comparable接口的區別
補充:線程和進程的區別
進行是執行着的應用程序,而線程是進程內部的一個執行序列,一個進程可以又多個線程,
線程同步:
使用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的一些重要的特性是它的容量、負載因子和擴容極限。
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM