1. 程式人生 > >Java中--XX和XX的區別

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修飾,不能被子類繼承。