過去的幾個月可以說是網際網路的寒冬了,之前也就是吃瓜群眾一個,看看別人的公司裁員什麼的,可過去一周裡我也算是切身體會到了裁員浪潮的殘酷啊,各種CCC。有的人找不到工作總說是大環境不好的原因,送你一段話:
哈哈哈,就當是網際網路裁員浪潮下的一個笑話吧。
應部分網友的建議,從今天起會逐步的總結一些java、php相關的面試題,由簡單到複雜歸納一個系列:【金三銀四】,中間部分題目的答案來源於網絡,如若不嚴謹還望諒解。
java基礎面試題1、簡述Java程序編譯和運行的過程:
答:① Java編譯程序將Java源程序翻譯為JVM可執行代碼--字節碼,創建完源文件之後,程序會先被編譯成 「.class」 文件。
② 在編譯好的java程序得到「.class」文件後,使用命令java 運行這個 .class 文件,系統就會啟動一個jvm進程,並找到主函數的入口,開始執行main函數。
2、值傳遞和引用傳遞的區別:
答:①值傳遞:值傳遞是將進行傳遞的值進行拷貝,然後對拷貝之後的值進行傳遞,傳遞過程前後不改變原值的大小;
②引用傳遞:引用傳遞是將需要傳遞值的地址進行傳遞,傳遞過程前後會改變原值的大小。
3、『==』和equals的區別:
答:「==」操作符專門用來比較兩個變量的值是否相等,也就是用於比較變量所對應的內存中所存儲的數值是否相同,要比較兩個基本類型的數據或兩個引用變量是否相等,只能用==操作符。
equals方法是用於比較兩個獨立對象的內容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。例如,對於下面的代碼:
String a=new String("foo");
String b=new String("foo");
兩條new語句創建了兩個對象,然後用a,b這兩個變量分別指向了其中一個對象,這是兩個不同的對象,它們的首地址是不同的,即a和b中存儲的數值是不相同的,所以,表達式a==b將返回false,而這兩個對象中的內容是相同的,所以,表達式a.equals(b)將返回true。
4、String 和StringBuilder的區別:
答:①String創新的字符串建的字符串是不可變的,如果改變字符串變量的值,是在內存中創建一個新的字符串,字符串變量將引用新創建的字符串地址,而原來的字符串在內存中依然存在且內容不變,直至java的垃圾回收系統對其進行銷毀;
②StringBuilde創建一個可變的字符串,StringBuilder沒有實現線程安全,因此性能較好。
5、java中,throw和throws 有什麼區別:
答:throw 用於拋出 java.lang.Throwable 類的一個實例化對象,意思是說你可以通過關鍵字 throw 拋出一個Exception,如:
throw new IllegalArgumentException(「XXXXXXXXX″)
而throws 的作用是作為方法聲明和籤名的一部分,方法被拋出相應的異常以便調用者能處理。Java 中,任何未處理的受檢查異常強制在 throws 子句中聲明。
6、HashMap的hashcode的作用:
答:hashCode的存在主要是用於查找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列存儲結構中確定對象的存儲地址的。
如果兩個對象相同,就是適用於equals(java.lang.Object) 方法,那麼這兩個對象的hashCode一定要相同。
如果對象的equals方法被重寫,那麼對象的hashCode也儘量重寫,並且產生hashCode使用的對象,一定要和equals方法中使用的一致,否則就會違反上面提到的第2點。
兩個對象的hashCode相同,並不一定表示兩個對象就相同,也就是不一定適用於equals(java.lang.Object) 方法,只能夠說明這兩個對象在散列存儲結構中,如Hashtable,他們「存放在同一個籃子裡」。
7、什麼時候需要重寫?
答:一般的地方不需要重載hashCode,只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會重載hashCode,那麼為什麼要重載hashCode呢?
要比較兩個類的內容屬性值,是否相同時候,根據hashCode 重寫規則,重寫類的 指定欄位的hashCode(),equals()方法。
8、Overload和Override的區別?
答:Overload是重載的意思,Override是覆蓋的意思,也就是重寫。
重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數列表各不相同(即參數個數或類型不同)。
重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數完全相同,通過子類創建的實例對象調用這個方法時,將調用子類中的定義方法,這相當於把父類中定義的那個完全相同的方法給覆蓋了,這也是面向對象編程的多態性的一種表現。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權限只能比父類的更大,不能更小。如果父類的方法是private類型,那麼,子類則不存在覆蓋的限制,相當於子類中增加了一個全新的方法。
9、靜態變量和實例變量的區別?
答:在語法定義上的區別:靜態變量前要加static關鍵字,而實例變量前則不加。
在程序運行時的區別:實例變量屬於某個對象的屬性,必須創建了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量。靜態變量不屬於某個實例對象,而是屬於類,所以也稱為類變量,只要程序加載了類的字節碼,不用創建任何實例對象,靜態變量就會被分配空間,靜態變量就可以被使用了。總之,實例變量必須創建對象後才可以通過這個對象來使用,靜態變量則可以直接使用類名來引用。
10.如果main方法被聲明為private會怎樣?
答:能正常編譯,但運行的時候會提示」main方法不是public的」。
11、說一說Servlet的生命周期?
答:Servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init(),service()和destroy方法表達。
Servlet被伺服器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當伺服器決定將實例銷毀的時候調用其destroy方法。
web容器加載servlet,生命周期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。
12、Java的」一次編寫,處處運行」是如何實現的?
答:Java程序會被編譯成字節碼組成的class文件,這些字節碼可以運行在任何平臺,因此Java是平臺獨立的。
13、如果去掉了main方法的static修飾符會怎樣?
答:程序能正常編譯。運行時會拋NoSuchMethodError異常。
14、GC是什麼?為什麼要有GC?
答:GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。
15、為什麼Java裡沒有全局變量?
答:全局變量是全局可見的,Java不支持全局可見的變量,因為:全局變量破壞了引用透明性原則。全局變量導致了命名空間的衝突。
16、Java支持哪種參數傳遞類型?
答:Java參數都是進行傳值。對於對象而言,傳遞的值是對象的引用,也就是說原始引用和參數引用的那個拷貝,都是指向同一個對象。
17、get 和 post請求的區別
答:get:
1、請求的參數會附加在URL之後,多個參數用 & 連接。
2、因為URL的長度限制,get 方式傳輸的數據大小有所限制。
3、安全性低,因為傳輸的數據會顯示在請求的URL中。
post:
1、將請求參數放置在 HTTP 數據包,發送給伺服器。
2、傳送的數據量比較大
3、安全性較高
18、是否可以從一個靜態(static)方法內部發出對非靜態(non-static)方法的調用?
答:不可以,靜態方法只能訪問靜態成員,因為非靜態方法的調用要先創建對象,然後在調用靜態方法時可能對象並沒有被初始化。
19、程序中可以允許多個類同時擁有都有main方法嗎?
答:可以。當程序運行的時候,我們會指定運行的類名。JVM只會在你指定的類中查找main方法。因此多個類擁有main方法並不存在命名衝突的問題。
20、什麼是反射API?它是如何實現的?
答:反射是指在運行時能查看一個類的狀態及特徵,並能進行動態管理的功能。這些功能是通過一些內建類的反射API提供的,比如Class,Method,Field, Constructors等。使用的例子:使用Java反射API的getName方法可以獲取到類名。
21、為什麼重載hashCode方法?
答:一般的地方不需要重載hashCode,只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會重載hashCode,那麼為什麼要重載hashCode呢?
如果你重寫了equals,比如說是基於對象的內容實現的,而保留hashCode的實現不變,那麼很可能某兩個對象明明是「相等」,而hashCode卻不一樣。
這樣,當你用其中的一個作為鍵保存到hashMap、hasoTable或hashSet中,再以「相等的」找另一個作為鍵值去查找他們的時候,則根本找不到。
22、Final在java中的作用
答:Final可以修飾類,修飾方法,修飾變量。
修飾的類叫最終類。該類不能被繼承。
修飾的方法不能被重寫。
修飾的變量叫常量,常量必須初始化,一旦初始化後,常量的值不能發生改變。
23、為什麼需要hashCode?
答:1.通過hashCode可以很快的查到小內存塊。
2.通過hashCode比較比equal方法快,當get時先比較hashCode,如果hashCode不同,直接返回false。
24、Super與this表示什麼?
答:Super表示當前類的父類對象
This表示當前類的對象
25、Cookie 和 Session 的區別
答:Cookie:是把數據保存在瀏覽器本地,並隨著每一次請求發送到伺服器。
Session:是把用戶數據保存在伺服器端。
26、IO 和 NIO 的區別,NIO的優點
答:1、IO是面向流的,NIO是面向緩衝區的。
2、IO是阻塞的,NIO是非阻塞的。
3、NIO有選擇器機制,可以讓一個線程來監視多個IO通道。
NIO的優點:
1、不需要使用 read() 或者 write() 就可以處理文件內容。
2、NIO的處理效率很快。
27、談談對Java中多態的理解?
答:多態是指允許不同子類型的對象對同一消息作出不同的響應。
多態包括編譯時多態和運行時多態。
方法重載(overload)實現的是編譯時的多態性(也稱為前綁定),而方法重寫(override)實現的是運行時的多態性(也稱為後綁定)。
運行時多態是面向對象最精髓的東西,要實現運行時多態需要:
方法重寫:子類繼承父類並重寫父類中已有的或抽象的方法。
對象造型:將父類型的引用指向子類型的對象,這樣父類的引用調用同樣的方法時即會根據子類對象的不同而表現出不同的行為。
28、Integer內部緩存?
答:Integer類內部有一個staitic 的Integer數組,存儲的是一些已經完成初始化的Integer對象,一般值為(-128~127),若用==比較,則有時候會因為值不在緩存中而返回false,所以應該用equals比較。
29、LinkedList的原理?
答:(1)底層是一個雙向鍊表,維護著一個first指針和一個last指針。
(2)隨機讀寫(get,set)的時間複雜度為O(n)。
(3)插入操作add(object)的時間複雜度為O(1);add(index, object)的時間複雜度為O(n)。
(4)刪除操作remove(object)的時間複雜度為O(1);remove(index)的時間複雜度為O(n)。
30、什麼是拆裝箱?
答:拆箱:把包裝類型轉成基本數據類型
裝箱:把基本數據類型轉成包裝類型
31、Static關鍵字有什麼作用?
答:Static可以修飾內部類、方法、變量、代碼塊
Static修飾的類是靜態內部類
Static修飾的方法是靜態方法,表示該方法屬於當前類的,而不屬於某個對象的,靜態方法也不能被重寫,可以直接使用類名來調用。在static方法中不能使用this或者super關鍵字。
Static修飾變量是靜態變量或者叫類變量,靜態變量被所有實例所共享,不會依賴於對象。靜態變量在內存中只有一份拷貝,在JVM加載類的時候,只為靜態分配一次內存。
Static修飾的代碼塊叫靜態代碼塊,通常用來做程序優化的。靜態代碼塊中的代碼在整個類加載的時候只會執行一次。靜態代碼塊可以有多個,如果有多個,按照先後順序依次執行。
32、為什麼equals()相等,hashCode就一定要相等,而hashCode相等,卻不要求equals相等?
答:1.因為是按照hashCode來訪問小內存塊,所以hashCode必須相等。
2.HashMap獲取一個對象是比較key的hashCode相等和equal為true。
之所以hashCode相等,卻可以equal不等,就比如ObjectA和ObjectB他們都有屬性name,那麼hashCode都以name計算,所以hashCode一樣,但是兩個對象屬於不同類型,所以equal為false。
33、heap和stack有什麼區別。
答:java的內存分為兩類,一類是棧內存,一類是堆內存。棧內存是指程序進入一個方法時,會為這個方法單獨分配一塊私屬存儲空間,用於存儲這個方法內部的局部變量,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆是與棧作用不同的內存,一般用於存放不在當前方法棧中的那些數據,例如,使用new創建的對象都放在堆裡,所以,它不會隨方法的結束而消失。方法中的局部變量使用final修飾後,放在堆中,而不是棧中。
34、String 是最基本的數據類型嗎?
答:不是。Java中的基本數據類型只有8個:byte、short、int、long、float、double、char、boolean;除了基本類型(primitivetype)和枚舉類型(enumeration type),剩下的都是引用類型(reference type)。
35、數組有沒有length()這個方法? String有沒有length()這個方法
答:數組沒有length()這個方法,有length的屬性。String有有length()這個方法
36、接口有什麼特點?
答:接口中聲明全是public static final修飾的常量
接口中所有方法都是抽象方法
接口是沒有構造方法的
接口也不能直接實例化
接口可以多繼承
37、JDK 中常用的包有哪些?
答:java.lang、java.util、java.io、java.net、java.sql。
38、Collection 和 Collections的區別
答:Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作
39、什麼是 Java 的反射機制
答:反射機制:是指程序可以在運行時 訪問 或 修改 它本身狀態和方法的這種能力。
40、JDK、JRE、JVM 分別是什麼關係?
答:JDK 即為 Java 開發工具包,包含編寫 Java 程序所必須的編譯、運行等開發工具以及 JRE。開發工具如:用於編譯 Java 程序的 javac 命令、用於啟動 JVM 運行 Java 程序的 Java 命令、用於生成文檔的 Javadoc 命令以及用於打包的 jar 命令等等。
JRE 即為 Java 運行環境,提供了運行 Java 應用程式所必須的軟體環境,包含有 Java 虛擬機(JVM)和豐富的系統類庫。系統類庫即為 Java 提前封裝好的功能類,只需拿來直接使用即可,可以大大的提高開發效率。
JVM 即為 Java 虛擬機,提供了字節碼文件(.class)的運行環境支持。簡單說,就是 JDK 包含 JRE 包含 JVM
面試難度:簡單,基礎
適合群體:2019畢業生,春招
☞什麼是5G?居然有人用漫畫把它講得如此接地氣!
☞為啥程式設計師下班後只關顯示器從不關電腦?
☞崩潰!史上最難的一道Java面試題來了....