Java中--XX和XX的區別
把2------8用最快的辦法
2 <<3
super關鍵字與this關鍵字的區別:
1. 代表的事物不一致。
1. super關鍵字代表的是父類空間的引用。
2. this關鍵字代表的是所屬函式的呼叫者物件。
2. 使用前提不一致。
1. super關鍵字必須要有繼承關係才能使用。
2. this關鍵字不需要存在繼承關係也可使用。
3. 呼叫建構函式的區別:
1. super關鍵字是呼叫父類的建構函式。
2. this關鍵字是呼叫本類的建構函式。
super() 和this()不能同時出現,因為二者都需要在第一行子類當中至少有一個來
而不是super/this 或者this.name這種
建構函式和一般函式的區別
1.兩個函式定義格式不同
2.建構函式在物件建立時就被呼叫,用於初始化,且初始化動作只執行一次
一般函式,是在物件建立之後,需要呼叫才執行,且可以被呼叫多次
構造程式碼塊和建構函式的區別
構造程式碼塊:給所有物件進行初始化,也就是說,所有的物件都會呼叫一個程式碼塊,只要物件一建立,就會呼叫這個程式碼塊【構造靜態程式碼塊會在類載入的時候就建立】
建構函式:是給與之對應的物件進行初始化,具有針對性
成員變數和靜態變數和區域性變數的區別
成員變數:也叫成員屬性,描述行為和屬性,屬於物件,存在堆記憶體中,隨著物件建立而存在,隨著物件被回收而消失,只能被物件呼叫
區域性變數:屬於方法體,存在於棧記憶體中,實質上就是一個全域性變數
靜態變數:屬於類,存在於方法區中,隨著類載入而存在,隨著物件的消失而消失,可以被物件呼叫,也可以被類名呼叫
成員變數:
①成員變數定義在類中,在整個類中都可以被訪問。
②成員變數隨著物件的建立而建立,隨著物件的消失而消失,存在於物件所在的堆記憶體中。
③成員變數有預設初始化值。
區域性變數:
①區域性變數只定義在區域性範圍內,如:函式內,語句內等,只在所屬的區域有效。
②區域性變數存在於棧記憶體中,作用的範圍結束,變數空間會自動釋放。
③區域性變數沒有預設初始化值
成員變數和靜態變數
1、兩個變數的生命週期不同
成員變數隨著物件的建立而存在,隨著物件被回收而釋放。
靜態變數隨著類的載入而存在,隨著類的消失而消失。
2、呼叫方式不同
成員變數只能被物件呼叫。
靜態變數可以被物件呼叫,還可以被類名呼叫。
3、別名不同
成員變數也稱為例項變數。
靜態變數也稱為類變數。
4、資料儲存位置不同
成員變數儲存在堆記憶體的物件中,所以也叫物件的特有資料。
靜態變數資料儲存在方法區(共享資料區)的靜態區,所以也叫物件的共享資料。
抽象類和介面的區別
1.抽象類只能被繼承,而且只能單繼承
介面需要被實現,而且可以多實現
2.抽象類中可定義非抽象方法,子類可以直接繼承使用
介面中都是抽象方法,需要子類去實現
3.抽象類使用的是 is a 的關係
介面使用的是 like a 的關係
4.抽象類的成員修飾符可以自定義
介面中的成員修飾符是固定的:成員變數:public static final 成員方法:public abstract
error和exception的區別
error屬於編譯時的錯誤,根本不會通過編譯,即不會生成.class檔案
exception屬於執行時錯誤,只有在呼叫時才會報錯,如空指標,陣列下標越界等
簡單來說就是error要想恢復比較困難,如記憶體溢位,Exception只要你的程式設計沒有問題是不會出現的。
throw和throws的區別
throw:在方法體中(case語句塊)
throws:方法體中拋
overload和override的區別
overload是指多個方法具有相同的名字,但這些方法的引數列表不同。方法的返回值型別和引數的名字不參與比較,也就是說如果兩個方法的名字相同,即使返回值型別相同,也必須保證引數不同。overload的方法可以有不同的返回值型別。
override是父類與子類之間多型性的一種表現,子類override父類方法時,必須滿足的條件是子類override的方法與父類的方法同名、返回值型別相同、引數個數和引數型別相同,而且子類方法的許可權不低於父類方法的許可權。
程序和執行緒的區別
程序: 正在進行的程式。(記憶體+CPU)
單程序:DOS
多程序:WIN
怎麼實現的?時間片
執行緒:程序執行的步驟。
迅雷(Process--cpu+記憶體)----1-下載(Thread) 2-播放(Thread)
單執行緒:下載完才能播放。
多執行緒:線上播放,邊下載,邊播放---時間片
效率最高的解決方案:多程序的OS+多執行緒的APP
程序:每個獨立執行的程式稱為程序
執行緒:是一個程式內部的一條執行路徑,Java虛擬機器允許應用程式併發地執行多個執行程式
執行緒安全和執行緒同步的區別
執行緒同步是實現執行緒安全的一個途經
ArrayList與Vector的區別
ArrayList:底層的資料結構是陣列,執行緒不同步,代替了Vector,查詢元素的速度非常快
LinkedList:底層資料結構是連結串列,執行緒不同步,增刪速度非常快
Vector:底層資料結構是陣列,執行緒同步,不論查詢還是刪除都很慢【最早出現的一個集合】
final-finally-finalize的區別
final修飾的基本型別相當於常量,不能修改,修飾的類不能繼承
finally用在try...catch語句塊中,一般用來釋放資源
finalize在GC垃圾回收處出現
String-StringBuilder-StringBuffer的區別
String 字串常量(理解為常量,一經修改就開闢新空間,會產生垃圾)
StringBuffer 字串變數(執行緒安全的可變字元序列)
StringBuilder 字串變數(非執行緒安全的可變字元序列)
String 型別和 StringBuffer 型別的主要效能區別其實在於 String 是不可變的物件, 因此在每次對 String 型別進行改變的時候其實都等同於生成了一個新的 String 物件,然後將指標指向新的 String 物件,所以經常改變內容的字串最好不要用 String ,因為每次生成物件都會對系統性能產生影響,特別當記憶體中無引用物件多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。
StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 物件本身進行操作,而不是生成新的物件,再改變物件引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字串物件經常改變的情況下
java.lang.StringBuilder,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。
StringBuffer和StringBuilder的主要區別在於前者執行緒安全(等價於同步),後者是執行緒不安全(等價於非同步)
如果StringBuffer想要輸出的話,則必須用toString()方法先轉換成String型別,才能輸出
併發和並行的區別
並行:多個cpu例項或者多臺機器同時執行一段處理邏輯,是真正的同時
併發:通過cpu排程演算法,讓使用者看上去同時執行,實際上從cpu操作層面不是真正的同時。併發往往在場景中有公用的資源,那麼針對這個公用的資源往往產生瓶頸,我們會用TPS或者QPS來反應這個系統的處理能力。
wait和sleep的區別
wait:可以用來指定時間也可以不指定。不指定時間,只能由notify或者notifyAll來喚醒
執行緒會釋放執行權,而且執行緒會釋放鎖
sleep:必須指定時間,時間會自動從凍結狀態轉成執行狀態(臨時阻塞狀態)
執行緒會釋放執行權,但是不釋放鎖
集合和陣列之間的區別
陣列-->字串 toString
字串-->陣列 split
陣列:儲存基本資料型別
集合:物件
陣列-->集合 asList
集合-->陣列 toArray
length和length()的區別
陣列沒有length()方法,有length 的屬性。String 有length()方法。JavaScript中,獲得字串的長度是通過length屬性得到的,這一點容易和Java混淆
Hashtable和HashMap的區別
1.Hashtable是執行緒安全的,hashMap執行緒不安全
2.Hashtable不可以儲存null值,HashMap可以
ArrayList和LinkedList的區別
1.ArrayList是實現了動態陣列操作,LinkedList類似於連結串列的資料結構
2.對於增刪而言,LinkedList更快,而對於查詢ArrayList更快
equals和==
1.對於基本資料型別,==判斷的是二者的值
對於引用資料型別,==判斷的是二者的地址
1.==是判斷兩個變數或例項是不是指向同一個記憶體空間
equals是判斷兩個變數或例項所指向的記憶體空間的值是不是相同
2.==是指對記憶體地址進行比較
equals()是對字串的內容進行比較
3.==指引用是否相同
equals()指的是值是否相同
Collection和Collections的區別
Collection是介面,它是Set、List等容器的父介面;
Collections是工具類,提供了一系列的靜態方法來輔助容器操作,這些方法包括對容器的搜尋、排序、執行緒安全化等等
indexOf,charAt,subString的區別
基本型別和引用型別
普通型別傳遞的是引數(值)本身,而引用型別傳遞的是地址
基本型別資料傳遞的是該資料的值本身(變數的副本)。
引用型別資料傳遞的是這個物件的引用(的副本),而非物件本身。
next()--nextInt()--nextLine()
next()--String--只讀取空格之前的資料,next方法不能得到帶空格的字串。
nextLine()--讀取整行,返回的是Enter鍵之前的所有字元,它是可以得到帶空格的字串的。
nextInt()--int--只讀取int數值
讀取數字也可以使用nextLine(),不過需要轉換:Integer.parseInt(cin.nextLine())
注意在next()、nextInt()與nextLine()一起使用時,next()、nextInt()往往會讀取部分資料(會留下"\n"或者空格之後的資料)
字元,字串,數字之間的轉換
string 和int之間的轉換
string轉換成int :Integer.valueOf("12")
int轉換成string : String.valueOf(12)
char和int之間的轉換
首先將char轉換成string
String str=String.valueOf('2')
Integer.valueof(str) 或者Integer.PaseInt(str)
Integer.valueof返回的是Integer物件,Integer.paseInt返回的是int
PreparedStatement和Statement區別
前者效率更高,且可以防止sql注入問題
executeQuery和executeUpdate 和execute
executeQuery:返回一個結果集,用於select查詢語句中
executeUpdate:用於執行insert,delete,update語句中,其返回值是一個整數(int), 指示受影響的行數(即更新行數)
execute:可用於執行任何SQL語句,返回值是一個boolean型別,表示執行該SQL語句是都返回了ResultSet,如果執行後第一個結果是ResultSet,則返回true,否則返回false.
String 的subString是如何實現的?
標註擷取的前後角標,從標註位置開始擷取
RuntimeException和一般Exception的區別
RuntimeException和error都是非執行時異常,Exception是需要編譯才能顯示的異常
Object和Class
Java中Object是所有類的父類,所有類的物件都是Class類的例項。
重定向和轉發
重定向:兩次請求,一次響應
轉發:一次請求,一次響應
servlet請求轉發與重定向的區別:
request.setAttribute("test","hello");
request.getRequestDispacther("/test.jsp").forword(request,response);
response.sendRedirect("test.jsp");
一、顯示結果:
1、當用request.getRequestDispacther("/test.jsp").forword(request,response); 請求轉發後,結果頁面輸出:hello
2、當用response.sendRedirect("test.jsp");重定向後,結果頁面輸出:null
二、底層分析:
1、請求轉發(RequestDispatcher)的過程:
客戶首先發送一個請求到伺服器端,伺服器端發現匹配的servlet,並指定它去執行,當這個servlet執行完之後,它要呼叫getRequestDispacther()方法,把請求轉發給指定的test.jsp,整個流程都是在伺服器端完成的,而且是在同一個請求裡面完成的,因此servlet和jsp共享的是同一個request,在servlet裡面放的所有東西,在jsp中都能取出來,因此,jsp能把結果getAttribute()出來,getAttribute()出來後執行完把結果返回給客戶端。整個過程是一個請求,一個響應。
2、重定向(sendRedirect)的工作原理:
客戶傳送一個請求到伺服器,伺服器匹配servlet,這都和請求轉發一樣,servlet處理完之後呼叫了sendRedirect()這個方法,這個方法是response的方法,所以,當這個servlet處理完之後,看到response.senRedirect()方法,立即向客戶端返回這個響應,響應行告訴客戶端你必須要再發送一個請求,去訪問test.jsp,緊接著客戶端受到這個請求後,立刻發出一個新的請求,去請求test.jsp,這裡兩個請求互不干擾,相互獨立,在前面request裡面setAttribute()的任何東西,在後面的request裡面都獲得不了。可見,在sendRedirect()裡面是兩個請求,兩個響應。
三、表面分析:
1、當用RequestDispatcher請求轉發後,位址列為http://localhost:8080/test/TestServlet
這真好應正了上面的分析,我們起初請求的就一個servlet,至於你伺服器端怎麼轉,流程怎麼樣的,我客戶端根本就不知道,我發了請求後我就等
著響應,那你伺服器那邊願意怎麼轉就怎麼轉,我客戶端不關心也沒法知道,所以當伺服器端轉發到jsp後,它把結果返回給客戶端,客戶端根本就
不知道你這個結果是我真正訪問的servlet產生的,還是由servlet轉發後下一個元件產生的。
2、當用sendRedirect重定向後,位址列為http://localhost:8080/test/test.jsp
因為這個時候,客戶端已經知道了他第二次請求的是test.jsp,伺服器已經告訴客戶端要去訪問test.jsp了,所以位址列裡會顯示想要訪問的結果。
常量池和連線池
常量池:專門存放字串
連線池:資料庫連線池負責分配,管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是重新建立一個
構造方法不能被static、final、native、abstract和synchronized修飾,不能被子類繼承。