JAVA刷題筆記

1.JAVA異常類體系

      Error類體系描述了java運行體系中的內部錯誤以及資源耗盡的情形,Error不需要捕捉;

      異常分爲運行時異常,非運行時異常和error,其中error是系統異常,只能重啓系統解決。非運行時異常需要我們自己補獲,而運行異常是程序運行時由虛擬機幫助我們補獲,運行時異常包括數組的溢出,內存的溢出空指針,分母爲0等!

2.線程安全 

    Thread.sleep() 和 Object.wait(),都可以拋出 InterruptedException。這個異常是不能忽略的,因爲它是一個檢查異常(checked exception)

       如果你的代碼所在的進程中又多個線程再同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期是一樣的,就是線程安全的。

      線程安全問題都是由全局變量及靜態變量引起的。

3.Servlet加載

       ServletContext對象:servlet容器在啓動時會加載web應用,併爲每個web應用創建唯一的servletcontext對象,可以把ServletContext看成是一個Web應用的服務器端組件的共享內存,在ServletContext中可以存放共享數據。ServletContext對象是真正的一個全局對象,凡是web容器中的Servlet都可以訪問。

       整個web應用只有唯一的一個ServletContext對象

      servletConfig對象:用於封裝servlet的配置信息。從一個servlet被實例化後,對任何客戶端在任何時候訪問有效,但僅對servlet自身有效,一個servlet的ServletConfig對象不能被另一個servlet訪問。

4.java表達式轉型規則由低到高轉換 

java表達式轉型規則由低到高轉換

1、所有的byte,short,char型的值將被提升爲int型;

2、如果有一個操作數是long型,計算結果是long型;

3、如果有一個操作數是float型,計算結果是float型;

4、如果有一個操作數是double型,計算結果是double型;

5、被fianl修飾的變量不會自動改變類型,當2個final修飾相操作時,結果會根據左邊變量的類型而轉化。

6、整數類型byte(1個字節)short(2個字節)int(4個字節)long(8個字節)

7、字符類型char(2個字節)

8、浮點類型float(4個字節)double(8個字節,默認浮點型類型)

       只要兩個操作數中有一個是double類型的,另一個將會被轉換成double類型,並且結果也是double類型,如果兩個操作數中有一個是float類型的,另一個將會被轉換爲float類型,並且結果也是float類型,如果兩個操作數中有一個是long類型的,另一個將會被轉換成long類型,並且結果也是long類型,否則(操作數爲:byte、short、int 、char),兩個數都會被轉換成int類型,並且結果也是int類型。

5.java內存

方法區和堆內存是線程共享的。程序計數器、虛擬機棧是線性隔離的。

6.java的各種開發模式

https://blog.csdn.net/qq_40199914/article/details/79002784

7.抽象類vs接口

   (1)抽象類可以定義普通成員變量而接口不可以,但是抽象類和接口都可以定義靜態成員變量,只能接口的靜態成員變量要用static final public來修飾。

     (2)接口沒有構造方法,所以不能實例化,抽象類又構造方法,但是不是用來實例化的,是用來初始化的。

8.Collection子類

9.java基本數據類型

(1)第一類:整數類型 byte short int long

  (2)   第二類:浮點型 float double

(3)第三類:邏輯型 boolean

(4)字符型 : char

10.java正則表達式

