天天看點

Java開發崗面試題小結

8種基本資料類型

Java開發崗面試題小結
類型名稱 關鍵字 占用記憶體 取值範圍
位元組型 byte 1 位元組 -128~127
短整型 short 2 位元組 -32768~32767
整型 int 4 位元組 -2147483648~2147483647
長整型 long 8 位元組 -9223372036854775808L~9223372036854775807L
單精度浮點型 float 4 位元組 +/-3.4E+38F(6~7 個有效位)
雙精度浮點型 double 8 位元組 +/-1.8E+308 (15 個有效位)
字元型 char 2 位元組 ISO 單一字元集
布爾型 boolean 1 位元組 true 或 false

String相關

String, StringBuffer,StringBuilder的差別?

由于String是不可變類,是以是線程安全的,但是由于不可修改,是以每次修改都需要建立新的對象,比較浪費資源,是以引入StringBuffer,StringBuilder類,這兩個類都是可變的

StringBuffer和StringBuilder類都是可變類,但是StringBuffer是線程安全的,而StringBuilder是線程不安全的。是以在多線程的環境下可以使用StringBuffer,但是效率和速度沒有StringBuilder高

StringBuffer實作線程安全的方法是在内部方法上用synchronized關鍵字修飾,其實就是加鎖。

如何将String轉換為char,反過來呢?

  • String不可能轉化為char,但是可以轉化為char數組
  • 調用toCharArray() 方法

String.valueOf()或者 new 一個String 都可以把char轉化為String

線程

1)繼承Thread類建立線程

2)實作Runnable接口建立線程

采用繼承Thread類方式:

(1)優點:編寫簡單,如果需要通路目前線程,無需使用Thread.currentThread()方法,直接使用this,即可獲得目前線程。

(2)缺點:因為線程類已經繼承了Thread類,是以不能再繼承其他的父類。

采用實作Runnable接口方式:

(1)優點:線程類隻是實作了Runable接口,還可以繼承其他的類。在這種方式下,可以多個線程共享同一個目标對象,是以非常适合多個相同線程來處理同一份資源的情況,進而可以将CPU代碼和資料分開,形成清晰的模型,較好地展現了面向對象的思想。

(2)缺點:程式設計稍微複雜,如果需要通路目前線程,必須使用Thread.currentThread()方法。

Runable沒有傳回值,run()方法傳回類型為void,Callable方法有傳回值,call()方法傳回類型為泛型和Future、FutureTask配合使用可以擷取方法傳回值;Callable的call()方法允許向上抛出異常,Runable的run()方法不允許向上抛出異常,隻能在内部消化

JVM

jdk(javac)>jre(java)>jvm

JDK(Java Development Kit) 是 Java 語言的軟體開發工具包(SDK)。在JDK的安裝目錄下有一個jre目錄,裡面有兩個檔案夾bin和lib,在這裡可以認為bin裡的就是JVM(Java Virtual Machine),lib中則是JVM工作所需要的類庫,而JVM和 lib合起來就稱為JRE(Java Runtime Environment,Java運作環境)。

JVM不能單獨搞定class的執行,解釋class的時候JVM需要調用解釋所需要的類庫lib。在JDK下面的的jre目錄裡面有兩個檔案夾bin和lib,在這裡可以認為bin裡的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib和起來就稱為jre。JVM+Lib=JRE。總體來說就是,我們利用JDK(調用JAVA API)開發了屬于我們自己的JAVA程式後,通過JDK中的編譯程式(javac)将我們的文本java檔案編譯成JAVA位元組碼,在JRE上運作這些JAVA位元組碼,JVM解析這些位元組碼,映射到CPU指令集或OS的系統調用。

  • 棧:基本類型的變量,對象的引用變量,執行個體對象的方法
  • 堆:存放由new建立的對象和數組
  • 方法區:Class對象,static變量,常量池(常量)

JVM調優主要是針對 堆 區域的,一個JVM隻有一個堆記憶體,堆記憶體的大小是可以調節的,類加載器讀取類檔案後,一般會把類,方法,常量,變量,我們所有引用類型的真實對象,放入堆中。

類加載器雙親委派

垃圾回收

引用計數

複制

标記清除

ArrayList和LinkedList

  1. ArrayList是實作了基于動态數組的資料結構,而LinkedList是基于連結清單的資料結構;
  2. 對于随機通路get和set,ArrayList要優于LinkedList,因為LinkedList要移動指針;
  3. 對于添加和删除操作add和remove,一般大家都會說LinkedList要比ArrayList快,因為ArrayList要移動資料。但是實際情況并非這樣,對于添加或删除,LinkedList和ArrayList并不能明确說明誰快誰慢。
  4. 插入的資料量很小時,兩者差別不太大,當插入的資料量大時,大約在容量的1/10之前,LinkedList會優于ArrayList,在其後就劣與ArrayList,且越靠近後面越差。

