Java材料

daiwen305發表於2018-08-20

 例項化的方法:

方法一:直接用new的方式開闢一個物件;

方法二:使用工廠設計模式,引入工廠類;

方法三:使用反射機制:Class.forName;

方法四:使用物件克隆:Object類中的clone方法.

 

abstract class和interface有什麼區別?

1.abstract class在Java語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。但是一個類卻可以實現多個interface。

  2.其次,在abstract class的定義中,我們可以賦予方法的預設行為。但是在interface的定義中,方法卻不能擁有預設行為,為了繞過這個限制,必須使用委託。

  3.在abstract class方式中,可以有自己的資料成員,也可以有非abstract的成員方法,而在interface方式的實現中,只能夠有靜態的不能被修改的資料成員,所有的成員方法都是abstract的.

Static:

1. static變數  靜態變數在記憶體中只有一個拷貝,例項變數可以在記憶體中有多個拷貝

2. static程式碼塊 是類載入時,初始化自動執行的。

3. static方法 可以直接通過類名呼叫,只能訪問static的變數和方法,因為非static的變數和方法是需要建立一個物件才能訪問的,而static的變數/方法不需要建立任何物件。

全域性變數和靜態全域性變數的區別

全域性變數, 靜態全域性變數是靜態儲存方式。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當一個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效, 在同一源程式的其它原始檔中不能使用它。

 

Final

    在Java中宣告屬性、方法和類時,可使用關鍵字final來修飾。

     final變數即為常量,只能賦值一次;

     final方法不能被子類重寫;

     final類不能被繼承。

 初始化可以在兩個地方,一是其定義處,也就是說在final變數定義時直接給其賦值,二是在建構函式

多型和繼承的區別:繼承是子類使用父類的方法,而多型則是父類使用子類的方法

Overload和Override的區別。Overloaded的方法是否可以改變返回值的型別?

方法的重寫Overriding和過載Overloading是Java多型性的不同表現。重寫Overriding是父類與子類之間多型性的一種表現,過載Overloading是一個類中多型性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和引數,我們說該方法被重寫 (Overriding)。子類的物件使用這個方法時,將呼叫子類中的定義,對它而言,父類中的定義如同被“遮蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,則稱為方法的過載(Overloading)。Overloaded的方法是可以改變返回值的型別。

 

構造器Constructor是否可被override?

構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被過載Overloading。

Servlet生命週期:

當WEB客戶第一次請求訪問某個Servlet的時候,WEB容器將建立這個Servlet的例項,並且呼叫Servlet的init()方法進行初始化,請求到達時執行其service方法,service方法自動派遣執行與請求對應的doXXX方法(doGet,doPost)等,當WEB應用被終止,或Servlet容器終止執行,或Servlet容器重新裝載Servlet新例項時,Servlet容器會先呼叫Servlet的destroy()方法,在destroy()方法中可以釋放掉Servlet所佔用的資源。

ClassLoader載入過程:

當執行一個程式的時候,JVM啟動,執行bootstrap Classloader,該ClassLoader載入java核心API(ExtClassLoader和AppClassLoader也在此時被載入),然後呼叫ExtClassLoader載入擴充套件API,最後AppClassLoader載入CLASSPATH目錄下定義的Class,這就是一個程式最基本的載入流程。

=============================================

java程式在執行過程中,類,物件以及它們成員載入、初始化的順序如下: 
1、首先載入要建立物件的類及其直接與間接父類。 
2、在類被載入的同時會將靜態成員進行載入,主要包括靜態成員變數的初始化,靜態語句塊的執行,在載入時按程式碼的先後順序進行。 
3、需要的類載入完成後,開始建立物件,首先會載入非靜態的成員,主要包括非靜態成員變數的初始化,非靜態語句塊的執行,在載入時按程式碼的先後順序進行。 
4、最後執行構造器,構造器執行完畢,物件生成。

=============================================

 

String和StringBuffer區別:

String:

是物件不是原始型別.為不可變物件,一旦被建立,就不能修改它的值.

對於已經存在的String物件的修改都是重新建立一個新的物件,然後把新的值儲存進去.String 是final類,即不能被繼承.

 

StringBuffer:

是一個可變物件,當對他進行修改的時候不會像String那樣重新建立物件

它只能通過建構函式來建立,向StringBuffer中賦值的時候可以通過它的append方法,多執行緒同步安全的

 

StringBuilder類似StringBuffer,不是同步安全的,適合單執行緒

位元組流和字元流:

位元組流:InputStream,OutputStream

字元流:Reader,Write

 

treeset與hashset的區別:

TreeSet類實現了java.util.SortedSet介面,從而保證在遍歷集合時按照遞增的順序獲得物件。實現Comparable介面。

HashSet類按照雜湊演算法來存取物件,當向集合中加入一個新物件時,會呼叫物件的HashCode()方法得到物件的雜湊碼,然後根據這個碼計算出物件在集合中儲存的位置。

Hashcode:當兩個物件的hashcode一樣時,兩個物件就有可能一樣。如果不一樣的話兩個物件就肯定不一樣。一般用hashcode來進行比較兩個東西是不是一樣的,可以很容易的排除許多不一樣的東西。

Volatile修飾的成員變數在每次被執行緒訪問時,都強迫從共享記憶體中重讀該成員變數的值。而且,當成員變數發生變化時,強迫執行緒將變化值回寫到共享記憶體。這樣在任何時刻,兩個不同的執行緒總是看到某個成員變數的同一個值。

Transient:java語言的關鍵字,變數修飾符,如果用transient宣告一個例項變數,當物件儲存時,它的值不需要維持。換句話來說就是,用transient關鍵字標記的成員變數不參與序列化過程。

instanceof是Java的一個二元操作符,它的作用是測試它左邊的物件是否是它右邊的類的例項,返回boolean型別的資料。可以用在繼承中的子類的例項是否為父類的實現。

異常的分類:

① 異常的繼承結構:基類為Throwable,Error和Exception繼承Throwable,RuntimeException和IOException等繼承Exception,具體的RuntimeException繼承RuntimeException。

② Error和RuntimeException及其子類成為未檢查異常(unchecked),其它異常成為已檢查異常(checked),一定要處理。

如果出現RuntimeException,那麼一定是程式設計師的錯誤,我們可以不處理。其他非RuntimeException(IOException等等):這類異常一般是外部錯誤。

 

內部類:

成員內部類 :不能定義靜態成員,可以訪問外部類的所有成員。

作為外部類的一個成員存在,與外部類的屬性、方法並列

靜態巢狀類 :不需要內部類物件與其外圍類物件之間有聯絡

1. 要建立巢狀類的物件,並不需要其外圍類的物件。

2. 不能從巢狀類的物件中訪問非靜態的外圍類物件

// 靜態內部類可以用public, protected, private修飾

方法內部類 :不能有訪問說明符,因為它不是外圍類的一部分,但是它可以訪問當前程式碼塊內的常量,和此外圍類所有的成員。

匿名內部類  

·匿名內部類不能有構造方法。 
·匿名內部類不能定義任何靜態成員、方法和類。 
·匿名內部類不能是public, protected, private, static

 

基本資料型別:byte,int,char,long,short,Boolean,float,double

   SessionCookie的區別

1.Session將資訊儲存在伺服器上,而Cookie儲存在客戶端上

2SessionCookie更安全,但是session依賴於cookie的,SessionCookie更佔資源

3Cookie只能存String型別的資料,而Session可以存Object型別和簡單資料型別的資料

 

3。什麼是記憶體洩漏?

答:一般我們所說的記憶體洩漏指的是堆記憶體的洩漏。堆記憶體是程式從堆中為其分配的,大小任意的,使用完後要顯示釋放記憶體。當應用程式用關鍵字new等建立物件時,就從堆中為它分配一塊記憶體,使用完後程式釋放該記憶體,否則就說該記憶體就不能被使用,我們就說該記憶體被洩漏了。

當沒有任何引用指向堆中的某個物件例項時,這個物件就被視為不再使用。

 

時間複雜度:

插入,選擇,冒泡        時間複雜度o(n2)

堆,二叉樹,希爾        時間複雜度o(nlog n)

冒泡,交換,選擇:最大次數(n-1)*n/2

多型簡單例項:

