時間,就是這么很悄悄的溜走了將近兩個年華,不知不覺的,研二了,作為一個一般學校的研究生,不知道該說自己是不學無術,還是說有過努力,反正,這兩年里,有過堅持,有過墮落,這不,突然間,有種開竅的急迫感,尋思着找些實習,充實下生活,也是為了將來而備戰,目標定位在杭州,然而,杭州的Java實習並不多,大大小小投了十來個企業單位,面來面去,回答的基本上也算差強人意,今日得一閑暇,就最近被問到的一些問題一一羅列,繼續努力吧!:
1、說出Object類的常用方法?
答:這個問題,對於Java開發有經驗的人來說,應該不難,至少也得說出5/6個方法的樣子,然而,很顯然,大部分在校生,並不知情,這個問題是上個學期年底面試百度的時候被問到的,當時有點懵逼,只說出了equals()方法、toString()方法,后來被面試官果真狠狠的指教了一番,於是很自然的印象深刻,估計着,以后的面試里是肯定不會忘記咯,其實要回答這個問題,只要我們能想到線程通信的方法,那就基本上沒問題了,要知道線程之間進行通信那里可是有着三個方法呢,加上這里兩個不就5個了嘛,完完全全的可以搞定面試官了,這三個方法就是:wait()、notify()、notifyAll()!哈哈,好了,廢話不多說,總結答案如下:
protected Object clone()//創建並返回此對象的一個副本。 boolean equals(Object obj)//指示其他某個對象是否與此對象“相等”。 String toString()//返回該對象的字符串表示。 void wait()//在其他線程調用此對象的 notify() 方法或 notifyAll() //方法前,導致當前線程等待。 void notify()//喚醒在此對象監視器上等待的單個線程。 void notifyAll()//喚醒在此對象監視器上等待的所有線程。 int hashCode()//返回該對象的哈希碼值。 Class<> getClass()//返回此 Object 的運行時類。 protected void finalize()//當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
這里每個方法用來做什么的,務必要搞清楚,比如說如果面試官讓你對一個非基本數據類型的對象進行復制,但不能影響到原對象,這里我們要學會使用clone()方法,如此等等。。。
2、說出一些常用的類,包,接口,常見的runtime exception,請各舉5個。
答:此問題依舊是被百度面試官所提出,當時覺着就是小菜一碟,然而回答的時候,腦子確實突然短路了,平時寫代碼導入了那么多包,用過那么多類,媽蛋,一要說出口的時候才發現,真正是胸有溝壑萬千,卻不知道從何說起!於是稀里糊塗的道出常用的類有String類、StringBuffer類、Integer類,嗯當時是就說了這幾個腦子就短路了,甚至還傻傻的怯怯的反問了面試官一句,這些算常用的類嗎?記得,當時面試官沒說啥,很自然的一笑了之,現在想想覺得也是逗了!接下來,我接着發揮,常用的包的話,java.lang、java.util、java.io、java.awt、java.sql,正待我說的興致正濃時,面試官打斷,說說常用的接口,瞬間懵逼,接口,幸虧瞬間想到集合框架,於是立馬答道Map,List,本來想說Set的,后來想想打住了,但無奈想不起別的了,於是如實說,暫時就想起這些了,常見的異常,我直接說,數組越界、除0異常,數據庫異常,面試官打斷,用java,於是老老實實的冥思苦想,卻發現啥都想不起來了,憋了半天總算憋出了一個NullPointException異常,緊張啊!回來后,立馬總結語句:
常用的類:BufferedReader、BufferedWriter、FileReader、FileWirter、String、Integer 、StringBuffer、Stack
常用的包:java.lang、java.awt、java.io、java.util、java.sql、javax.xml、java.NET
常用的接口: List、Map、Document、NodeList、Remote
常見的異常:ArithmeticException (a=5/0即數學運算中除0異常)ClassCastException (強制轉換異常)NullPointerException(空指針異常,使用Null時)ArrayIndexOutofBoundsException(數組越界)StringIndexOutBoundsException(指示索引或者為負或者超出字符串大小)IndexOutOfBoundsException(下標越界)NegativeArraySizeException(創建大小為負的數組)IllegalArgumentException(傳遞非法參數)SecurityException(安全異常)NumberFormatException(數據格式異常,字符串->數字)FileNotFoundException(文件未找到異常)SQLException(操作數據庫異常)IOException(I/O輸入輸出異常)
3、說說你常用的數據結構?
答:何為數據結構?是說算法嘛,心里在想,在想,想說又不敢說(第一次面試,沒有准備的面試,面的還是百度,別提有多緊張了),面試官見我是半天沒坑出一句話,於是提醒了下,你平時用過集合框架沒,額,瞬間醒悟,原來問的這個,於是滔滔不絕,將自己從某寶典中的記憶全部吸納而出,總體上回答的還算不差(自我感覺,面試官也沒刁難在這里),第二次在EMC再次被問到這個問題的時候,還算照着某寶典行雲流水,然而,想象總是那么美好,期間,面試官,巧問了一句,你說HashMap和Hashtable之間一個是安全一個是不安全也就是線程同步和不同步,那么這個線程安全問題指的是什么?你能不能舉個例子出來,其實這個問題並不難,難就難在我當時正沉浸在某寶典之中,根本想不到會有這么一問,所以稀里糊塗的回答了些,很顯然,雖然回答的八九不離十,但面試官能從我臉上讀出我說話的沒底氣!接下來總結下集合框架面試的大體如下:
首先我們要說的應該是對集合框架的理解,也可以當着面試官寫下自己認為的集合框架結構圖或者簡圖之類的,這里的具體的話,自己發揮!
1、其次說說Collection和Collections,Collection是集合類的上級接口,即是java.util下所有集合類的父接口,繼承於他的接口主要有List和Set;Collections是針對集合類的一個工具類,提供了一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。
2、List和Set是繼承自Collection接口,而Map並不是繼承自Collection接口;Set里的元素是不能重復的,可以用iterator()方法來區分重復與否!equals()是判讀兩個set是否相等, equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。
3、Collection框架中實現比較要實現comparable/comparator接口。
4、ArrayList和Vector的區別:
共同點:這兩個類都實現了List接口(List接口繼承了Collection接口),他們都是有序集合,即存儲在這兩個集合中的元素的位置都是有順序的,相當於一種動態的數組,我們以后可以按位置索引號取出某個元素,並且其中的數據是允許重復的,這是與HashSet之類的集合的最大不同處,HashSet之類的集合不可以按索引號去檢索其中的元素,也不允許有重復的元素。
接着說ArrayList與Vector的區別,這主要包括兩個方面:.
同步性:Vector是線程安全的,也就是說是它的方法之間是線程同步的,而ArrayList是線程序不安全的,它的方法之間是線程不同步的。如果只有一個線程會訪問到集合,那最好是使用ArrayList,因為它不考慮線程安全,效率會高些;如果有多個線程會訪問到集合,那最好是使用Vector,因為不需要我們自己再去考慮和編寫線程安全的代碼。
注意:這里談到線程安全,同步問題,面試官少不了會多嘴說一句,讓你講講線程安全是咋回事,如果不考慮,你聽到這個問題估計會是一臉懵逼,我當初就是這樣子的!所以這里我補充下線程安全的問題: java中的線程安全就是線程同步的意思,就是當一個程序對一個線程安全的方法或者變量進行訪問的時候,其他的程序不能再對他進行操作了,必須等到這次訪問結束以后才能對這個線程安全的方法進行訪問,否則將會造成錯誤發生;線程安全就是說,如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。 線程安全問題都是由全局變量及靜態變量引起的,定義在方法內部的局部私有變量是沒有線程安全與否一說的。
備注:對於Vector&ArrayList、Hashtable&HashMap,要記住線程安全的問題,記住Vector與Hashtable是舊的,是java一誕生就提供了的,它們是線程安全的,ArrayList與HashMap是java2時才提供的,它們是線程不安全的。所以,我們講課時先講老的。
數據增長:ArrayList與Vector都有一個初始的容量大小,當存儲進它們里面的元素的個數超過了容量時,就需要增加ArrayList與Vector的存儲空間,每次要增加存儲空間時,不是只增加一個存儲單元,而是增加多個存儲單元,每次增加的存儲單元的個數在內存空間利用與程序效率之間要取得一定的平衡。Vector默認增長為原來兩倍,而ArrayList的增長策略在文檔中沒有明確規定(從源代碼看到的是增長為原來的1.5倍)。ArrayList與Vector都可以設置初始的空間大小,Vector還可以設置增長的空間大小,而ArrayList沒有提供設置增長空間的方法。
總結:即Vector增長原來的一倍,ArrayList增加原來的0.5倍。
5、ArrayList,Vector, LinkedList的存儲性能和特性:
ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。LinkedList也是線程不安全的,LinkedList提供了一些方法,使得LinkedList可以被當作堆棧和隊列來使用。
6、List和Map的區別:
一個是存儲單列數據的集合,另一個是存儲鍵和值這樣的雙列數據的集合,List中存儲的數據是有順序,並且允許重復;Map中存儲的數據是沒有順序的,其鍵(key)是不能重復的,它的值(value)是可以有重復的,存值采用 put(key,value)。Map中取值:value=m.get(key)(這個面試官常問,雖然不難,但也得注意)
7、HashMap和Hashtable的區別:
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。
一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現
二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value,即HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。
4、String 和StringBuffer的區別?
答:這個問題相對來說很容易,某寶典上有詳細的解說,問到的時候,只要按照某寶典上來發揮就行了!這個問題是杭州某家網絡公司問到的。。
String和StringBuffer類,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串,而這個StringBuffer類提供的字符串可以進行修改,所以當你知道字符數據要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態構造字符數據。
另外,String類實現了equals方法,new String(“abc”).equals(new String(“abc”)的結果為true,而StringBuffer沒有實現equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的結果為false。(String覆蓋了equals方法和hashCode方法,而StringBuffer沒有覆蓋equals方法和hashCode方法,所以,將StringBuffer對象存儲進Java集合類中時會出現問題。)
5、關於線程的一些問題?
答:面試官一開始問我熟悉線程嗎?我能怎么回答,總不能說不熟悉啊,多線程這玩意幾乎都是各大企業面試官屢問不爽的問題啊,好吧,一接通電話,面試官進行了簡單的自我介紹之后,無一例外的會問到關於線程的問題,所以多少准備些吧。
很典型的一個問題,你一般如何實現多線程,這個問題不用多說,很簡單,java提供了兩種方式,一個是繼承Thread類,另一個是實現Runnable接口,由於java不支持多繼承,所以在多繼承的時候,我們得優先選用 實現 Runnable接口,因為我們可以通過實現接口的辦法,間接的實現多繼承!
另外還有公司問到,線程之間是通過哪些方法進行通信,這個其實在上面說到Object類的常用方法的時候已經提到過了,主要是三個方法,wait()、notify()、notifyAll()方法,解釋的話就自己組織下就行咯,在這之前,有些HR會問你你通常如何啟動線程,顯而易見,start()方法!好吧,問到這里,其實線程問題也差不多了,不過有些面試官往往不知從何找話題,於是簡單的問道,線程的生命周期,嗯這個只要我們想到OS中的進程就行了,差不多的,創建、就緒、運行、阻塞、消亡!
OK,不,好像還有個問題被問到了,線程池,這個問題我完全不知道,查了百科,也就大致了解了下,所以大家自己看看,我就不組織語言了,最后自己覺得線程中還有一個比較重要的東西,一個就是 interrupt()方法,一個是currentThread()方法,具體情況大家自己查看java API文檔就好,我就不多解釋了!
6、說說你常用的數據庫?
答:每每問到這個問題,我總會一口氣說完,mysql、sql server、oracle,當然是按照使用熟練程度,所以面試官就往往會往這方面提問,之前由於一直沒接觸到數據庫存儲引擎的問題,所以在被問到你用MySQL時,一般用的是哪種存儲引擎(Engine)的時候,直接是一臉懵逼!我默默的問了句,什么是存儲引擎?好吧,面試官也算是無解,就說現在一般都是用的InnoDB存儲引擎吧。我只好在面完后,給自己做了下補充:MySQL常用存儲引擎:InnoDB和MyISAM,其中InnoDB適用頻繁維護的。修改 插入等的數據表,MyISAM適合少改寫 少插入的讀取頻繁的表,那么顯而易見,我們做開發的,肯定是InnoDB存儲引擎用的多了!
嗯,大家肯定在想,難道沒有面試官問你事務相關的嘛,No,幾乎每個面試官都會問,事務是什么東西,那么我們首先要了解到的是,事務是並發控制的單位,是用戶定義的一個操作序列,要么全做,要么不做,是一個不可分割的(通俗的理解,事務是一組原子操作單元,從數據庫角度說,就是一組SQL指令,要么全部執行成功,若因為某個原因其中一條指令執行有錯誤,則撤銷先前執行過的所有指令),主要是為了保證數據的完整性!好了,那么事務的特點呢,原子性、一致性、隔離性、持久性!(如果你想回答的更好那么把各個解釋下吧:事務的原子性表示事務執行過程中的任何失敗都將導致事務所做的任何修改失效。一致性表示當事務執行失敗時,所有被該事務影響的數據都應該恢復到事務執行前的狀態。隔離性表示在事務執行過程中對數據的修改,在事務提交之前對其他事務不可見。持久性表示已提交的數據在事務執行失敗時,數據的狀態都應該正確)那么說了那么多,為什么需要事務呢?之前就說過,為了保證數據的完整性,對的,事務就是為解決數據安全操作提出的,事務控制實際上就是控制數據的安全訪問。OK,那么我們就要知道Java事務的類型有三種:JDBC事務、JTA(Java Transaction API)事務、容器事務。好了,那么我們平時一般怎么處理事務呢?spring的事務是通過“聲明式事務”的方式對事務進行管理,即在配置文件中進行聲明,通過AOP將事務切面切入程序,最大的好處是大大減少了代碼量,提高了工作效率。
7、sql之left join、right join、inner join
答:說句實在話,自從辭職讀研以來很久沒有用過sql語句了,關於這幾個連接光靠記憶的話,完全會是懵逼,幸虧自己還不算蠢,很自然的根據字面理解,我很好的回答了出來,left join就是返回包括左表中所有記錄和右表中聯結字段相等的記錄,好了面試官會問你,那么如果A表中,有甲丙丁3條記錄,B表中有甲乙丙丁4條記錄,那么如果條件都滿足的情況,A left join B 丙記錄是否會被查出,答案是否定的!好了,right join就是和left join 相反的,inner join等值聯結 只返回2表中聯結字段相等的行!
8、sql優化
答:關於這個問題,我一直屬於茫然狀態,我不知道什么叫優化,不知道怎么樣才算優化,記得第一次被問到的時候是在EMC的時候,當時我記得學數據庫那會老師總會說盡量少的用的select *,盡量少用 distinct、group之類的命令,於是我就把這些說了上來,很顯然,這不是面試官要的結果!哈哈,我就接着扯到寫java代碼的時候,我依稀記得preparedStatement可以緩存sql語句,下一次執行相同語句不需要再次解析,於是我就答了去,但可惜還是不是面試老大要的結果,之后經提醒,才撥亂反正,意識到索引這玩意,對啊,索引(DB中的索引是某個表中一列或多列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針)啊,主鍵(聚集索引)啊:一方面,建立索引提高查詢速度;另一方面,把所有需提高查詢速度的字段都加入聚集索引。最后啊,在sql中,盡量多的使用commit!
最后,這幾天問的大概要代表性的問題都在這里吧,至於好多公司直接沒怎么問java知識,直接給我問項目經驗,一坨坨的論調,繼續嘛,還有公司問到了OSI七層模型,讓我把每層模型說出來,還有問我OS內存管理如何管理來的,這些我就不一一列舉了,今天回憶起這些問題,一個方面,自己做個總結,另一個方面,大家一起共勉。。。
2017年2月20日21:28:09總結 by小仇哥