HashMap

Jdk1.7:數組 + 連結清單 ( 當數組下标相同,則會在該下标下使用連結清單)

Jdk1.8:數組 + 連結清單 + 紅黑樹 (門檻值為8 如果連結清單長度>=8則會把連結清單變成紅黑樹 )

每個紅色結點的兩個子節點必須是黑色的。換句話說:從每個葉子到根的所有路徑上不能有兩個連續的紅色結點

從任一結點到其每個葉子的所有路徑都包含相同數目的黑色結點

往hashmap中put元素的時候,先根據key的hash值得到這個元素在數組中的位置(即下标),然後就可以把這個元素放到對應的位置中了。如果這個元素所在的位子上已經存放有其他元素了,那麼在同一個位子上的元素将以連結清單的形式存放,新加入的放在鍊頭,最先加入的放在鍊尾。(1.7)

1.8 加入紅黑樹,并且連結清單由頭插改為尾插

反射

JAVA 反射機制是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為 java 語言的反射機制。

Class.forName()

傳入類的路徑擷取

instance.getClass()

ClassLoader.LoadClass("cn.javaguide.TargetObject");

  1. 我們在使用 JDBC 連接配接資料庫時使用

    Class.forName()

    通過反射加載資料庫的驅動程式;
  2. Spring 架構的 IOC(動态加載管理 Bean)建立對象以及 AOP(動态代理)功能都和反射有聯系;

MySQL事務隔離級别

事務是一個不可分割的資料庫操作序列,也是資料庫并發控制的基本機關,其執行的結果将使資料庫從一種一緻性狀态變遷到另一種一緻性狀态。事務是邏輯上的一組操作,要麼全部執行,要麼全部不執行。

事務的四大特征

1.原子性:事務是最小的執行機關,不允許分割。事務的原子性確定動作要麼全部完成,要麼完全不起作用

2.一緻性:執行事務前後,資料保持一緻,多個事務對同一個資料讀取的結果是相同的。

3.隔離性:并發通路資料庫時,一個使用者的事務不被其他事務所幹擾,各并發事務之間資料庫是獨立的

4.持久性:一個事務被送出之後。它對資料庫中資料的改變是持久的,即使資料庫發生故障也不應該對其有任何影響

預設是可重複讀

Java開發崗面試題小結

髒讀:一個事務讀到另外一個事務還沒有送出的資料

幻讀:在一個事務的兩次查詢中資料不一緻,例如有一個事務查詢了幾列(RoW)資料,而另一個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就會發現有幾列資料是它先前所沒有的。

不可重複讀(Non- repeatable read):在一個事務的兩次查詢之中資料不一緻,這可能是兩次查詢過程中間插入了個事務更新的原有的資料。

三次握手 運輸層

Java開發崗面試題小結

三次握手的目的是為了确認用戶端和服務端的收發功能是正常的。

1.用戶端的發送功能;

2.用戶端的接收功能;

3.服務端的發送功能;

4.服務端的接收功能;

第一次握手是用戶端主動發起的,當第一次握手的封包被送達服務端的時候,服務端就知道自己的接收功能是完好的了。伺服器接收正常

第二次握手是伺服器端發起的,這時候就可以知道用戶端的發送和接收功能都是正常的。

第三次握手是用戶端發起的,最後确定伺服器端的發送功能是正常的。

能接收就說明接收功能正常;但是能發送不一定代表發送功能正常,發送功能需要通過seq(寫信)和ack(回信)才能判斷

重定向和請求轉發

轉發是伺服器行為,重定向是用戶端行為。

  1. 從位址欄顯示來說

    forward是伺服器請求資源,伺服器直接通路目标位址的URL,把那個URL的響應内容讀取過來,然後把這些内容再發給浏覽器.浏覽器根本不知道伺服器發送的内容從哪裡來的,是以它的位址欄還是原來的位址.

    redirect是服務端根據邏輯,發送一個狀态碼,告訴浏覽器重新去請求那個位址.是以位址欄顯示的是新的URL.

  2. 從資料共享來說

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

    redirect:不能共享資料.

  3. 從運用地方來說

    forward:一般用于使用者登陸的時候,根據角色轉發到相應的子產品.

    redirect:一般用于使用者登出登陸時傳回首頁面和跳轉到其它的網站等

  4. 從效率來說

    forward:高.

    redirect:低.

SSL

SSL加密是建立在非對稱加密算法的基礎上的。非對稱加密算法會産生一對長字元串,稱為密鑰對(公鑰、私鑰)。資料使用公鑰進行加密後,