元字符 描述
\ 將下一個字符標記符、或一個向後引用、或一個八進制轉義符。例如,“\\n”匹配\n。“\n”匹配換行符。序列“\\”匹配“\”而“\(”則匹配“(”。即相當於多種編程語言中都有的“轉義字符”的概念。

^

匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之後的位置。

$

匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。

*

匹配前面的子表達式任意次。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等價於o{0,}

+

匹配前面的子表達式一次或多次(大於等於1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價於{1,}。

?

匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價於{0,1}。

{n}

n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。

{n,}

n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。

{n,m}

m和n均爲非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o爲一組,後三個o爲一組。“o{0,1}”等價於“o?”。請注意在逗號和兩個數之間不能有空格。

?

當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜索的字符串,而默認的貪婪模式則儘可能多的匹配所搜索的字符串。例如,對於字符串“oooo”,“o+”將儘可能多的匹配“o”,得到結果[“oooo”],而“o+?”將儘可能少的匹配“o”,得到結果 ['o', 'o', 'o', 'o']

.點

匹配除“\r\n”之外的任何單個字符。要匹配包括“\r\n”在內的任何字符,請使用像“[\s\S]”的模式。

(pattern)

匹配pattern並獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“\(”或“\)”。

(?:pattern)

非獲取匹配,匹配pattern但不獲取匹配結果,不進行存儲供以後使用。這在使用或字符“(|)”來組合一個模式的各個部分時很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。

(?=pattern) 非獲取匹配,正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。
(?!pattern) 非獲取匹配,正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串,該匹配不需要獲取供以後使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern) 非獲取匹配,反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)

非獲取匹配,反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。這個地方不正確,有問題

此處用或任意一項都不能超過2位,如“(?<!95|98|NT|20)Windows正確,“(?<!95|980|NT|20)Windows 報錯,若是單獨使用則無限制,如(?<!2000)Windows 正確匹配

x|y

匹配x或y。例如,“z|food”能匹配“z”或“food”(此處請謹慎)。“[zf]ood”則匹配“zood”或“food”。

[xyz]

字符集合。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。

[^xyz]

負值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。

a-z]

字符範圍。匹配指定範圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字符。

注意:只有連字符在字符組內部時,並且出現在兩個字符之間時,才能表示字符的範圍; 如果出字符組的開頭,則只能表示連字符本身.

[^a-z]

負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字符。

\b

