【Java面試】面試相關準備
阿新 • • 發佈:2018-12-18
- 執行緒的安全性?
- 建立執行緒的3種方式?
- 繼承執行緒類建立執行緒
- 執行緒本質上是實現了可執行的介面的一個例項,代表一個執行緒的例項。通過例項化一個執行緒物件,然後執行此物件的開始()方法,開始是一個本地方法,他將啟動一個執行緒,並執行執行()方法。
- 建立這種多執行緒,執行緒繼承類,重寫執行然後()方法,就可以了
- 的run()方法是先執行完一個執行緒後再執行下一個,即為順序執行,但是開始()【其實為啟動()。執行(),啟動會自動呼叫執行()方法】方法為同時開始執行,然後執行緒搶佔
- 執行緒本質上是實現了可執行的介面的一個例項,代表一個執行緒的例項。通過例項化一個執行緒物件,然後執行此物件的開始()方法,開始是一個本地方法,他將啟動一個執行緒,並執行執行()方法。
- 實現了Runnable介面建立執行緒
- 實現Runnable介面建立執行緒,必須需要新的Thread()來執行他的run()或者start()方法
- 通過呼叫和FutureTask建立執行緒
- 建立可呼叫介面的實現類,並實現呼叫方法
- 建立FutureTask實現類的例項,使用FutureTask類包裝Callable物件,該FutureTask物件封裝了callable物件得呼叫方法的返回值
- 使用FutureTask物件做為執行緒物件的目標建立並啟動執行緒
- 呼叫FutureTask物件得的get()方法來獲取子執行緒的執行結果的返回值
- 使用ExcutorService,可贖回,未來實現有返回結果的執行緒
- 建立可呼叫介面的實現類,並實現呼叫方法
- 建立FutureTask實現類的例項,使用FutureTask類包裝Callable物件,該FutureTask物件封裝了callable物件得呼叫方法的返回值
- 結合線程池介面ExcutorService實現有返回值的執行緒
- 繼承執行緒類建立執行緒
- 的StringBuffer,StringBuilder的區別?
- 字串:字串常量,StringBuffer的,StringBuilder的:字串緩衝區變數
- 執行速度:StringBuilder的> StringBuffrt>字串
- StringBuffer的:執行緒安全的,StringBuilder的:執行緒非安全的
- 使用:
- 操作少量資料用字串
- 單執行緒操作字串緩衝區下操作大量資料= StringBuilder
- 多執行緒操作字串緩衝區下操作大量資料 = StringBuffer
- StringBuilder和StringBuffer的擴容?
- StringBuiler和StringBuffer初始容量都是16,當需要擴容的時候,預設會擴容為2倍+2,但是預設擴容依舊不足的時候,會直接擴為需要的大小
- 專案中做的好的?
- IO?
- 集合?
- 基本資料型別
- 整數值型別:
- byte
- short
- int
- long
- 字元型
- char
- 浮點型別
- float
- Double
- 布林型
- Boolean
- 整數值型別:
整數預設為int,小數預設為double,float和long型別必須加字尾
- String類的常用方法?
- post與get的區別?
- 異常?
- 基本資料型別和引用資料型別的區別?
- 基本資料型別和包裝資料型別的區別?
- 包裝類是物件,擁有方法和欄位,物件得呼叫都是通過引用物件的地址,基本資料型別不是
- 包裝類是引用的傳遞,基本資料是值傳遞
- 宣告方式不同,包裝類需要new在堆記憶體中進行new來分配記憶體空間,基本資料型別不需要new關鍵字
- 儲存方式不同:基本資料型別直接將值儲存在棧中,包裝類是把new的物件儲存在堆中,在棧中通過物件得引用來調它們
- 初始值不同,基本資料型別初始值為0、boolean型別的初始值為false,包裝類的初始值為null;
- 使用方式不同,基本資料型別直接賦值,包裝類是在集合collection Map時會用的
- int與Integer的區別?
- 位元組流與字元流的區別
- 位元組流是byte型別,一個位元組佔8bit,位元組範圍為-128~127,
- 字元流無符號,一般來說1個字元佔2個位元組,範圍為0~65535
- ArrayList與LinkList的區別
- Arraylist是以陣列的形式儲存的,在記憶體中是連續的,它查詢快,但是增加和刪除比較緩慢
- Linklist是以連結串列的形式儲存的,在記憶體中不連續,所以它查詢慢,LinkList之間用的是引用的方式來“連線”其他內容,所以它增加和刪除快
- String與Stringbuffer的區別
- String類是字串常量,它無法被繼承,所以他是一個final類(final類無法被繼承),
- Stringbuffer是字串緩衝區,它是執行緒安全的並且它的速度比Sting快比Stringbuilder慢,因為Stringbuilder是執行緒不安全的,並且Stringbuffer執行緒安全,所以它在併發的時候需要鎖,會有資源競爭,會有記憶體切換,所以會導致Stringbuffer的速度比Stringbuilder的慢
- HashMap的原理?
- HashMap是一個數組與連結串列結合的“連結串列雜湊”的資料結構,HashMap底層是一個數組,陣列中的每一項都是一個連結串列。HashMap會在內部維護一個Entry<K,V>,陣列的預設長度為16,每次往HashMap中存放key-value的時候,都會為他們例項化一個Entry物件,通過雜湊值hash-->hash(k.hashcode())來得到k對應在陣列Entry處的下標,即陣列的索引,當hashcode()值相同的時候,就形成了雜湊衝突,此時則會在相同hashcode()的陣列索引處進行連結串列儲存
- Key=null的時候存在第一位,因為key=null時的索引計算為0
- HashMap中的put與get怎麼工作?
- Put
- put(key,value)
- 對key=null做判斷,為空的時候被儲存到陣列索引為0的地方
- Key的hashcode方法被呼叫,然後計算出hash值,通過hash值找到對應的Entry物件的陣列的索引
- 通過indexFor(hash,table.length)用來計算Entry物件在陣列中的精確下標,如果有雜湊衝突,則會迭代連結串列,一直到Entry-->next==null,則會儲存在首位即當前Entry物件變為連結串列下一個節點
- get(key,value)
- 對key=null做判斷,為空的時候被儲存到陣列索引為0的地方
- Key的hashcode方法被呼叫,然後計算出hash值,通過hash值找到對應的Entry物件的陣列的索引
- 通過indexFor(hash,table.length)用來計算Entry物件在陣列中的精確下標,呼叫equals方法比較key
- put(key,value)
- Put
- HashMap在什麼時候會導致死迴圈?
- 在併發執行緒中,當2個執行緒同時儲存相同的資料,會導致HashMap的Entry連結串列末尾形成環,下次進行資料儲存的時候,會導致在末尾形成環,找不到HashMap的末尾,導致形成死迴圈,HashTable也會形成死迴圈,但是ConcurrentHashMap會避免這個問題。
- 靜態修飾和用關鍵字transient修飾的不能被序列化
- 因為序列化是把物件資料進行持久化儲存,而靜態的屬性是屬於類載入時的資料,不會被序列化
- flush()與close()的區別?
- Properties?
- Map集合的一種,Hashtable的子集,它的鍵值都是String型別,它是唯一能與IO流結合使用的集合
- Load()將流對應的檔案中的資料寫入到集合中
- Store()將集合中的資料寫入到流對應的檔案中
- Map集合的一種,Hashtable的子集,它的鍵值都是String型別,它是唯一能與IO流結合使用的集合
- 實現Runnable的原理?
- 為什麼需要定義一個類去實現Runnable介面?、
- 實現Runnable介面,為了解決繼承Thread類的單繼承侷限性,定義一個類,去實現Runnable介面,然後重寫Runnable介面的run()方法,在run()方法中實現執行緒任務
- 繼承Thread類和實現Runnable介面的區別?
- 建立Thread類,只有new Thread()才可以建立執行緒
- 實現Runnable介面,要重寫run(),執行緒任務已經被封裝到重寫的run()方法中,實現Runnable介面的子類,需要建立Thread類,並將新建的子類作為引數傳入new的Thread構造方法中,這樣執行緒物件和執行緒任務就能很清晰的表現出來,達到一定的解耦目的
- 為什麼需要定義一個類去實現Runnable介面?、
- 實現Runnable介面的好處?
- 繼承Thread類有單繼承的侷限性,實現Runnable介面則避免的單繼承的侷限性
- 繼承Thread類,多執行緒需要建立多個new Thread(),表示多個執行緒每個執行緒獨立的執行run()方法,即多執行緒分別完成自己的任務;子類實現Runnable介面,然後例項化多個Thread類進行多執行緒,這些new Thread()執行緒共同執行重寫的run()方法,多個執行緒執行同一個任務,即資源共享
- 介面和繼承的區別?
- 更具體的說,應該是介面和抽象類的區別
- 修飾符不一樣:抽象類--abstract,介面--interface
- 抽象類是對類的抽象,是自下往上進行抽象,抽象出來的是類的共性,介面是對行為的抽象,無關其他
- 抽象類可以擁有已經被實現的類,但是必須包含一個抽象方法,介面可以有成員變數,介面是完全由抽象方法組成
- 更具體的說,應該是介面和抽象類的區別
- 建立執行緒的2種方式?
- 繼承Thread類
- 建立繼承Thread類的
- 子類重寫run()方法
- 主函式建立繼承Thread類的物件
- 物件.start()方法啟動執行緒,通過JVM呼叫執行緒中的run()方法
- 實現Runnable介面
- 建立實現Runnable介面的子類
- 子類重寫run()方法
- 主函式中建立實現Runnable介面的子類的物件
- 將建立的物件作為引數傳遞給建立的執行緒物件new Thread()
- 執行緒物件.start()方法啟動執行緒,通過JVM呼叫執行緒中的run()方法
- 繼承Thread類
- 靜態方法與非靜態方法的區別?
- 靜態方法用static修飾符修飾,並且靜態方法在類定義的時候就已經被載入和分配,靜態方法內部只能有static修飾的類或者變數,靜態方法只能呼叫靜態方法或者靜態成員變數
- 非靜態方法在類被例項化成物件得時候才會分配到記憶體,在類定義的時候並沒有佔用記憶體,非靜態類可以呼叫靜態或者靜態類的方法或變數
- synchronize鎖修飾非靜態和靜態方法的物件是什麼?
- 同步方法synchronize(this)
- 靜態同步方法synchronize(類.class)
- sleep和wait的區別?
- Sleep:不釋放鎖物件,釋放CPU使用權,等待期間無法被喚醒
- Wait:釋放鎖物件,釋放CPU使用權,等待期間可以被喚醒
- 鎖物件可以是任意物件
- JAVA記憶體分配?
- 棧:存放基本資料型別和物件得應用
- 堆:存放new建立的物件和陣列,在堆中分配的記憶體,由Java虛擬機器的自動垃圾回收來管理
- 靜態域:存放在物件中用static定義的靜態成員
- 常量池:存放常量
- 註解的原理與定義?
- Redis的持久化機制?
- SpringMVC啟動流程?
- Tomcat載入springMVC啟動流程?
- Redis能幹什麼?
- 序列化?
- 序列化與反序列化?
- 用於從流中讀取物件的操作流ObjectInputStream稱為反序列化流
- 用於向流中寫入物件的操作流ObjectOutputStream稱為序列化流
- 特點:用於操作物件,可以將物件寫入檔案中,也可以從從檔案中讀取物件
- 物件序列化流ObjectOutputStream(將物件寫入硬碟)
- ObjectOutputStream將java物件的基本資料和影象寫入OutputStream,ObjectinputStream可以讀取(重構)物件。
- 通過在流中使用檔案可以實現物件的持久化儲存。
- 只能將支援java.io.Serializable介面的物件寫入流中
- 物件反序列化流ObjectInputStream
- ObjectInputStream對以前使用ObjectOutputStream寫入的基本資料和物件進行反序列化操作。只能將支援java.io.Serializable介面的物件讀取到流中
- 序列化介面
- 當一個物件要被序列化時,這個類必須實現Serializable介面,如果不實現Serializable介面,會出現NoSerializeableException異常
- 當一個物件所屬的class檔案在序列化後進行修改,然後進行反序列化的時候對出現InvalidClassException異常
- 原因:
- 該類的序列版本號與從流中讀取的類描述的版本號不一致
- 該類包含位置資料型別
- 該類沒有可訪問的無參構造方法
- 原因:
- Serializable標記介面,該介面給需要例項化的類,提供了一個序列版本號serializableId,該版本號的目的在於驗證序列化的物件和對應類是否版本匹配
- 無法被序列化的
- transient:
- 用關鍵字transient修飾的屬性,序列化時這個屬性不會被序列化
- 靜態屬性
- 靜態修飾也不會被序列化,序列化是把物件資料進行持久化儲存,而靜態的屬於類載入時的資料,不會被序列化
- transient:
- 在類中增加writeObject 和 readObject 方法可以實現自定義序列化策略
- 序列化與反序列化?
- 為什麼要序列化?
- https://www.cnblogs.com/lucky-star-star/p/5415610.html
- 序列化就是對例項物件的狀態進行通用編碼並儲存,以保證物件的完整性合可傳遞性,簡而言之,序列化就是為了在不同時間或者不同平臺的JVM之間共享例項物件
- 什麼時候使用序列化?
- 資料持久化儲存,將資料儲存到檔案或者磁碟中
- Socket通訊過程中使用序列化
- RMI遠端呼叫使用序列化
- 選擇性序列化?
- Transient關鍵字修飾
- Externalizable介面實現自定義序列化
- 通過writeObject和readObject進行自定義序列化,否則會進行預設序列化
- ConcurrentHashMap與HashTable的區別?
- (https://blog.csdn.net/basycia/article/details/51890699)
- 它們都可以用於多執行緒的環境,但是當HashTable的大小增加到一定的時候,效能就會急劇下降,因為迭代需要被鎖定很長的時間。
- ConcurrentHashMap引入了分割,預設分割為16,不論大小變得多大,僅僅鎖定map的一部分,使得其他執行緒不用等到迭代完成才能訪問map;ConcurrentHashMap鎖定部分,而HashTable會鎖定全部,
- 能否讓HashaMap同步?
- HashMap可以通過下面的語句進行同步:
- Map m = Collections.synchronizeMap(hashMap);
- HashMap可以通過下面的語句進行同步:
- Iterator迭代器的fail-fast和其他fail的區別?
- HashMap與HashTable的區別?
- HashMap是非同步,執行緒不安全的,鍵值可以為null,迭代器為Iterator,當有其他執行緒改變了HashMap的結構(增加或者刪除),將會丟擲ConcurrentModificationException異常,但是迭代器本身的remove()方法移除元素不會丟擲ConcurrentModificationException異常,但是這並不是一個一定發生的行為,要看jvm
- HashTable是同步,執行緒安全的,就是說多執行緒可以共享資源,鍵值不能為null,迭代器為enumerator
- Sychronized,意味著每次只能有一個執行緒更改HashTable;任何執行緒要更新HashTable時首先要獲取同步鎖,其他執行緒要等到同步鎖被釋放後才能更新HashTable
- 執行緒安全的2個要素?
- 記憶體可見性(可見性)
- 當變數被修改,該變數的修改會被重新整理到記憶體中,當一個執行緒需要讀取該變數時,回去記憶體中讀取新值而不是以前的值(synchronized,lock,volatile都可以保證)
- 操作一致性(原子性)
- 指的是操作不可中斷
- 有序性
- 記憶體可見性(可見性)
- Synchronized,lock,volatile的區別?
- Callable可以捕獲異常,Runnable不可以捕獲異常
- 為什麼要有動態代理?
- 如何實現一個動態代理物件?
- Jdk實現動態代理
- 被代理類需要有統一的實現介面
- 通過java內部的反射機制來實現的,反射機制在生成類的過程中比較高效
- cglib實現動態代理
- cglib底層是藉助asm來實現的,asm在生成類之後的相關執行過程中比較高效
- 被代理類可以沒有統一介面,
- Jdk實現動態代理
- 實現動態代理物件的3個引數是什麼?
- 類載入器
- 被呼叫的介面的class物件
- 回撥
- 動態代理自我理解?
- Jdk實現動態代理
- 動態代理被代理類是一個介面,需要一個實現該介面的實體類,然後中介類需要實現InvactionHandler介面,並且重寫invoke()方法,main函式中,需要建立代理物件:代理類 xx = (代理類)Proxy.newProxyInstance(類載入器,被呼叫的介面的class物件,回撥)
- cglib實現動態代理
- 被代理類沒有統一介面的時候,可以使用cglib來實現動態代理
- Jdk實現動態代理
- 執行緒的執行過程?
- 執行緒池的建立?
- newCachedThreadPool:建立一個可快取的執行緒池
- newSingleExecutor:建立一個單一執行緒池,用唯一的工作執行緒來執行任務,按照指定的順序來執行
- newFixedThreadPool:建立一個定長的執行緒池,控制最大執行緒,超過最大放入等待佇列
- newScheduledThreadPool:建立一個定長的執行緒池,支援定時以及週期性執行任務
- 怎麼停止一個執行緒?
- 使用Thread.stop()暴力停止,但不能保證執行緒原子性
- 使用interrupt()中斷執行緒
- 使用標誌符號來停止執行緒
- 執行緒池的引數?
- 核心執行緒數
- 最大執行緒數
- 阻塞佇列
- 拒絕策略
- 還有保活時間
- 執行緒池的執行流程?
- 開啟一個執行緒後,判斷是否超過核心執行緒數,沒有超過的話建立執行緒執行,超過了判斷阻塞佇列
- 阻塞佇列未滿的話,放入阻塞佇列,如果執行緒已經滿了的話,判斷最大執行緒數
- 如果未達到最大執行緒數,則立馬建立最大執行緒,如果最大執行緒滿了,進行拒絕策略
- 拒絕策略
- 立即執行
- 丟擲異常
- 丟棄
- 資料庫連線池的實現?
- 自定義連線處
- 提供容器與初始化
- 連線連線池
- 歸還連線
- C3P0連線池
- 匯入jar包
- 配置配置檔案
- 常用屬性配置
- 使用者名稱
- 密碼
- 驅動
- Url
- 初始化連線數
- 最大連線數
- 無可用連線池時建立連結數
- 超時時間
- 工具類實現連線
- DBCP連線池
- 匯入jar包
- 配置檔案
- 常用屬性配置
- 工具類實現連線
- 自定義連線處
- 資料庫連線?
- 建立驅動:DriveManager
- 建立資料庫連線:conncetion
- 檢查連線:statement
- 執行緒同步的方法?
- 使用同步方法
- 使用同步程式碼塊
- 使用特殊域變數(volatile)
- 使用ReentrantLock類
- mysql引擎?
- innoDB
- 支援事務表安全,支援行級鎖定和外來鍵
- 處理大容量資料庫的
- Memory
- MyISAM:鎖整個表查詢的時候效率高
-
Archive
- innoDB
- 資料庫事物處理
- 原子性:事物沒有中間狀態,要麼是改變前的原始狀態,要麼是改變後的狀態
- 一致性:資料狀態不會改變
- 隔離性:一個執行緒執行事物時對其他執行緒不可見
- 永續性:事物被修改後是永久修改,即使資料庫壞了又恢復也是永久修改後的
- list、set、map的區別
- list、set實現了collection的介面
- list:
- 按序儲存,保證了元素的插入順序
- 可允許多個重複物件
- 可允許多個null
- 常用的為:ArrayList、LinkedList、Vector
- ArrayList適用於查詢
- LinkedList適用於新增和刪除
- Set
- 無序儲存,不保證元素的插入順序
- 不允許重複
- 只允許一個null
- Map
- Map是一個介面,為key,vaule的形式儲存
- 一般使用HashMap等來實現map介面
- Map可以有多個value為null,key只能有一個null
- 想要對list進行排序,可以是用collection.sort(list)來實現
- springMVC的原理
- sleep與wait區別
- sleep:不釋放鎖資源,等待期間無法被喚醒,釋放cpu使用權
- wait:釋放鎖資源,等待期間可以被喚醒,釋放cpu使用權
- 位元組流字元流是執行緒安全的麼?
- Hashmap與hashtable的區別?
- Hashmap是執行緒不安全的,hashtable是執行緒安全的
- Hashmap可以為null,但是hashtable不能為空
- Hashmap取消了contains方法,只有containsKey和containsValue,hashtable三個全有
- Hashmap預設容量為16,擴容為2倍,hashtable預設容量為11,擴容為2倍+1
- Hashtable直接使用物件的hashcode,而hashmap需要重新計算hash值
- http與https的區別
- https需要到ca申請證書
- http是超文字傳輸協議,使用明文傳輸,https是具有安全性和ssl協議的安全傳輸協議
- http和https使用不同的連結方式,使用的埠也不同,http使用的是80埠,https使用的是443埠
- http使用無狀態的連結方式,https是使用ssl+http協議構建的可進行加密傳輸,身份認證的網路傳輸,比http協議安全
- Synchronized,lock,volatile的區別?
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------- 6月25日科軟體電話面試-------------------------- --------------
- 資料庫優化
- Javabean的存在哪裡
- 春天在SSM中起的作用
- SpringIOC:控制反轉,依賴注入
- 裝載豆,也就是裝載的Java中的類,當然也包括服務,DAO中的,有了這個機制,我們就不用在每次使用這個功能的時候為他初始化
- SpringIOC:控制反轉,依賴注入
- MyBatis的在SSM中起的作用
- MyBatis的是對JDBC的封裝,他讓資料庫底層操作邊的透明,MyBatis的都是圍繞著一個SqlSessionFactory的例項展開的。
- MyBatis的經常通過配置檔案關聯到各實體類的對映器檔案對映器檔案配置了每個類對資料庫所需的SQL語句對映,每次與資料庫互動時,通過的SqlSessionFactory拿到一個SQLSESSION,再執行SQL命令
- 用SpringMVC的原理
- 客戶端傳送請求到DispacherServlet(前端控制器)
- 由DispacherServlet控制器查詢的HandlerMapping,找到處理請求的控制器
- 控制器呼叫業務邏輯處理後,返回的ModelAndView
- DispacherServlet查詢檢視解析器,ModelAndView的找到渲染的檢視
- 檢視將結果顯示到客戶端
- SpirngIOC和springaop在哪用怎麼用的
- https://www.cnblogs.com/best/p/5727935.html
- 談一談的ConcurrentHashMap
- 專案中集合用的什麼(ArrayList的和連結串列)
- SSM事物的用法
- MySQL的調優
- 當只要一行資料時使用LIMIT 1
- 為搜尋欄位建索引
- 避免SELECT *
- 永遠為每張表設定一個ID
- 儘可能的使用NOT NULL
- 把IP 地址存成UNSIGNED INT
- 什麼情況下索引會失效
- 條件中有或索引會失效
- 像查詢,使用%開頭,索引會失效
- 列型別為字串,如果的sql語句中沒有對此字串加引號也會失效
- 索引列加函式也會失效