1. 程式人生 > >Java中級面試題及答案解析(8)

Java中級面試題及答案解析(8)

點選上方“Java知音”,選擇“置頂公眾號”

技術文章第一時間送達!

 

資料庫的三大正規化

1 、第一正規化(1NF)

在任何一個關係資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關係資料庫。 

所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。

在第一正規化(1NF)中表的每一行只包含一個例項的資訊。簡而言之,第一正規化要求資料表中的每一列(每個欄位)必須是不可拆分的最小單元。

2、 第二正規化(2NF)

第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被惟一地區分。為實現區分通常需要為表加上一個列,以儲存各個例項的惟一標識。

第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上一個列,以儲存各個例項的惟一標識。簡而言之,第二正規化要求表中的所有列,都必須依賴於主鍵,而不能有任何一列與主鍵沒有關係。

3 、第三正規化(3NF) 

滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。第三正規化(3NF)要求一個數據庫表中不包含其它表中已包含的非主關鍵字資訊。簡而言之,第三正規化要求表中的每一列只與主鍵直接相關而不是間接相關,表中的每一列只能依賴於主鍵。

TCP和UDP的區別及其適用場景

首先說一下什麼是TCP和UDP:

TCP是傳輸控制協議,提供的是面向連線、可靠的位元組流服務。

UDP是使用者資料報協議,是一個簡單的面向資料報的運輸層協議。

TCP和UDP的區別:

  • TCP面向連線的運輸層協議,UDP無連線

  • TCP是可靠交付,UDP是盡最大努力交付

  • TCP面向位元組流,UDP面向報文

  • TCP是點對點連線的,UDP一對一,一對多,多對多都可以

  • TCP適合用於網頁,郵件等,UDP適合用於視訊,語音廣播等

TCP和UDP的適用場景:

整個資料要準確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸檔案的協議,POP、SMTP等郵件傳輸的協議。 

當對網路通訊質量要求不高的時候,要求網路通訊速度能儘量的快,比如視訊、廣播等,這時就可以使用UDP。 

說一下Spring的核心模組

  • Spring Core【核心容器】:核心容器提供了Spring的基本功能。核心容器的核心功能是用IOC容器來管理類的依賴關係。

  • Spring AOP【面向切面】:Spring的AOP模組提供了面向切面程式設計的支援。SpringAOP採用的是純Java實現,採用基於代理的AOP實現方案,AOP代理由IOC容器負責生成、管理,依賴關係也一併由IOC容器管理。

  • Spring ORM【物件實體對映】:提供了與多個第三方持久層框架的良好整合。

  • Spring DAO【持久層模組】: Spring進一步簡化DAO開發步驟,能以一致的方式使用資料庫訪問技術,用統一的方式呼叫事務管理,避免具體的實現侵入業務邏輯層的程式碼中。

  • Spring Context【應用上下文】:它是一個配置檔案,為Spring提供上下文資訊,提供了框架式的物件訪問方法。

  • Spring Web【Web模組】:提供了基礎的針對Web開發的整合特性。

  • Spring MVC【MVC模組】:提供了Web應用的MVC實現。Spring的MVC框架並不是僅僅提供一種傳統的實現,它提供了一種清晰的分離模型。

(轉發)forward與(重定向)redirect的區別

  • forward是伺服器請求資源,伺服器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器。瀏覽器根本不知道伺服器傳送的內容從哪裡來的,所以它的位址列還是原來的地址。

  • redirect是服務端根據邏輯,傳送一個狀態碼,告訴瀏覽器重新去請求那個地址,所以位址列顯示的是新的URL。

  • forward轉發頁面和轉發到的頁面可以共享request裡面的資料。  

  • redirect不能共享資料。 

  • redirect不僅可以重定向到當前應用程式的其他資源,還可以重定向到同一個站點上的其他應用程式中的資源,甚至是使用絕對URL重定向到其他站點的資源。     

  • forward只能在同一個Web應用程式內的資源之間轉發請求。

  • forward是伺服器內部的一種操作。       

  • redirect是伺服器通知客戶端,讓客戶端重新發起請求。

  • forward一般用於使用者登陸的時候根據角色轉發到相應的模組。   

  • redirect一般用於使用者登出登陸時返回主頁面和跳轉到其它的網站等。

  • forward效率高。     

  • redirect效率低。

redis常用的五種資料型別

1.String(字串)

String是簡單的 key-value 鍵值對,value 不僅可以是 String,也可以是數字。它是Redis最基本的資料型別,一個redis中字串value最多可以是512M。

2.Hash(雜湊)

Redis hash 是一個鍵值對集合,對應Value內部實際就是一個HashMap,Hash特別適合用於儲存物件。

3.List(列表)

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素導列表的頭部(左邊)或者尾部(右邊)。

底層實現為一個雙向連結串列,即可以支援反向查詢和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,Redis內部的很多實現,包括髮送緩衝佇列等也都是用的這個資料結構。

4.Set(集合)

Redis的Set是String型別的無序集合,它的內部實現是一個 value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因。

5.zset(有序集合)

Redis zset 和 set 一樣也是String型別元素的集合,且不允許重複的成員,不同的是每個元素都會關聯一個double型別的分數,用來排序。