匹配一個單詞邊界,也就是指單詞和空格間的位置(即正則表達式的“匹配”有兩種概念,一種是匹配字符,一種是匹配位置,這裏的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。

\B

匹配非單詞邊界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

\cx

匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須爲A-Z或a-z之一。否則,將c視爲一個原義的“c”字符。

\d

匹配一個數字字符。等價於[0-9]。grep 要加上-P,perl正則支持

\D

匹配一個非數字字符。等價於[^0-9]。grep要加上-P,perl正則支持

\f

匹配一個換頁符。等價於\x0c和\cL。

\n

匹配一個換行符。等價於\x0a和\cJ。

\r

匹配一個回車符。等價於\x0d和\cM。

\s

匹配任何不可見字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。

\S

匹配任何可見字符。等價於[^ \f\n\r\t\v]。

\t

匹配一個製表符。等價於\x09和\cI。

\v

匹配一個垂直製表符。等價於\x0b和\cK。

\w

匹配包括下劃線的任何單詞字符。類似但不等價於“[A-Za-z0-9_]”,這裏的"單詞"字符使用Unicode字符集

\W

匹配任何非單詞字符。等價於“[^A-Za-z0-9_]”。

11.內部類

https://www.jianshu.com/p/f0fdea957792

(1)靜態內部類除了訪問權限修飾符比外圍類多以外, 和外圍類沒有區別, 只是代碼上將靜態內部類組織在了外部類裏面。靜態內部類不能訪問外部類的非公開成員。

(2)成員內部類可以直接使用外部類的所有成員和方法,即使是private修飾的。而外部類要訪問內部類的所有成員變量和方法,內需要通過內部類的對象來獲取。(誰叫它是親兒子呢?) 要注意的是,成員內部類不能含有static的變量和方法。因爲成員內部類需要先創建了外部類,才能創建它自己的。成員內部類不能有static修飾的成員,但是卻允許定義常量

(3)局部內部類的局部變量需要用final修飾;局部變量必須有初始值。

(4)爲了免去給內部類命名,或者只想使用一次,就可以選擇匿名內部類。

12.構造方法vs普通方法

       (1)普通的類方法是可以和類名同名的,和構造方法唯一的區分就是,構造方法沒有返回值

        (2)構造函數不能被繼承,只能被調用

13 java虛擬機功能

         (1)通過ClassLoader尋找和裝載class文件

         (2)解釋字節碼成爲指令並執行,提供class文件的運行環境

          (3)進行運行期間垃圾回收

          (4)提供與硬件交互的平臺

14 default和protected的區別 

    default拒絕一切包外訪問;protected接受包外的子類訪問

 

15 關鍵字

     (1)final用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

     (2)finally是異常處理語句結構的一部分,表示總是執行。

     (3)finalize這個方法一個對象只能執行一次,只能在第一次進入被回收的隊列,而且對象所屬於的類重寫了finalize方法纔會被執行。第二次進入回收隊列的時候,不會再執行其finalize方法,而是直接被二次標記,在下一次GC的時候被GC。

       (4) abstract不能與final同時修飾一個類

16 變量初始化

     (1)靜態變量會默認賦初始值,局部變量和final聲明的變量必須手動賦初始值。

17 ClassLoader

     JDK中提供了三個ClassLoader,根據層級從高到低爲:

          1.BootStrap ClassLoader,主要加載JVM自身工作需要的類。

           2.Extension ClassLoader,主要加載%JAVA_HOME%\lib\ext目錄下的庫類。

       3. Application ClassLoader ,主要加載ClassPath指定的庫類,一般情況下這是程序中的默認類加載器,也是ClassLoader.getSystemClassLoader()的返回值。

         JVM加載類的實現方式,我們稱爲雙親委託模式:如果一個類加載收到了類加載的請求,他首先不會自己去嘗試加載這個類,而是把這個請求委託給自己的父加載器,每一層的類加載器都是如此,因此所有的類加載請求最終都應該傳送到頂層的Bootstrap ClassLoader中,只有當父加載器反饋自己無法完成加載請求時,子加載器纔會嘗試自己加載。雙親委託模型的重要用途是爲了解決類載入過程中的安全性問題

 

18.java中的四捨五入

floor : 意爲地板,指向下取整,返回不大於它的最大整數 ceil : 意爲天花板,指向上取整,返回不小於它的最小整數 round : 意爲大約,表示“四捨五入”,而四捨五入是往大數方向入。Math.round(11.5)的結果爲12,Math.round(-11.5)的結果爲-11而不是-12。

19.java鎖 

 (1)自旋鎖,自旋,jvm默認是10次,有jvm自己控制。for去爭取鎖

 (2)阻塞鎖,被阻塞的線程,不會爭奪鎖。

 (3)可重入鎖,多次進入改鎖的域

 (4)讀寫鎖

 (5)互斥鎖  鎖本身就是互斥的

  (6)悲觀鎖 不相信,這裏會是安全的,必須全部上鎖

  (7)樂觀鎖

  (8)公平鎖 又優先級的鎖

  (9)非公平鎖

 (10)偏向鎖 無競爭不鎖,有競爭掛起,轉爲輕量鎖

  (11)對象鎖 鎖住對象

  (12)線程鎖

  (13)鎖粗化

  (14)輕量級鎖 CAS實現

  (15)鎖膨脹 jvm實現

  (16)信號量 使用阻塞鎖 實現的一種策略

  (17)排他鎖:X鎖,若事物T對數據對象A加上X鎖,則只允許T讀取和修改A,其他任何事物都不能再對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。

 

20 strut1 vs struts2

      (1)struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。

     (2)Struts2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去實現常用的接口。Action接口不是必須的,任何又execute標識的對象都可以用作struts2的Action對象。

     (3)Struts1 Action依賴於Servlet API,因爲當一個Action被調用時HttpServletRequest和HttpServletResponse被傳遞給execute方法。

        (4)struts2 Action依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。

       (5)Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。 

        (6) Struts2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,並且不會導致性能和垃圾回收問題)

21加載驅動的方法 

       (1)Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver);

         (2) DriverManager.registerDriver(new com.mysql.jdbc.Driver());

         (3) System.setPropetry("jdbc.drivers","com.mysql.jdbc.Driver");

22 queue類比較

    (1)LinkedBlockingQueue:基於鏈接節點的可選限定的blocking queue 。 這個隊列排列元素FIFO(先進先出)。 隊列的頭部是隊列中最長的元素。 隊列的尾部是隊列中最短時間的元素。 新元素插入隊列的尾部,隊列檢索操作獲取隊列頭部的元素。 鏈接隊列通常具有比基於陣列的隊列更高的吞吐量,但在大多數併發應用程序中的可預測性能較低。

