2018年面试题大全
JAVA?基礎知識
什么是?Java?虛擬機?為什么?Java?被稱作是?“?平臺無關的編程語言?”??
? ???Java?虛擬機是一個可以執行?Java?字節碼的虛擬機進程。?Java?源文件被編譯成能被?Java?虛擬機執行的字節碼文件。?
? ? ?Java?被設計成允許應用程序可以運行在任意的平臺,而不需要程序員為每一個平臺單獨重寫或者是重新編譯。?
? ? ?Java?被設計成允許應用程序可以運行在任意的平臺,而不需要程序員為每一個平臺單獨重寫或者是重新編譯。?
? ? Java?虛擬機讓這個變為可能,因為它知道底層硬件平臺的指令長度和其他特性。
簡述JAVA類加載機制?
? ? ?虛擬機把描述類的數據從?Class?文件加載到內存,并對數據進行校驗,解析和初始化,最終形成可以被虛擬機直接使用的?java?類型。
Java中常用的類,包,接口,請各舉5個
常用類:java.lang.Object、java.lang.String、java.lang.StringBuffer、java.lang.Math、java.lang.System,java.util.Vector,java.util.Date,java.text.DecimalFormate
常用包:java.lang,java.io,java.util,java.util.zip,java.net (java.lang.reflect,java.awt.image,java.wat.peer ,java.aplet ,?java.corba,java.corba.orb,java..awt.datatransfer,java.awt,java.awt.event,java.sql)
常用接口:Comparable ,Collection,set,Map,List,Runnable
請說一下final,finally和finalize的區別?
? ???final?用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。
? ? ?finally是異常處理語句結構的一部分,表示總是執行。
? ? ?finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等
數組有沒有length()方法,String有沒有length屬性?
? ? 數組有length屬性,String有length方法
String s = new String("xyz"),創建了幾個對象。
? ? ?創建了兩個對象,一個是靜態區的。
”static”關鍵字是什么意思?Java中是否可以覆蓋一個private或者是static的方法?
? ? 如果一個類的變量或者方法前面有static修飾,那么表明這個方法或者變量屬于這個類,也就是說可以在不創建對象的情況下直接使用
? ? 當父類的方法被private修飾時,表明該方法為父類私有,對其他任何類都是不可見的,因此如果子類定了一個與父類一樣的方法,這對于子類來說相當于是一個新的私有方法,且如果要進行向上轉型,然后去調用該“覆蓋方法”,會產生編譯錯誤
?
class Parent { private fun() { ... } } class Child extends Parent { private fun() { ... } } class Test { public static void main(String[] args) { Parent c = new Child(); c.fun(); //編譯出錯 } }
static方法時編譯時靜態綁定的,屬于類,而覆蓋是運行時動態綁定的(動態綁定的多態),因此不能覆蓋.
?
Java支持的基本數據類型有哪些?
? ? java支持的基本數據類型有以下9種:byte,shot,int,long,float,double,char,boolean,void.
? ?自動拆裝箱是java從jdk1.5引用,目的是將原始類型自動的裝換為相對應的對象,也可以逆向進行,即拆箱。這也體現java中一切皆對象的宗旨。
? ?所謂自動裝箱就是將原始類型自動的轉換為對應的對象,而拆箱就是將對象類型轉換為基本類型。java中的自動拆裝箱通常發生在變量賦值的過程中,如:
Integer object = 3; //自動裝箱 int o = object; //拆箱
在java中,應該注意自動拆裝箱,因為有時可能因為java自動裝箱機制,而導致創建了許多對象,對于內存小的平臺會造成壓力。
?
Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
? ? ? ?Math.round(11.5)==12 Math.round(-11.5)==-11 round 方法返回與參數 最接近的長整數,參數加 1/2 后求其 floor.
String, StringBuffer StringBuilder的區別。
String 的長度是不可變的;
StringBuffer的長度是可變的,如果你對字符串中的內容經常進行操作,特別是內容要修改時,那么使用 StringBuffer,如果最后需要 >String,那么使用 StringBuffer 的 toString() 方法;線程安全;
StringBuilder 是從 JDK 5 開始,為StringBuffer該類補充了一個單個線程使用的等價類;通常應該優先使用 StringBuilder 類,因>為它支持所有相同的操作,但由于它不執行同步,所以速度更快。?
使用字符串的時候要特別小心,如果對一個字符串要經常改變的話,就一定不要用String,否則會創建許多無用的對象出來.?
來看一下比較
String s = "hello"+"world"+"i love you";
StringBuffer Sb = new StringBuilder("hello").append("world").append("i love you");
這個時候s有多個字符串進行拼接,按理來說會有多個對象產生,但是jvm會對此進行一個優化,也就是說只創建了一個對象,此時它的執行速度要比StringBuffer拼接快.再看下面這個:
String s2 = "hello";
String s3 = "world";
String s4 = "i love you";
String s1 = s2 + s3 + s4
上面這種情況,就會多創建出來三個對象,造成了內存空間的浪費
equals()和hashCode()區別?
equals()相等的兩個對象,hashcode()一定相等,equals()不相等的兩個對象,卻并不能證明他們的hashcode()不相等。換句話說,equals()方法不相等的兩個對象,hashCode()有可能相等。(我的理解是由于哈希碼在生成的時候產生沖突造成的)
反過來:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。在object類中,hashcode()方法是本地方法,返回的是對象的地址值,而object類中的equals()方法比較的也是兩個對象的地址值,如果equals()相等,說明兩個對象地址值也相等,當然hashcode() 也就相等了;
?
什么時候該使用什么樣的集合
? ? ? ?Collection
? ? ? ?我們需要保存若干個對象的時候使用集合。
? ? ? ?List
? ? ? ?如果我們需要保留存儲順序,?并且保留重復元素,?使用List.
? ? ? ?如果查詢較多,?那么使用ArrayList
? ? ? ?如果存取較多,?那么使用LinkedList
? ? ? ?如果需要線程安全,?那么使用Vector
? ? ? Set
? ? ? 如果我們不需要保留存儲順序,?并且需要去掉重復元素,?使用Set.
? ? ? 如果我們需要將元素排序,?那么使用TreeSet
? ? ? 如果我們不需要排序,?使用HashSet,?HashSet比
? ? ? TreeSet效率高.
? ? ? 如果我們需要保留存儲順序,?又要過濾重復元素,?那么使用LinkedHashSet
Array?和?ArrayList?有何區別?什么時候更適合用?Array??
? ? ? ?1.????Array?可以容納基本類型和對象,而?ArrayList?只能容納對象。
?
? ? ? ? ? ? ?2.????Array?是指定大小的,而?ArrayList?大小是固定的
ArrayList 和LinkedList 的優缺點? ? ? ? ?
? ? ? ? ArrayList是基于數組實現的,而LinkedList是基于鏈表實現的;如果應用需要快速訪問數據,很少或不插入和刪除元素,就應該用數組,也就是ArrayList;如果應用需要經常插入和刪除元素你就需要用鏈表數據結構了,也就是LinkedList。
HashMap的工作原理
一,存儲方式: Java中的HashMap是以鍵值對(key-value)的形式存儲元素的。
二,調用原理: HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然后把鍵值對存儲在集合中合適的索引上。如果key已經存在了,value會被更新成新值。
三,其他熱性: HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。
HashMap和HashTable的區別
? ? ? ? ?HashMap是非線程同步的,HashTable是線程同步的。
? ? ? ? HashMap允許null作為鍵或者值,HashTable不允許
? ? ? ? HashTable中有個一個contains方法,HashMap去掉了此方法效率上來講,HashMap因為是非線程安全的,因此效率比HashTable高
set接口特點如下:
override重寫,overloadding重載
? ? 重寫是子類重新定義了父類的方法,重寫必有相同的方法名,參數列表和返回值類型。
? ? 重載是發生在同一個類里面的兩個或多個方法名相同,但參數不同的情況
?
Iterator,ListIterator
Iterator可以遍歷set和list集合,但是ListInterator只能用來遍歷List
Itertator只能向前遍歷,ListIterator既可以向前也可以向后,
ListIterator實現了Iterator接口。
線程相關:
關鍵字synchronized 、static、abstract、final
- synchronized:用于方法或代碼塊前,使此方法或者代碼塊編程同步的。
- static:用于聲明靜態變量,static關鍵字可以修飾變量,方法,靜態代碼塊。
? ? ? ? ? ? ? ? ? ? ? ? ??靜態變量:由static修飾的變量稱為靜態變量
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 靜態變量屬于類,而不屬于某個對象
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??靜態變量它的副本只有一個(靜態變量在類中只加載一)
? ? ? ? ? ? ? ? ? ? ? ? ?靜態方法:? 在靜態方法中只能調用靜態變量和靜態方法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在非靜態方法中,可以調用靜態方法或者變量。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??在靜態方法中不能使用this和super關鍵字。
? ? ? ? ? ? ? ? ? ? ? ? 靜態代碼塊
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??作用:用來給靜態成員變量初始化
- abstract:用于定義抽象類或者方法
- final:用于聲明常量,即只能賦一次值
- volatile:用來確保將變量的跟新操作通知到其他線程,當把變量聲明為volatile類型后,編譯器與運行時都會注意到這個變量是共享的,因此不會將該變量上的操作與其他內存操作一起重排序。然而,在訪問volatile變量時不會執行加鎖操作,因此也就不會使執行線程阻塞,因此volatile變量是一種比?synchronized關鍵字更輕量級的同步機制。
- serialize:Java 對象序列化為二進制文件
JAVA中如何實現序列化以及實現序列化的意義
實現Serializable接口
意義:可以將硫化后的對象進行讀寫操作,也可用于網絡之間對象傳輸,序列化是為了解決對象流讀寫坐? ? ?坐時引發的問題。
?
ArrayList 和 HashMap 的默認大小是多數?
List?元素是有序的、可重復
ArrayList、Vector默認初始容量為10
Vector:線程安全,但速度慢
底層數據結構是數組結構
加載因子為1:即當 元素個數 超過 容量長度 時,進行擴容
擴容增量:原容量的 1倍
如?Vector的容量為10,一次擴容后是容量為20
ArrayList:線程不安全,查詢速度快
底層數據結構是數組結構
擴容增量:原容量的 0.5倍+1
如 ArrayList的容量為10,一次擴容后是容量為16
?
Set(集)?元素無序的、不可重復。
HashSet:線程不安全,存取速度快
底層實現是一個HashMap(保存數據),實現Set接口
默認初始容量為16(為何是16,見下方對HashMap的描述)
加載因子為0.75:即當 元素個數 超過 容量長度的0.75倍 時,進行擴容
擴容增量:原容量的 1 倍
如 HashSet的容量為16,一次擴容后是容量為32
?
Map是一個雙列集合
HashMap:默認初始容量為16
(為何是16:16是2^4,可以提高查詢效率,另外,32=16<<1 ? ? ??-->至于詳細的原因可另行分析,或分析源代碼)
加載因子為0.75:即當 元素個數 超過 容量長度的0.75倍 時,進行擴容
擴容增量:原容量的 1 倍
如?HashSet的容量為16,一次擴容后是容量為32
?
SpringMVC的生命周期??(執行流程)
? ? ? ?第一步:用戶發起請求到前端控制器(DispatcherServlet)
? ? ? ?第二步:前端控制器請求處理器映射器(HandlerMappering)去查找處理器(Handle):通過xml配置或者注解進行查找
? ? ? ?第三步:找到以后處理器映射器(HandlerMappering)像前端控制器返回執行鏈(HandlerExecutionChain)
? ? ? ?第四步:前端控制器(DispatcherServlet)調用處理器適配器(HandlerAdapter)去執行處理器(Handler)
? ? ? ?第五步:處理器適配器去執行Handler
? ? ? ?第六步:Handler執行完給處理器適配器返回ModelAndView
? ? ? ?第七步:處理器適配器向前端控制器返回ModelAndView(ModelAndView是springmvc框架的一個底層對象,包括?Model和view)
? ? ? ?第八步:前端控制器請求視圖解析器(ViewResolver)去進行視圖解析根據邏輯視圖名解析成真正的視圖(jsp)
? ? ? ?第九步:視圖解析器像前端控制器返回View
? ? ? ?第十步:前端控制器對視圖進行渲染視圖渲染將模型數據(在ModelAndView對象中)填充到request域
? ? ? ?第十一步:前端控制器向用戶響應結果?
?
?Hibernate中提供了兩級緩存,一級緩存是Session級別的緩存,它屬于事務范圍的緩存,該級緩存由hibernate管理,應用程序無需干預;二級緩存是SessionFactory級別的緩存,該級緩存可以進行配置和更改,并且可以動態加載和卸載,hibernate還為查詢結果提供了一個查詢緩存,它依賴于二級緩存;
Struts2是單列還是多列?
struts 2的Action是多實例的并非單例,也就是每次請求產生一個Action的對象。原因是:struts 2的Action中包含數據,例如你在頁面填寫的數據就會包含在Action的成員變量里面。如果Action是單實例的話,這些數據在多線程的環境下就會相互影響,例如造成別人填寫的數據被你看到了。
而struts 1的Action是單實例的,因為它的數據保存在Form類中,多線程環境下,Action只負責處理一些邏輯,并沒有數據,也就是大家把它當做一個工具使用。同樣servlet也是單實例的。
Struts2框架執行流程步驟如下:
? ? ? ? 1、 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
? ? ? ? ?2、 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)?
? ? ? ?3、 接著FilterDispatcher(現已過時)被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action?
? ? ? ? 4、 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy?
? ? ? ? 5、 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類?
? ? ? ? 6、 ActionProxy創建一個ActionInvocation的實例。
? ? ? ?7、 ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。?
? ? ? ?8、 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper
說說Cookie和Session的區別?
???
?? 1、Cookie和Session都是會話技術,Cookie是運行在客戶端,Session是運行在服務器端。
?
?? 2、session中保存的是對象,cookie中保存的是字符串。
?? 3、Cookie有大小限制以及瀏覽器在存cookie的個數也有限制,Session是沒有大小限制和服務器的內存大小有關。
?? 4、Cookie有安全隱患,通過攔截或本地文件找得到你的cookie后可以進行攻擊。
? 5、Session是保存在服務器端上會存在一段時間才會消失,如果session過多會增加服務器的壓力。
?友友們如果那里寫的不對請留言交流,希望能幫到友友們!
?
總結
以上是生活随笔為你收集整理的2018年面试题大全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器被攻击ip显示美国,大神:服务器疑
- 下一篇: 服务器被攻击ip显示国外,服务器被不同的