摘要:中,任何未處理的受檢查異常強制在子句中聲明。運行時多態(tài)是面向?qū)ο笞罹璧臇|西,要實現(xiàn)運行時多態(tài)需要方法重寫子類繼承父類并重寫父類中已
1、簡述Java程序編譯和運行的過程:
答:① Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼--字節(jié)碼,創(chuàng)建完源文件之后,程序會先被編譯成 “.class” 文件。
② 在編譯好的java程序得到“.class”文件后,使用命令java 運行這個 .class 文件,系統(tǒng)就會啟動一個jvm進程,并找到主函數(shù)的入口,開始執(zhí)行main函數(shù)。
2、值傳遞和引用傳遞的區(qū)別:
答:①值傳遞:值傳遞是將進行傳遞的值進行拷貝,然后對拷貝之后的值進行傳遞,傳遞過程前后不改變原值的大?。?br>②引用傳遞:引用傳遞是將需要傳遞值的地址進行傳遞,傳遞過程前后會改變原值的大小。
3、‘==’和equals的區(qū)別:
答:“==”操作符專門用來比較兩個變量的值是否相等,也就是用于比較變量所對應(yīng)的內(nèi)存中所存儲的數(shù)值是否相同,要比較兩個基本類型的數(shù)據(jù)或兩個引用變量是否相等,只能用==操作符。
equals方法是用于比較兩個獨立對象的內(nèi)容是否相同,就好比去比較兩個人的長相是否相同,它比較的兩個對象是獨立的。例如,對于下面的代碼:
String a=new String("foo");
String b=new String("foo");
兩條new語句創(chuàng)建了兩個對象,然后用a,b這兩個變量分別指向了其中一個對象,這是兩個不同的對象,它們的首地址是不同的,即a和b中存儲的數(shù)值是不相同的,所以,表達式a==b將返回false,而這兩個對象中的內(nèi)容是相同的,所以,表達式a.equals(b)將返回true。
4、String 和StringBuilder的區(qū)別:
答:①String創(chuàng)新的字符串建的字符串是不可變的,如果改變字符串變量的值,是在內(nèi)存中創(chuàng)建一個新的字符串,字符串變量將引用新創(chuàng)建的字符串地址,而原來的字符串在內(nèi)存中依然存在且內(nèi)容不變,直至java的垃圾回收系統(tǒng)對其進行銷毀;
②StringBuilde創(chuàng)建一個可變的字符串,StringBuilder沒有實現(xiàn)線程安全,因此性能較好。
5、java中,throw和throws 有什么區(qū)別:
答:throw 用于拋出 java.lang.Throwable 類的一個實例化對象,意思是說你可以通過關(guān)鍵字 throw 拋出一個Exception,如:
throw new IllegalArgumentException(“XXXXXXXXX″)
而throws 的作用是作為方法聲明和簽名的一部分,方法被拋出相應(yīng)的異常以便調(diào)用者能處理。Java 中,任何未處理的受檢查異常強制在 throws 子句中聲明。
6、HashMap的hashcode的作用:
答:hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列存儲結(jié)構(gòu)中確定對象的存儲地址的。
如果兩個對象相同,就是適用于equals(java.lang.Object) 方法,那么這兩個對象的hashCode一定要相同。
如果對象的equals方法被重寫,那么對象的hashCode也盡量重寫,并且產(chǎn)生hashCode使用的對象,一定要和equals方法中使用的一致,否則就會違反上面提到的第2點。
兩個對象的hashCode相同,并不一定表示兩個對象就相同,也就是不一定適用于equals(java.lang.Object) 方法,只能夠說明這兩個對象在散列存儲結(jié)構(gòu)中,如Hashtable,他們“存放在同一個籃子里”。
7、什么時候需要重寫?
答:一般的地方不需要重載hashCode,只有當類需要放在HashTable、HashMap、HashSet等等hash結(jié)構(gòu)的集合時才會重載hashCode,那么為什么要重載hashCode呢?
要比較兩個類的內(nèi)容屬性值,是否相同時候,根據(jù)hashCode 重寫規(guī)則,重寫類的 指定字段的hashCode(),equals()方法。
8、Overload和Override的區(qū)別?
答:Overload是重載的意思,Override是覆蓋的意思,也就是重寫。
重載Overload表示同一個類中可以有多個名稱相同的方法,但這些方法的參數(shù)列表各不相同(即參數(shù)個數(shù)或類型不同)。
重寫Override表示子類中的方法可以與父類中的某個方法的名稱和參數(shù)完全相同,通過子類創(chuàng)建的實例對象調(diào)用這個方法時,將調(diào)用子類中的定義方法,這相當于把父類中定義的那個完全相同的方法給覆蓋了,這也是面向?qū)ο缶幊痰亩鄳B(tài)性的一種表現(xiàn)。子類覆蓋父類的方法時,只能比父類拋出更少的異常,或者是拋出父類拋出的異常的子異常,因為子類可以解決父類的一些問題,不能比父類有更多的問題。子類方法的訪問權(quán)限只能比父類的更大,不能更小。如果父類的方法是private類型,那么,子類則不存在覆蓋的限制,相當于子類中增加了一個全新的方法。
9、靜態(tài)變量和實例變量的區(qū)別?
答:在語法定義上的區(qū)別:靜態(tài)變量前要加static關(guān)鍵字,而實例變量前則不加。
在程序運行時的區(qū)別:實例變量屬于某個對象的屬性,必須創(chuàng)建了實例對象,其中的實例變量才會被分配空間,才能使用這個實例變量。靜態(tài)變量不屬于某個實例對象,而是屬于類,所以也稱為類變量,只要程序加載了類的字節(jié)碼,不用創(chuàng)建任何實例對象,靜態(tài)變量就會被分配空間,靜態(tài)變量就可以被使用了??傊瑢嵗兞勘仨殑?chuàng)建對象后才可以通過這個對象來使用,靜態(tài)變量則可以直接使用類名來引用。
10.如果main方法被聲明為private會怎樣?
答:能正常編譯,但運行的時候會提示”main方法不是public的”。
11、說一說Servlet的生命周期?
答:Servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務(wù)結(jié)束。這個生存期由javax.servlet.Servlet接口的init(),service()和destroy方法表達。
Servlet被服務(wù)器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應(yīng)的doXXX方法(doGet,doPost)等,當服務(wù)器決定將實例銷毀的時候調(diào)用其destroy方法。
web容器加載servlet,生命周期開始。通過調(diào)用servlet的init()方法進行servlet的初始化。通過調(diào)用service()方法實現(xiàn),根據(jù)請求的不同調(diào)用不同的do*()方法。結(jié)束服務(wù),web容器調(diào)用servlet的destroy()方法。
12、Java的”一次編寫,處處運行”是如何實現(xiàn)的?
答:Java程序會被編譯成字節(jié)碼組成的class文件,這些字節(jié)碼可以運行在任何平臺,因此Java是平臺獨立的。
13、如果去掉了main方法的static修飾符會怎樣?
答:程序能正常編譯。運行時會拋NoSuchMethodError異常。
14、GC是什么?為什么要有GC?
答:GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java提供的GC功能可以自動監(jiān)測對象是否超過作用域從而達到自動回收內(nèi)存的目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。
15、為什么Java里沒有全局變量?
答:全局變量是全局可見的,Java不支持全局可見的變量,因為:全局變量破壞了引用透明性原則。全局變量導(dǎo)致了命名空間的沖突。
16、Java支持哪種參數(shù)傳遞類型?
答:Java參數(shù)都是進行傳值。對于對象而言,傳遞的值是對象的引用,也就是說原始引用和參數(shù)引用的那個拷貝,都是指向同一個對象。
17、get 和 post請求的區(qū)別
答:get:
1、請求的參數(shù)會附加在URL之后,多個參數(shù)用 & 連接。
2、因為URL的長度限制,get 方式傳輸?shù)臄?shù)據(jù)大小有所限制。
3、安全性低,因為傳輸?shù)臄?shù)據(jù)會顯示在請求的URL中。
post:
1、將請求參數(shù)放置在 HTTP 數(shù)據(jù)包,發(fā)送給服務(wù)器。
2、傳送的數(shù)據(jù)量比較大
3、安全性較高
18、是否可以從一個靜態(tài)(static)方法內(nèi)部發(fā)出對非靜態(tài)(non-static)方法的調(diào)用?
答:不可以,靜態(tài)方法只能訪問靜態(tài)成員,因為非靜態(tài)方法的調(diào)用要先創(chuàng)建對象,然后在調(diào)用靜態(tài)方法時可能對象并沒有被初始化。
19、程序中可以允許多個類同時擁有都有main方法嗎?
答:可以。當程序運行的時候,我們會指定運行的類名。JVM只會在你指定的類中查找main方法。因此多個類擁有main方法并不存在命名沖突的問題。
20、什么是反射API?它是如何實現(xiàn)的?
答:反射是指在運行時能查看一個類的狀態(tài)及特征,并能進行動態(tài)管理的功能。這些功能是通過一些內(nèi)建類的反射API提供的,比如Class,Method,Field, Constructors等。使用的例子:使用Java反射API的getName方法可以獲取到類名。
21、為什么重載hashCode方法?
答:一般的地方不需要重載hashCode,只有當類需要放在HashTable、HashMap、HashSet等等hash結(jié)構(gòu)的集合時才會重載hashCode,那么為什么要重載hashCode呢?
如果你重寫了equals,比如說是基于對象的內(nèi)容實現(xiàn)的,而保留hashCode的實現(xiàn)不變,那么很可能某兩個對象明明是“相等”,而hashCode卻不一樣。
這樣,當你用其中的一個作為鍵保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一個作為鍵值去查找他們的時候,則根本找不到。
22、Final在java中的作用
答:Final可以修飾類,修飾方法,修飾變量。
修飾的類叫最終類。該類不能被繼承。
修飾的方法不能被重寫。
修飾的變量叫常量,常量必須初始化,一旦初始化后,常量的值不能發(fā)生改變。
23、為什么需要hashCode?
答:1.通過hashCode可以很快的查到小內(nèi)存塊。
2.通過hashCode比較比equal方法快,當get時先比較hashCode,如果hashCode不同,直接返回false。
24、Super與this表示什么?
答:Super表示當前類的父類對象
This表示當前類的對象
25、Cookie 和 Session 的區(qū)別
答:Cookie:是把數(shù)據(jù)保存在瀏覽器本地,并隨著每一次請求發(fā)送到服務(wù)器。
Session:是把用戶數(shù)據(jù)保存在服務(wù)器端。
26、IO 和 NIO 的區(qū)別,NIO的優(yōu)點
答:1、IO是面向流的,NIO是面向緩沖區(qū)的。
2、IO是阻塞的,NIO是非阻塞的。
3、NIO有選擇器機制,可以讓一個線程來監(jiān)視多個IO通道。
NIO的優(yōu)點:
1、不需要使用 read() 或者 write() 就可以處理文件內(nèi)容。
2、NIO的處理效率很快。
27、談?wù)剬ava中多態(tài)的理解?
答:多態(tài)是指允許不同子類型的對象對同一消息作出不同的響應(yīng)。
多態(tài)包括編譯時多態(tài)和運行時多態(tài)。
方法重載(overload)實現(xiàn)的是編譯時的多態(tài)性(也稱為前綁定),而方法重寫(override)實現(xiàn)的是運行時的多態(tài)性(也稱為后綁定)。
運行時多態(tài)是面向?qū)ο笞罹璧臇|西,要實現(xiàn)運行時多態(tài)需要:
方法重寫:子類繼承父類并重寫父類中已有的或抽象的方法。
對象造型:將父類型的引用指向子類型的對象,這樣父類的引用調(diào)用同樣的方法時即會根據(jù)子類對象的不同而表現(xiàn)出不同的行為。
28、Integer內(nèi)部緩存?
答:Integer類內(nèi)部有一個staitic 的Integer數(shù)組,存儲的是一些已經(jīng)完成初始化的Integer對象,一般值為(-128~127),若用==比較,則有時候會因為值不在緩存中而返回false,所以應(yīng)該用equals比較。
29、LinkedList的原理?
答:(1)底層是一個雙向鏈表,維護著一個first指針和一個last指針。
(2)隨機讀寫(get,set)的時間復(fù)雜度為O(n)。
(3)插入操作add(object)的時間復(fù)雜度為O(1);add(index, object)的時間復(fù)雜度為O(n)。
(4)刪除操作remove(object)的時間復(fù)雜度為O(1);remove(index)的時間復(fù)雜度為O(n)。
30、什么是拆裝箱?
答:拆箱:把包裝類型轉(zhuǎn)成基本數(shù)據(jù)類型
裝箱:把基本數(shù)據(jù)類型轉(zhuǎn)成包裝類型
31、Static關(guān)鍵字有什么作用?
答:Static可以修飾內(nèi)部類、方法、變量、代碼塊
Static修飾的類是靜態(tài)內(nèi)部類
Static修飾的方法是靜態(tài)方法,表示該方法屬于當前類的,而不屬于某個對象的,靜態(tài)方法也不能被重寫,可以直接使用類名來調(diào)用。在static方法中不能使用this或者super關(guān)鍵字。
Static修飾變量是靜態(tài)變量或者叫類變量,靜態(tài)變量被所有實例所共享,不會依賴于對象。靜態(tài)變量在內(nèi)存中只有一份拷貝,在JVM加載類的時候,只為靜態(tài)分配一次內(nèi)存。
Static修飾的代碼塊叫靜態(tài)代碼塊,通常用來做程序優(yōu)化的。靜態(tài)代碼塊中的代碼在整個類加載的時候只會執(zhí)行一次。靜態(tài)代碼塊可以有多個,如果有多個,按照先后順序依次執(zhí)行。
32、為什么equals()相等,hashCode就一定要相等,而hashCode相等,卻不要求equals相等?
答:1.因為是按照hashCode來訪問小內(nèi)存塊,所以hashCode必須相等。
2.HashMap獲取一個對象是比較key的hashCode相等和equal為true。
之所以hashCode相等,卻可以equal不等,就比如ObjectA和ObjectB他們都有屬性name,那么hashCode都以name計算,所以hashCode一樣,但是兩個對象屬于不同類型,所以equal為false。
33、heap和stack有什么區(qū)別。
答:java的內(nèi)存分為兩類,一類是棧內(nèi)存,一類是堆內(nèi)存。棧內(nèi)存是指程序進入一個方法時,會為這個方法多帶帶分配一塊私屬存儲空間,用于存儲這個方法內(nèi)部的局部變量,當這個方法結(jié)束時,分配給這個方法的棧會釋放,這個棧中的變量也將隨之釋放。
堆是與棧作用不同的內(nèi)存,一般用于存放不在當前方法棧中的那些數(shù)據(jù),例如,使用new創(chuàng)建的對象都放在堆里,所以,它不會隨方法的結(jié)束而消失。方法中的局部變量使用final修飾后,放在堆中,而不是棧中。
34、String 是最基本的數(shù)據(jù)類型嗎?
答:不是。Java中的基本數(shù)據(jù)類型只有8個:byte、short、int、long、float、double、char、boolean;除了基本類型(primitivetype)和枚舉類型(enumeration type),剩下的都是引用類型(reference type)。
35、數(shù)組有沒有l(wèi)ength()這個方法? String有沒有l(wèi)ength()這個方法
答: 數(shù)組沒有l(wèi)ength()這個方法,有l(wèi)ength的屬性。String有有l(wèi)ength()這個方法
36、接口有什么特點?
答:接口中聲明全是public static final修飾的常量
接口中所有方法都是抽象方法
接口是沒有構(gòu)造方法的
接口也不能直接實例化
接口可以多繼承
37、JDK 中常用的包有哪些?
答:java.lang、java.util、java.io、java.net、java.sql。
38、Collection 和 Collections的區(qū)別
答: Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.Collections是針對集合類的一個幫助類,他提供一系列靜態(tài)方法實現(xiàn)對各種集合的搜索、排序、線程安全化等操作
39、什么是 Java 的反射機制
答:反射機制:是指程序可以在運行時 訪問 或 修改 它本身狀態(tài)和方法的這種能力。
40、JDK、JRE、JVM 分別是什么關(guān)系?
答:JDK 即為 Java 開發(fā)工具包,包含編寫 Java 程序所必須的編譯、運行等開發(fā)工具以及 JRE。開發(fā)工具如:用于編譯 Java 程序的 javac 命令、用于啟動 JVM 運行 Java 程序的 Java 命令、用于生成文檔的 Javadoc 命令以及用于打包的 jar 命令等等。
JRE 即為 Java 運行環(huán)境,提供了運行 Java 應(yīng)用程序所必須的軟件環(huán)境,包含有 Java 虛擬機(JVM)和豐富的系統(tǒng)類庫。系統(tǒng)類庫即為 Java 提前封裝好的功能類,只需拿來直接使用即可,可以大大的提高開發(fā)效率。
JVM 即為 Java 虛擬機,提供了字節(jié)碼文件(.class)的運行環(huán)境支持。 簡單說,就是 JDK 包含 JRE 包含 JVM
更多優(yōu)質(zhì)文章請關(guān)注我的微信公眾號:細說架構(gòu)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73551.html
摘要:中,任何未處理的受檢查異常強制在子句中聲明。運行時多態(tài)是面向?qū)ο笞罹璧臇|西,要實現(xiàn)運行時多態(tài)需要方法重寫子類繼承父類并重寫父類中已 1、簡述Java程序編譯和運行的過程:答:① Java編譯程序?qū)ava源程序翻譯為JVM可執(zhí)行代碼--字節(jié)碼,創(chuàng)建完源文件之后,程序會先被編譯成 .class 文件。② 在編譯好的java程序得到.class文件后,使用命令java 運行這個 .c...
摘要:這是我在一次面試中,被面試官所提問的一道題在這次面試題中相等指的是對象的屬性個數(shù)值相等有這樣兩個李德華張德華我能想到的一種方案解答過程的思考由于沒有,我只能通過轉(zhuǎn)化成數(shù)組進入第二步,對象中的屬性在另一個中是否存在。 這是我在一次面試中,被面試官所提問的一道題 在這次面試題中 相等:指的是對象的屬性個數(shù)值相等 有這樣兩個obj let obj1 = { name:李德華, ...
摘要:為程序員金三銀四精心挑選的余道面試題與答案,歡迎大家向我推薦你在面試過程中遇到的問題我會把大家推薦的問題添加到下面的常用面試題清單中供大家參考。 為Java程序員金三銀四精心挑選的300余道Java面試題與答案,歡迎大家向我推薦你在面試過程中遇到的問題,我會把大家推薦的問題添加到下面的常用面試題清單中供大家參考。 前兩天寫的以下博客,大家比較認可,熱度不錯,希望可以幫到準備或者正在參加...
摘要:到十二月份,公司開始第二波裁員,我決定主動拿賠償走人。加一個小插曲上面的題是餓了嗎面試問到的。想去的公司沒有面試好,不要氣餒,繼續(xù)加油準備。避免打擊自信心。 回顧一下自己這段時間的經(jīng)歷,九月份的時候,公司通知了裁員,我匆匆忙忙地出去面了幾家,但最終都沒有拿到offer,我感覺今年的寒冬有點冷。到十二月份,公司開始第二波裁員,我決定主動拿賠償走人。后續(xù)的面試過程我做了一些準備,基本都能走...
閱讀 3272·2021-09-22 16:06
閱讀 3258·2021-09-02 15:40
閱讀 642·2019-08-30 15:54
閱讀 1047·2019-08-26 12:22
閱讀 1389·2019-08-26 12:17
閱讀 2751·2019-08-26 12:09
閱讀 512·2019-08-26 10:20
閱讀 796·2019-08-23 16:28