blocking queue說明:不接受null元素;可能是容量有限的;實現被設計爲主要用於生產者 - 消費者隊列;不支持任何類型的“關閉”或“關閉”操作,表示不再添加項目實現是線程安全的;

   (2)PriorityQueue:基於優先級堆的無限優先級queue 。 優先級隊列的元素根據它們的有序natural ordering ,或由一個Comparator在隊列構造的時候提供,這取決於所使用的構造方法。 優先隊列不允許null元素。 依靠自然排序的優先級隊列也不允許插入不可比較的對象(這樣做可能導致ClassCastException )。該隊列的頭部是相對於指定順序的最小元素。 如果多個元素被綁定到最小值,那麼頭就是這些元素之一 - 關係被任意破壞。 隊列檢索操作poll , remove , peek和element訪問在隊列的頭部的元件。優先級隊列是無限制的,但是具有管理用於在隊列上存儲元素的數組的大小的內部容量 。 它始終至少與隊列大小一樣大。 當元素被添加到優先級隊列中時,其容量會自動增長。 沒有規定增長政策的細節。該類及其迭代器實現Collection和Iterator接口的所有可選方法。 方法iterator()中提供的迭代器不能保證以任何特定順序遍歷優先級隊列的元素。 如果需要有序遍歷,請考慮使用Arrays.sort(pq.toArray()) 。請注意,此實現不同步。 如果任何線程修改隊列,多線程不應同時訪問PriorityQueue實例。 而是使用線程安全的PriorityBlockingQueue類。實現注意事項:此實現提供了O(log(n))的時間入隊和出隊方法( offer , poll , remove()和add ); remove(Object)和contains(Object)方法的線性時間; 和恆定時間檢索方法( peek , element和size )。

     (3)ConcurrentLinkedQueue:基於鏈接節點的無界併發deque(deque是雙端隊列) 。 併發插入,刪除和訪問操作可以跨多個線程安全執行。 A ConcurrentLinkedDeque是許多線程將共享對公共集合的訪問的適當選擇。像大多數其他併發集合實現一樣,此類不允許使用null元素。

23 中間件

中間件是一種獨立的系統軟件或服務程序,分佈式應用軟件藉助這種軟件在不同的技術之間共享資源。中間件位於客戶機/ 服務器的操作系統之上,管理計算機資源和網絡通訊。是連接兩個獨立應用程序或獨立系統的軟件。相連接的系統,即使它們具有不同的接口,但通過中間件相互之間仍能交換信息。執行中間件的一個關鍵途徑是信息傳遞。通過中間件,應用程序可以工作於多平臺或OS環境。(簡單來說,中間件並不能提高內核的效率,一般只是負責網絡信息的分發處理)。