唯一隻能使用私鑰才能解開。安裝了伺服器證書的網站,其實是把私鑰儲存在伺服器中,而把公鑰連同網站相關資訊(如:域名、所有者名稱、有效期)制作成一張SSL證書,并把SSL證書公布到網際網路上。

當使用者通路網站的時候邊能得到這張SSL證書,當使用者送出資料時,用戶端使用保護的公鑰的SSL證書對資料進行加密。由于非對稱加密必須使用私鑰才能解密,那麼在網絡傳輸時,即使資料被截獲,由于截獲者無法得到私鑰,那麼截獲者也就無法破解密文。是以建立在SSL加密的HTTPS協定才會被認為是安全的,HTTPS網站才會被Chrome等主流浏覽器認為是安全的網站。

面向對象

封裝(抽象):對象是封裝的最基本機關,把對同一事物進行操作的方法和相關的方法放在同一個類中,把方法和它操作的資料放在同一個類中。私有的屬性,公有的方法。即将對象封裝成一個高度自治和相對封閉的個體。

司機将火車刹住了,刹車的動作是配置設定給司機,還是配置設定給火車,顯然,應該配置設定給火車,因為司機自身是不可能有那麼大的力氣将一個火車給停下來的,隻有火車自己才能完成這一動作,火車需要調用内部的離合器和刹車片等多個器件協作才能完成刹車這個動作,司機刹車的過程隻是給火車發了一個消息,通知火車要執行刹車動作而已。

繼承:繼承是子類自動共享父類資料和方法的機制,這是類之間的一種關系, 提高了軟體的可重用性和可擴充性。

多态:對于同一個行為,不同的子類對象具有不同的表現形式。同一個事件發生在不同的對象上會産生不同的結果。

面向對象和面向過程的異同點:舉例吃菜

多态的實作方式

方法的重載和重寫都是實作多态的方式,差別在于重載實作的是編譯時的多态性,而重寫實作的是運作時的多态性。

重載:一個類中有多個同名的方法,但是具有有不同的參數清單(參數類型不同、參數個數不同或者二者都不同)。

重寫:發生在子類與父類之間,子類對父類的方法進行重寫,參數都不能改變,傳回值類型可以不相同,但是必須是父類傳回值的派生類。即外殼不變,核心重寫!重寫的好處在于子類可以根據需要,定義特定于自己的行為。

Error 和 Exception 有什麼差別?

Error 和 Exception 都是 Throwable 的子類

Error 表示系統級的錯誤和程式不必處理的異常,是恢複不是不可能但很困難的情況下的一種嚴重問題,比如記憶體溢出,不可能指望程式能處理這樣的情況。

Exception 表示需要捕捉或者需要程式進行處理的異常,是一種設計或實作問題,也就是說,它表示如果程式運作正常,從不會發生的情況。

編譯和運作的差別

編譯時類型指在聲明對象時所采用的類型

運作時類型指為對象指派時所采用的類型

1.編譯就是将java代碼交給編譯器進行文法檢查,如果沒有錯誤就生成.class檔案

2.運作就是将位元組碼檔案(.class)交給java虛拟機執行,如果沒有邏輯錯誤,就成功出現結果。

編譯期和運作期記憶體的配置設定

1.編譯期僅僅知道記憶體配置設定的位置和大小,不做具體的配置設定操作

2.運作期确定真正的配置設定,确定配置設定的大小以及位置

InnoDB與MyISAM的差別

(1)事務:MyISAM不支援事務,InnoDB支援事務。

(2)鎖級别:MyISAM隻支援表級鎖,InnoDB支援行級鎖和表級鎖,預設使用行級鎖,但是行鎖隻有通過索引查詢資料才會使用,否則将使用表鎖。

(3)主鍵和外鍵:MyISAM 允許沒有任何索引和主鍵的表存在,不支援外鍵。InnoDB的主鍵不能為空且支援主鍵自增長,如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6位元組的主鍵,支援外鍵完整性限制。

(4)索引結構:MyISAM 和 InnoDB 都是使用B+樹索引,MyISAM的主鍵索引和輔助索引的Data域都是儲存行資料記錄的位址。但是InnoDB的主鍵索引的Data域儲存的不是行資料記錄的位址,而是儲存該行的所有資料内容,而輔助索引的Data域儲存的則是主索引的值。

InnoDB 行鎖

  • 共享鎖(S鎖、讀鎖):多個事務可以對同一資料行共享一把S鎖,但隻能進行讀不能修改;
  • 排它鎖(X鎖、寫鎖):一個事務擷取排它鎖之後,可以對鎖定範圍内的資料行執行寫操作,在鎖定期間,其他事務不能再擷取這部分資料行的鎖(共享鎖、排它鎖),隻允許擷取到排它鎖的事務進行更新資料。

