目錄:java
1、JDK 和 JRE 的區別?git
2、final 與 static 的區別?面試
3、get和post的區別?數組
4、堆和棧的概念和區別 瀏覽器
5、淺談Java反射機制緩存
1、JDK 和 JRE 的區別?安全
JDK:java development kit (java開發工具)服務器
JRE:java runtime environment (java運行時環境)框架
JVM:java virtuak machine (java虛擬機)jvm
一、jdk--開發環境(核心)
Java development kit的縮寫,意思是Java開發工具,咱們寫文檔作PPT須要office 辦公軟件,開發固然須要開發工具了,說到開發工具你們確定會想到Eclipse,可是若是直接安裝Eclipse你會發現它是運行不起來 是會報錯的,只有安裝了JDK,配置好了環境變量和path才能夠運行成功。這點相信不少人都深有體會。
jdk主要包含三個部分:
第一部分是Java運行時環境,JVM
第二部分是Java的基礎類庫,這個類庫的數量仍是至關可觀的
第三部分是Java的開發工具,它們都是輔助你更好地使用Java的利器
詳尋《玩好JDK,面試不用愁》
二、jre--運行環境
① jdk中的jre
以下圖:jdk中包含的jre,在jre的bin目錄裏有個jvm.dll,既然JRE是運行時環境,那麼運行在哪?確定是JVM虛擬機上了。另,jre的lib目錄中放的是一些JAVA類庫的class文件,已經打包成jar文件。
② 第二個JRE(獨立出來的運行時環境)
以下圖,不論是JDK中的JRE仍是JRE既然是運行時環境必須有JVM。因此JVM也是有兩個的。
三、JVM——轉換環境
java virtuak machine (java虛擬機)的縮寫。
你們一提到JAVA的優勢就會想到:一次編譯,隨處運行,說白了就是跨平臺性好,這點JVM功不可沒。
Java的程序也就是咱們編譯的代碼都會編譯爲class文件,class文件就是在jvm上運行的文件,只有JVM還不能徹底支持class的執行,由於在解釋class的時候JVM須要調用解釋所須要的類庫lib,而jre包含lib類庫。
JVM屏蔽了與具體操做系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就能夠在多種平臺上不加修改的運行。
JVM也是一門很深的學問,感興趣的同窗能夠深刻研究,只有好處,沒有壞處。
其實有時候面試官問JDK和JRE的區別的目的不是想讓你解釋什麼名詞的,而是想看看你的基礎和研究Java的深淺,還有另外一方面就是你是否是常常喜歡問爲何。
2、final 與 static 的區別?
均可以修飾類、方法、成員變量
static能夠修飾類的代碼塊,final不能夠
static不能夠修飾方法內局部變量,final能夠
static修飾表示靜態或全局
static修飾的代碼塊表示靜態代碼塊,當JVM加載類時,只會被建立一次
static修飾的變量能夠從新賦值
static方法中不能用this和super關鍵字
由於this表明的是調用這個函數的對象的引用,而靜態方法是屬於類的,不屬於對象,靜態方法成功加載後, 對象還不必定存在。 this表明對本類對象的引用,指向本類已建立的對象。 super表明對父類對象的引用,指向父類對象。 靜態優先於對象存在,方法被static修飾以後,方法先存在,所需的父類引用對象晚於該方法的出 現,也就是super所指向的對象還沒出現,固然就會報錯。
static方法必須被實現,而不能是抽象的abstract
static方法只能被static方法覆蓋
final修飾表示常量、一旦建立不可被修改
final標記的成員變量必須在聲明的同時賦值,或在該類的構造方法中賦值,不可從新賦值
final方法不能被子類重寫
final類不能被繼承,沒有子類,final類中的方法默認是final的
final不能用於修飾構造方法
private類型的方法默認是final類型的
3、get和post的區別?
get和post是表單提交的兩種方式,get請求數據經過域名後綴URL傳送,用戶可見,不安全,post請求數據經過在請求報文正文裏傳輸,相對比較安全。get是經過URL傳遞表單值,post經過URL看不到表單域的值。
get傳遞的數據量是有限的,若是要傳遞大數據量不能用get,不如type=「file」上傳文章、type=「password」傳遞密碼,get和post是表單提交數據的兩種方式,get請求數據經過地域名後綴URL傳送,用戶可見,不安全,post請求數據經過將在請求報文正文裏傳輸,相對比較安全。
get是經過url傳遞表單值,post經過url看不到表單域的值;
get傳遞的數據量是有限的,若是要傳遞大數據量不能用get,好比type=「file」上傳文章、type=「password」傳遞密碼或者< text area >發表大段文章,post則沒有這個限制;
post會有瀏覽器提示從新提交表單的問題,get則沒有(加分的回答)
對於Post的表單從新敲地址欄再刷新就不會提示從新提交了,由於從新敲地址就沒有偷偷提交的數據了。Post方式的正確的地址很難直接發給別人。
get和post的區別
1.get提交的數據放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. post方法是把提交的數據放在HTTP包的body中。
2.get提交的數據大小有限制(由於瀏覽器對URL的長度有限制),而post方法提交的數據沒有限制。
3.get方式須要使用request.querystring來取得變量的值,而post方式經過request.form來獲取變量的值。
4.get方式提交數據會帶來安全問題,好比一個登錄頁面,經過get提交數據時,用戶名和密碼將出如今URL中,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器 ,就能夠從歷史記錄得到該用戶的帳戶和密碼。
get是從服務器獲取數據,post向服務器傳送數據。
get是把參數數據隊列加到提交表單的action屬性所指的URL中,值和表單內各個字段一一對應,在URL中能夠看到。post是經過HTTP post機制,將表單內各個字段與其內容放置在HTML.header內一塊兒傳送到action屬性所指的URL地址。用戶看不到這個過程。
對於get方式,服務器端用request.querystring獲取變量的值,對於post方式,服務器端用request.form獲取提交的數據
get傳送的數據量較小,不能大於2KB.POST傳送的數據量較大,通常被默認爲不受限制。但理論上,限制取決於服務器的處理能力。
get安全性較低。post安全性較高。
4、堆和棧的概念和區別
在說堆和棧以前,先說一下JVM(虛擬機)內存的劃分:
Java程序在運行時都要開闢空間,任何軟件在運行時都要在內存中開闢空間,Java虛擬機運行時也是要開闢空間的。JVM運行時在內存中開闢一片內存區域,啓動時在本身的內存區域中進行更細緻的劃分,由於虛擬機中每一片內存處理的方法都不一樣,因此要單獨進行管理。
JVM內存的劃分有五片:
1.寄存器
2.本地方法區
3.方法區
4.棧內存
5.堆內存
咱們來重點說一下堆和棧:
棧內存:棧內存首先時一片內存區域,存儲的都是局部變量,凡是定義在方法中的都是局部變量,for循環內部定義的也是局部變量,是先加載函數才能進行局部變量的定義,因此方法先進棧,而後再定義變量,變量有本身的做用於,一旦離開做用域,變量就會被釋放。棧內存的更新速度很快,由於局部變量的聲明週期都很短。
堆內存:存儲的是數組和對象(其實數組就是對象),凡是new創建的都是在堆中,堆中存放的都是實體(對象),實體用於封存數據,並且是封存多個(實體的多個屬性),若是一個數據消失,這個實體也沒有消失,還能夠用,因此堆是不會隨時釋放的,可是棧不同,棧裏存放的都是單個變量,變量被釋放了,也就沒有了。堆裏的實體雖然不會被釋放,可是會被當作垃圾,Java有垃圾回收機制不定時的收取。
下面咱們經過一個圖例詳細講一下堆和棧:
好比主函數裏的語句
int[] arr = new int[3];
在內存中是怎麼被定義的:
主函數先進棧,在棧中定義一個變量arr,接下來爲arr賦值,可是右邊不是一個具體值,是一個實體。實體建立在堆裏,在堆裏首先經過new關鍵字開闢一個空間,內存在存儲數據的時候都是經過地址來實現的,地址是一塊連續的二進制,而後給這個實體分配一個內存地址。數組都有一個索引,數組這個實體在堆內存中產生以後每個空間都會默認的初始化(這是堆內存的特色,未初始化的數據是不能用的,可是在堆裏是能夠用的,由於初始化過了,可是棧裏沒有),不一樣的類型初始化的值不同,因此堆和棧裏就建立了變量和實體:
那麼堆和棧怎麼聯繫起來的呢?
咱們剛剛說郭給堆分配一個地址,把堆的地址賦給arr,arr就經過地址只想了數組。因此arr想操做數組時,就經過地址,而不是直接把四蹄都賦給它。這種咱們再也不叫它基本數據類型,而叫引用數據類型。稱爲arr引用了堆內存當中的實體
若是當int[] arr = null;
arr不作任何指向,null的做用就是取消引用數據類型的指向。
當一個實體,沒有引用數據類型指向的時候,它在堆內存中不會被釋放,而被看成一個垃圾,在不定時的時間內自動回收,由於Java有一個自動回收機制。自動回收機制自動監測堆裏是否有垃圾,若是有,就會自動的作垃圾回收的動做,可是何時回收不必定。
因此堆和棧的區別很明顯:
1.棧內存存儲的是局部變量而堆內存存儲的是實體;
2.棧內存的更新速度要快於堆內存,由於局部變量的聲明週期很短;
3.棧內存存放的變量聲明週期一旦結束就會被釋放,而堆內存存放的實體會被垃圾啊回收機制不定時的回收。
5、淺談Java反射機制
一、反射的定義是什麼?
Java反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法,這種動態獲取、調用對象方法的功能成爲Java語言的反射機制。
二、反射存在的必要性?
反射機制是不少Java框架的基石。
① 在xml文件或properties裏面寫好了配置,而後再Java類裏面解析xml或properties裏面的內容,獲得一個字符串,而後用反射機制,根據這個字符串得到某個類的Class實例,這樣就能夠動態配置一些東西,不用每一次都要在代碼裏去new或者作其它事情,之後要改的話直接改配置文件,代碼維護起來就很方便了。
② 有時候要適應某些需求,Java類裏面不必定能直接調用另外的方法,這時候也能夠經過反射機制來實現。
三、反射的缺點?
反射的代碼比正常調用的代碼更多,性能更慢,應避免使用反射。