24hashMap知識點

        在這裏幫大家總結一下hashMap和hashtable方面的知識點吧: 1.  關於HashMap的一些說法: a)  HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。HashMap的底層結構是一個數組,數組中的每一項是一條鏈表。 b)  HashMap的實例有倆個參數影響其性能: “初始容量” 和 裝填因子。 c)  HashMap實現不同步,線程不安全。  HashTable線程安全 d)  HashMap中的key-value都是存儲在Entry中的。 e)  HashMap可以存null鍵和null值,不保證元素的順序恆久不變,它的底層使用的是數組和鏈表,通過hashCode()方法和equals方法保證鍵的唯一性 f)  解決衝突主要有三種方法:定址法,拉鍊法,再散列法。HashMap是採用拉鍊法解決哈希衝突的。 注: 鏈表法是將相同hash值的對象組成一個鏈表放在hash值對應的槽位;    用開放定址法解決衝突的做法是:當衝突發生時,使用某種探查(亦稱探測)技術在散列表中形成一個探查(測)序列。 沿此序列逐個單元地查找,直到找到給定 的關鍵字,或者碰到一個開放的地址(即該地址單元爲空)爲止(若要插入,在探查到開放的地址,則可將待插入的新結點存人該地址單元)。   拉鍊法解決衝突的做法是: 將所有關鍵字爲同義詞的結點鏈接在同一個單鏈表中 。若選定的散列表長度爲m,則可將散列表定義爲一個由m個頭指針組成的指針數 組T[0..m-1]。凡是散列地址爲i的結點,均插入到以T[i]爲頭指針的單鏈表中。T中各分量的初值均應爲空指針。在拉鍊法中,裝填因子α可以大於1,但一般均取α≤1。拉鍊法適合未規定元素的大小。     2.  Hashtable和HashMap的區別: a)   繼承不同。  public class Hashtable extends Dictionary implements Map public class HashMap extends  AbstractMap implements Map b)  Hashtable中的方法是同步的,而HashMap中的方法在缺省情況下是非同步的。在多線程併發的環境下,可以直接使用Hashtable,但是要使用HashMap的話就要自己增加同步處理了。 c)  Hashtable 中, key 和 value 都不允許出現 null 值。 在 HashMap 中, null 可以作爲鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值爲 null 。當 get() 方法返回 null 值時,即可以表示 HashMap 中沒有該鍵,也可以表示該鍵所對應的值爲 null 。因此,在 HashMap 中不能由 get() 方法來判斷 HashMap 中是否存在某個鍵, 而應該用 containsKey() 方法來判斷。 d)  兩個遍歷方式的內部實現上不同。Hashtable、HashMap都使用了Iterator。而由於歷史原因,Hashtable還使用了Enumeration的方式 。 e)  哈希值的使用不同,HashTable直接使用對象的hashCode。而HashMap重新計算hash值。 f)  Hashtable和HashMap它們兩個內部實現方式的數組的初始大小和擴容的方式。HashTable中hash數組默認大小是11,增加的方式是old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。   注:  HashSet子類依靠hashCode()和equal()方法來區分重複元素。      HashSet內部使用Map保存數據,即將HashSet的數據作爲Map的key值保存,這也是HashSet中元素不能重複的原因。而Map中保存key值的,會去判斷當前Map中是否含有該Key對象,內部是先通過key的hashCode,確定有相同的hashCode之後,再通過equals方法判斷是否相同。

25. 同步器

     (1)Java 併發庫 的Semaphore 可以很輕鬆完成信號量控制,Semaphore可以控制某個資源可被同時訪問的個數,通過 acquire() 獲取一個許可,如果沒有就等待,而 release() 釋放一個許可。

       (2)CyclicBarrier 主要的方法就是一個:await()。await() 方法沒被調用一次,計數便會減少1,並阻塞住當前線程。當計數減至0時,阻塞解除,所有在此 CyclicBarrier 上面阻塞的線程開始運行。

      (3)直譯過來就是倒計數(CountDown)門閂(Latch)。倒計數不用說,門閂的意思顧名思義就是阻止前進。在這裏就是指 CountDownLatch.await() 方法在倒計數爲0之前會阻塞當前線程。

 26.靜態內部類

       (1)靜態內部類不能直接訪問外部類的非靜態成員,但可以通過new 外部類成員的方式訪問

       (2)如果外部類的靜態成員與內部類的成員名稱相同,可以通過“類名。靜態成員”訪問外部類的靜態成員“

       (3)創建靜態內部類的對象時,不需要外部類的對象,可以直接創建內部類 對象名=new 內部類();

27子類和父類 

      (1)子類的權限不能比父類更低

28 JAVA五個基本原則 

        (1)單一職責原則(Single-Resposibility Principle):一個類,最好只做一件事,只有一個引起它的變化。單一職責原則可以看做是低耦合、高內聚在面向對象原則上的引申,將職責定義爲引起變化的原因,以提高內聚性來引起變化的原因。

        (2)開放封閉原則(Open-Closed principle):軟件實體應該是可擴展的,而不可修改的。也就是對擴展開放,對修改封閉。

            (3)Liskov替換原則(Liskov-Substitution Principle):子類必須能夠替換其基類。這一思想體現爲對繼承機制約束規範,只有子類能夠替換基類時,才能保證系統在運行期內識別子類,這是保證複用的基礎。

           (4)依賴倒置原則(Dependecy-Inversion Principle):依賴於抽象。具體而言就是高層模塊不依賴於底層模塊,二者都同依賴於抽象;抽象不依賴具體,具體依賴於抽象。

           (5)接口隔離原則(Interface-Segregation Principle):使用多個曉的專門的接口,而不要使用一個大的總接口。

 

