爲了找到一份好的java工做,網上找來一份java面試題,對本身掌握的知識進行查缺補漏html
2015-8-20 beginjava
1.編寫程序,完成文件複製功能程序員
public static void copyFile(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!destFile.exists()){ throw new IllegalArgumentException(destFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); byte[] buf = new byte[8 * 1024]; int bytes = 0; while((bytes = in.read(buf , 0 , buf.length))!= -1){ out.write(buf,0,bytes); out.flush(); } out.close(); in.close(); } /* * 文件 */ public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!destFile.exists()){ throw new IllegalArgumentException(destFile+"不是文件"); } BufferedInputStream bis = new BufferedInputStream( new FileInputStream(srcFile)); BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(destFile)); int b; while((b = bis.read())!=-1){ bos.write(b); bos.flush(); } bis.close(); bos.close(); } /* * 單字節,不帶緩衝進行文件拷貝 */ public static void copyFileByByte(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!destFile.exists()){ throw new IllegalArgumentException(destFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); int b; while((b = in.read()) != -1){ out.write(b); out.flush(); } in.close(); out.close(); }
2.Servlet建立過程及生命週期Servlet 在容器中運行時,其實例的建立及銷燬等是由容器進行控制。web
建立方法有兩種:面試
1.客戶端請求對應的servlet,建立servletspring
2.根據web.xml中設置,建立。
1.建立servlet實例。sql
2.調用init方法對servlet初始化數組
3.根據客戶端http請求,調用doxxx()方法瀏覽器
4.調用servlet的destory()方法銷燬安全
3用sql語句分頁:
select Top 頁大小 from 表名 where id NOT IN ( select Top 頁大小 *(頁數) from 表名 order by id ) order by id
hibernate實現分頁更加方便
queryObject.setFirstResult((pageNo - 1) *pageSize); queryObject.setMaxResult(pageSize);
4.list.map.set的存儲特色?
list是有特定順序的排列,能夠有重複數值
set是無序的,不能夠有重複數值
map儲存方式爲key-value方式
網上的答案:
List 以特定次序來持有元素,可有重複元素.
Set 沒法擁有重複元素,內部排序.
Map 保存key-value值,value可多值
有關於儲存結構的另外問題:
1.arraylist和vector的區別?
同步性:arrayList線程是不安全的,不一樣步的,vector是線程是安全的,可是不一樣步。
數據增加:當數據增加時,vector按默認增加的一倍,而arrayList是原來的一半。
2.說出ArrayList,Vector, LinkedList的存儲性能和特性?
網上答案[暫未不理解]
ArrayList 採用的是數組形式來保存對象的,這種方式將對象放在連續的位置中,因此最大的缺點就是插入刪除時很是麻煩 LinkedList 採用的將對象存放在獨立的空間中,並且在每一個空間中還保存下一個連接的索引 可是缺點就是查找很是麻煩 要叢第一個索引開始
ArrayList和Vector都是用數組方式存儲數據,此數組元素數要大於實際的存儲空間以便進行元素增長和插入操做,他們都容許直接用序號索引元素,可是插入數據元素涉及到元素移動等內存操做,因此索引數據快而插入數據慢.
Vector使用了sychronized方法(線程安全),因此在性能上比ArrayList要差些.
LinkedList使用雙向鏈表方式存儲數據,按序號索引數據須要前向或後向遍歷數據,因此索引數據慢,是插入數據時只須要記錄先後項便可,因此插入的速度快.
知識補充:
(1)什麼是同步?
資料:http://blog.csdn.net/treeroot/article/details/254008
(2)爲何arraylist不一樣步?
ArrayList中:
public boolean add(Object o) {
...
}
vector中:
public synchronized void addElement(Object obj){
...
}
synchronized意思簡單說就是
lock();
add();
unlock();
(3)爲何要同步?
爲了防止多個線程對同一數據的修改,因此須要同步,不然會形成數據不一致。Java提供了很是方便的多線程支持,因此說同步問題比較廣泛,尤爲是Servlet和
JSP的線程安全問題特別明顯。
(4)arrayList跟linkedList插入刪除元素?
ArrayList底層的實現是數組,因此用下標訪問的速度比較快,可是插入和刪除元素,會有移動元素的開銷,因此速度比LinkedList差。LikedList底層是鏈表實現的,因此插入和刪除元素時間複雜度較LinkedList好,可是隨即訪問須要遍歷元素,因此效率比ArrayList差。
5.final,finally,finaliz的區別
網上答案:
final—修飾符(關鍵字)若是一個類被聲明爲final,意味着它不能再派生出新的子類,不能做爲父類被繼承。所以一個類不能既被聲明爲 abstract的,又被聲 明爲final的。將變量或方法聲明爲final,能夠保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在之後的引用中只能讀取,不可修改 被聲明爲final的方法也一樣只能使用,不能重載。
finally—再異常處理時提供 finally 塊來執行任何清除操做。若是拋出一個異常 ,那麼相匹配的 catch 子句就會執行,而後控制就會進入 finally 塊(若是有的話)。
finalize—方法名。Java 技術容許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去以前作必要的清理工做。這個方法是由垃圾收集器在肯定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,所以全部的類都繼承了它。子類覆蓋 ;finalize() 方法以整理系統資源或者執行其餘清理工做 finalize() 方法是在垃圾收集器刪除對象以前對這個對象調用的。
----2015-8-20--end
----2015-8-21-begin
1.HASHMAP,HASHTABLE區別
HashMap是Map接口的實現類,在缺省的狀況下是非同步的
Hashtable是dictionary的子類,是同步的
HashMap中,null能夠做爲鍵,這樣的鍵只有一個;能夠有一個或多個鍵所對應的值爲null。【這句話理解起來有點怪怪的】
詳細說明:第一點:Hashtable是基於陳舊的dictionary類的,而HashMap是java 1.2引進的Map接口的一個實現,
即HashMap去掉了Hashtable的一些方法,如:contains方法,相應的加上了containsValue()和containsKey()方法。
第二點:Mashtable是同步的,而HashMap的方法不是。也就是說你必須腰圍HashMap提供一個同步,一個方便的方式就是利用Contional類的靜態的synchronizedMap()方法,他建立一個線程安全的Map對象,並把他做爲一個封裝的對象來返回。
第三點:HashMap可讓你將空值做爲一個表的條目的key或value。HashMap中只有一條記錄能夠是一個空的key,但任意數量的條目能夠是空的value。
具體HashMap的實現原理:http://blog.csdn.net/vking_wang/article/details/14166593
2.描述Cookie和Session的做用,區別和各自的應用範圍,Session工做原理
Session用於保存每一個用戶的專用信息. 每一個客戶端用戶訪問時,服務器都爲每一個用戶分配一個惟一的會話ID(Session ID) . 她的生存期是用戶持續請求時間再加上一段時間(通常是20分鐘左右).Session中的信息保存在Web服務器內容中,保存的數據量可大可小.當 Session超時或被關閉時將自動釋放保存的數據信息.因爲用戶中止使用應用程序後它仍然在內存中保持一段時間,所以使用Session對象使保存用戶數據的方法效率很低.對於小量的數據,使用Session對象保存仍是一個不錯的選擇
Cookie 用於保存客戶瀏覽器請求服務器頁面的請求信息,程序員也能夠用它存放非敏感性的用戶信息,信息保存的時間能夠根據須要設置.若是沒有設置Cookie失效日期,它們僅保存到關閉瀏覽器程序爲止.若是將Cookie對象的Expires屬性設置爲Minvalue,則表示Cookie永遠不會過時.Cookie存儲的數據量很受限制,大多數瀏覽器支持最大容量爲4K,所以不要用來保存數據集及其餘大量數據.因爲並不是全部的瀏覽器都支持Cookie,而且數據信息是以明文文本的形式保存在客戶端的計算機中,所以最好不要保存敏感的,未加密的數據,不然會影響網站的安全性
session工做原理
(1)當有Session啓動時,服務器生成一個惟一值,稱爲Session ID(好像是經過取進程ID的方式取得的)。
(2)而後,服務器開闢一塊內存,對應於該Session ID。
(3)服務器再將該Session ID寫入瀏覽器的cookie。
(4)服務器內有一進程,監視全部Session的活動情況,若是有Session超時或是主動關閉,服務器就釋放改內存塊。
(5)當瀏覽器連入IIS時並請求的ASP內用到Session時,IIS就讀瀏覽器Cookie中的Session ID。
(6)而後,服務檢查該Session ID所對應的內存是否有效。
(7)若是有效,就讀出內存中的值。
(8)若是無效,就創建新的Session。
3.String和stringbuffer進行字符串鏈接時的區別?
String對項內容是不可改變,StringBuffer是能夠改變的,且高效;具體能夠查看:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html
4.J2EE J是什麼意思? 2是什麼意思 EE是什麼意思? Struts的攔截器你是怎麼作的,是獨立開發的,可以獨立開發的到。而後問有哪幾種攔截? 簡單介紹下java?Spring的AOP,IOC的講述 對struts2的瞭解,1,2的比較 xml的瞭解 J2ee的webserviced的協議?
java 2 Platform,Enterprise Edition
繼承AbstractInterceptor類,覆蓋intercept()方法
有struts本身的攔截器 如timer ,i18n,scop,servletconfig,token
還有自定義攔截器
Spring AOP:代理機制 Spring提供的自動代理機制
Spring的IoC來實組件之間的依賴關係注入, 使控制層與業務實現分離,即客戶經過
調用業務委託接口來調用具體的業務組件的實例,避免控制層與業務層的藕合帶來的維護
或升級困難。由Spring爲DAO生成代理對象來爲DAO添加事務服務,由IoC容器DAO的代理實例注入到業務組件中,業務組件
5.Collections,collection的區別
Collection是個java.util下的接口,它是各類集合結構的父接口。Collections是個java.util下的普通類,它包含有各類有關集合操做的靜態方法。
----2015-8-21 end