public abstract class A {
abstract void Execute(); 
}
public class B extends A {
public void Excute(){System.out.println("I'm lili");}
}
public class C extends A {
public void Execute(){System.out.println("I'm C");}
}
public static void main(String[] args){
A b=new B();
A c=new C();
b.Execute();
c.Execute();
}

byteshortchar三種型別的優先順序是相同的,相同優先順序之間是不能進行自動轉換的,

byteshortchar-->int-->long-->float-->double

 

執行緒

Thread和Runnable有什麼不同?

JAVA執行緒控制著程式執行的主路徑。當你用java命令呼叫JVM時,JVM建立了一個隱式執行緒來執行main方法。Thread類提供了主執行緒呼叫其它執行緒並行執行的機制。
Runnable介面定義了一個能被Thread執行的類。實現Runnable的類只需要實行run方法。可以很靈活的擴充套件現在的已經繼承自其它父類的類。而thread則不可以,因為java只允許繼承一個父類。

synchronized關鍵字修飾同步方法,反對使用stop(不安全,解除了執行緒獲取的所有鎖定),反對使用suspend(容易發生死鎖)

狀態:就緒,執行,synchronize阻塞,wait和sleep掛起,結束。

Lock和synchronize

Lock可以完成synchronize的所有功能,更精確的執行緒語義和更好的效能。手動釋放鎖。

Java中的執行緒有四種狀態分別是:就緒、執行、掛起、結束

多執行緒有兩種實現方法,分別是繼承Thread類與實現Runnable介面

2。觸發器的作用?

  答:觸發器是一中特殊的儲存過程,主要是通過事件來觸發而被執行的。它可以強化約束,來維護資料的完整性和一致性,可以跟蹤資料庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。

 

3。索引的作用?和它的優點缺點是什麼?

答:索引就一種特殊的查詢表,資料庫的搜尋引擎可以利用它加速對資料的檢索。它很類似與現實生活中書的目錄,不需要查詢整本書內容就可以找到想要的資料。索引可以是唯一的,建立索引允許指定單個列或者是多個列。缺點是它減慢了資料錄入的速度,同時也增加了資料庫的尺寸大小。

 

資料庫三正規化:

第一正規化,欄位具有原子性,不可再分            

第二正規化,欄位具有原子性,不可再分,資料庫表中每一行可以被唯一地區分

第三正規化,每一列只有一個值,每一行都能區分,每一個表都不包含其它表已經包含的非主關鍵字資訊

5。什麼是事務?什麼是鎖?

答:事務就是被繫結在一起作為一個邏輯工作單元的SQL語句分組,如果任何一個語句操作失敗那麼整個操作就被失敗,以後操作就會回滾到操作前狀態,或者是上有個節點。為了確保要麼執行,要麼不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID測試,即原子性,一致性,隔離性和永續性。

Oracle資料庫支援READ COMMITTED和 SERIALIZABLE這兩種事務隔離級別。所以Oracle不支援髒讀

一、事務的基本要素(ACID)

  1、原子性(Atomicity):事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程中出錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是一個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。

   2、一致性(Consistency):事務開始前和結束後,資料庫的完整性約束沒有被破壞 。比如A向B轉賬,不可能A扣了錢,B卻沒收到。

   3、隔離性(Isolation):同一時間,只允許一個事務請求同一資料,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。

   4、永續性(Durability):事務完成後,事務對資料庫的所有更新將被儲存到資料庫,不能回滾。

 

二、事務的併發問題

  1、髒讀:事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的資料是髒資料

  2、不可重複讀:事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取同一資料時,結果 不一致。

  3、幻讀:系統管理員A將資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

  小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

 

三、MySQL事務隔離級別

事務隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read-uncommitted)
不可重複讀(read-committed)
可重複讀(repeatable-read)
序列化(serializable)

mysql預設的事務隔離級別為repeatable-read

6。什麼叫檢視?遊標是什麼?

答:檢視是一種虛擬的表,具有和物理表相同的功能。可以對檢視進行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。

  遊標:是對查詢出來的結果集作為一個單元來有效的處理。遊標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行。可以對結果集當前行做修改。一般不使用遊標,但是需要逐條處理資料的時候,遊標顯得十分重要。

相關文章