29.IO流

  

30、前臺線程和後臺線程的區別和聯繫

       (1)後臺線程不會阻止進程的終止。屬於某個進程的所有前臺線程都終止後,該進程就會被終止。所有剩餘的後臺線程都會停止且不會完成。

         (2)可以在任何時候將前臺線程修改爲後臺線程,方式是設置Thread.IsBackground屬性。

         (3)不管是前臺線程還是後臺線程,如果線程出現了異常,都會導致進程的終止。

    

31、Servlet體系結構

32 網頁

         (1)request.getAttrribute()方法返回request範圍內存在的對象,而request.getParameter()方法是獲取http提交過來的數據。 getAttribute是返回對象,getParameter返回字符串。

           (2) HttpServletResponse完成:設置http頭標誌,設置cookie,設置返回數據類型,輸出返回數據。

            (3)HttpServletRequest:讀取路徑

            (4)ServletContext:getParameter()是獲取POST/GET傳遞的參數值;getInitParameter獲取Tomcat的server.xml中設置Context的初始化參數;getAttibute()是獲取對象容器的數據值;getRequestDispatcher是請求轉發。

 

 

33 子類重寫父類方法

         (1)子類重寫父類方法是,方法的訪問權限不能小於原訪問權限,在接口中,方法的默認權限就是public,所以子類重寫後只能是public。

 

34 併發帶來的問題 

           

(1)丟失修改

              下面我們先來看一個例子,說明併發操作帶來的數據的不一致性問題。

               考慮飛機訂票系統中的一個活動序列:
              甲售票點(甲事務)讀出某航班的機票餘額A,設A=16.
               乙售票點(乙事務)讀出同一航班的機票餘額A,也爲16.
              甲售票點賣出一張機票,修改餘額A←A-1.所以A爲15,把A寫回數據庫.
               乙售票點也賣出一張機票,修改餘額A←A-1.所以A爲15,把A寫回數據庫.

               結果明明賣出兩張機票,數據庫中機票餘額只減少1。

             歸納起來就是:兩個事務T1和T2讀入同一數據並修改,T2提交的結果破壞了T1提交的結果,導致T1的修改被丟失。前文(2.1.4數據刪除與更新)中提到的問題及解決辦法往往是針對此類併發問題的。但仍然有幾類問題通過上面的方法解決不了,那就是:
 (2)不可重複讀

                不可重複讀是指事務T1讀取數據後,事務T2執行更新操作,使T1無法再現前一次讀取結果。具體地講,不可重複讀包括三種情況:
                 事務T1讀取某一數據後,事務T2對其做了修改,當事務1再次讀該數據時,得到與前一次不同的值。例如,T1讀取B=100進行運算,T2讀取同一數據B,對其進行修改後將B=200寫回數據庫。T1爲了對讀取值校對重讀B,B已爲200,與第一次讀取值不一致。
                事務T1按一定條件從數據庫中讀取了某些數據記錄後,事務T2刪除了其中部分記錄,當T1再次按相同條件讀取數據時,發現某些記錄神密地消失了。
                  事務T1按一定條件從數據庫中讀取某些數據記錄後,事務T2插入了一些記錄,當T1再次按相同條件讀取數據時,發現多了一些記錄。(這也叫做幻影讀) 
(3) 讀"髒"數據

                   讀"髒"數據是指事務T1修改某一數據,並將其寫回磁盤,事務T2讀取同一數據後,T1由於某種原因被撤消,這時T1已修改過的數據恢復原值,T2讀到的數據就與數據庫中的數據不一致,則T2讀到的數據就爲"髒"數據,即不正確的數據。

                    產生上述三類數據不一致性的主要原因是併發操作破壞了事務的隔離性。併發控制就是要用正確的方式調度併發操作,使一個用戶事務的執行不受其它事務的干擾,從而避免造成數據的不一致性。

35

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章