== 和 equals 的差別是什麼?

一、對象類型不同

1、equals():是超類Object中的方法。

2、==:是操作符。

二、比較的對象不同

1、equals():用來檢測兩個對象是否相等,即兩個對象的内容是否相等。

2、==:用于比較引用和比較基本資料類型時具有不同的功能,具體如下:

(1)、基礎資料類型:比較的是他們的值是否相等,比如兩個int類型的變量,比較的是變量的值是否一樣。

(2)、引用資料類型:比較的是引用的位址是否相同,比如說建立了兩個User對象,比較的是兩個User的位址是否一樣。

三、運作速度不同

1、equals():沒有 == 運作速度快。

2、== 運作速度比equals()快,因為 == 隻是比較引用。

總結:equals方法比較的是對象的值是否相等,而 == 比較的是引用是否相等,也就是說,如果當兩個對象的值一樣但是引用位址不一樣的時候,用equals比較是true但是用 == 就是false。

補充:Java有 5種引用類型(對象類型):類 接口 數組 枚舉 标注

堆和棧

1 棧:為編譯器自動配置設定和釋放,如函數參數、局部變量、臨時變量等等

2 堆:為成員配置設定和釋放,由程式員自己申請、自己釋放。否則發生記憶體洩露。典型為使用new申請的堆内容。

3 靜态存儲區:記憶體在程式編譯的時候就已經配置設定好,這塊記憶體在程式的整個運作期間都存在。它主要存放靜态資料、全局資料和常量。

Spring SpringMVC

DispatcherServlet、請求攔截轉發、處理器适配、視圖解析傳回

SpringBoot

提供了各種啟動器,開發者能快速上手,是以 SpringBoot 是⼀個服務于架構的架構,服務範圍是簡化配置⽂件。Spring Boot 優點,如:(1)獨立運作(2)簡化配置(3)自動配置(4)無代碼生成和 XML 配置(5)應用監控(6) 上手容易

啟動:

運⾏帶有 mian ⽅法類。

類 上 需 要 加 @SpringBootApplication 注 解 , main ⽅ 法 中 使 ⽤

SpringApplication.run(類名.class,args);⾃動加載 application.properties ⽂件。

常見元件

spring-boot-starter-parent 	//boot 項目繼承的父項目子產品. 
spring-boot-starter-web 	//boot 項目內建 web 開發子產品.
spring-boot-starter-tomcat  //boot 項目內建 tomcat 内嵌伺服器. 
spring-boot-starter-test 	//boot 項目內建測試子產品.
mybatis-spring-boot-starter //boot 項目內建 mybatis 架構.
spring-boot-starter-jdbc 	//boot 項目底層內建 jdbc 實作資料庫操作支援.
其他諸多元件,可到 maven 中搜尋,或第三方 starter 元件到 github 上查詢
           

資料庫

第一:列不可再分,原子性

第二:屬性完全依賴主鍵

第三:非主鍵列之間不存在依賴關系

三級模式、兩層映像

資料庫系統的三級模式是指使用者模式、概念模式和存儲模式。(也稱外模式、概念模式、内模式)

兩個獨立性

邏輯資料獨立性

當概念模式變化時,可以不改變外部模式(隻需改變E-C Mapping),進而無需改變應用程式

實體資料獨立性

當内部模式變化時,可以不改變概念模式(隻需改變C-I Mapping) ,進而不改變外部模式

外模式到概念模式的映像實作了資料的邏輯獨立性。

概念模式到内模式的映像實作了資料的實體獨立性。

大資料

使用爬蟲等擷取實時資料+Flume+Kafka+Spark Streaming+mysql+Echarts實作資料動态實時采集、分析、展示

主要工作流程如下:

其中爬蟲擷取實時資料,并把資料實時傳輸到Linux本地檔案夾中。

使用Flume實時監控該檔案夾,如果發現檔案内容變動則進行處理,将資料抓取并傳遞到Kafka消息隊列中。

之後使用Spark Streaming 實時處理Kafka通道中的資料,并寫入本地mysql資料庫中,之後讀取mysql資料庫中的資料并基于Echart圖表對資料進行實時動态展示。

Java開發崗面試題小結

好看請贊,養成習慣:) 本文來自部落格園,作者:靠譜楊,

轉載請注明原文連結:https://www.cnblogs.com/rainbow-1/p/16603279.html

關于筆者: http://reliableyang.cn/

文章同步51CTO,可以幫忙踩一踩 ~ https://blog.51cto.com/u_15780522

更多日常分享盡在我的VX公衆号:小楊的挨踢IT生活