面試筆記

面試筆記

跨域問題

由於同源策略, 當客戶端和服務端再也不同一域下時, 要解決請求的跨域問題java

通常有兩種方法 1) JSONP  2) CORSnode

JSONP僅限於GET請求,有必定的侷限性web

CORS能夠知足多種方法的請求, 須要作的是對response的響應頭改寫, 處理方式能夠用Filter過濾指定範圍的請求面試

簡單請求和非簡單請求

CORS請求分爲簡單請求和非簡單請求redis

簡單請求要知足如下條件算法

  1. 請求方法在這三個之內: HEAD \ GET \ POST
  2. 頭部不超過如下幾種字段:   AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type(只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain)

非簡單請求時指對服務器有特殊要求的請求數據庫

好比PUT \ DELETE方法, Content-Type是application/json的請求編程

非簡單請求會先發送一個預檢請求, 用OPTION方法.json

RPC是什麼

Remote Procedure Call \ 遠程過程調用 : 一個計算機通信協議, 能夠實現像調用本地服務同樣調用遠程服務, 而且讓網絡通信過程透明. 通常使用IDL接口定義語言, 方便跨平臺遠程過程調用.設計模式

如阿里巴巴的hsf、dubbo(開源)、Facebook的thrift(開源)、Google grpc(開源)、Twitter的finagle(開源)等都是基於RPC的框架.

RPC作到讓中間的網絡通信過程透明化, 通常選擇動態代理的方式實現.

  1. 肯定消息數據結構, 對消息進行序列化
  2. 進行網絡通信, 通常要支持BIO和NIO兩種方式, 能夠1) 本身開發JAVA NIO方式 2) 基於MINA 3) 基於Netty
  3. 消息裏面有requestID是由於解決多條線程異步請求服務時, 回調能保證給正確的線程.

序列化

序列化是將數據結構或者對象轉化成二進制串, 也就是編碼的過程.

反序列化是將二進制串轉換成數據結構或者對象的過程.

序列化是爲了 進行網絡傳輸

反序列化是爲了 後續對其處理

Netty

Netty是一款基於NIO開發的網絡通訊框架, 對比於BIO, 他的併發性能獲得很大提升.

不少RPC框架是基於Netty這一IO通訊框架, 好比阿里的HSF, Dubbo, Twitter的finagle等.

RPC和HTTP的區別

RPC是基於TCP/IP協議的 , HTTP是基於HTTP協議的 , 傳輸效率RPC效率更高一些 .

代理模式

結構性模式,不是建立型模式

咱們建立具備現有對象的對象, 並向外界提供功能接口. 以解決直接訪問對象時帶來的問題, 好比訪問情景多樣化, 直接訪問會給使用者或者系統結構帶來不少麻煩, 因此在訪問此對象時, 加上一個對此對象的訪問層.

代理模式是指 一個公共接口,一個實現類,一個代理類,代理類持有實現類實例,代理執行實例方法。 執行過程當中不直接訪問實體對象,而是經過代理對象訪問。

代理過程當中能夠加上一些其餘的用途。Spring的AOP面向切面編程是基於動態代理, 切入的點就是一個個被代理的類.

靜態代理

代理類和實體類已經肯定, 在編譯以前已經完成.

動態代理

在程序執行過程當中建立代理類是動態代理. 能夠統一的管理代理類.

java.lang.reflect包下的Proxy類用來動態建立一個代理對象的類

而且須要實現InvocationHandler這個接口,讓每一個代理類的實例都關聯到了一個handler,當咱們經過代理對象調用一個方法的時候,這個方法的調用就會被轉發爲由InvocationHandler這個接口的 invoke 方法來進行調用

  1. 定義接口
  2. 定義實現類
  3. 實現InvocationHandler接口, 能夠在invoke方法中加入預處理和後處理
  4. Proxy.newProxyInstance建立對應的代理對象

什麼是RESTful

 RESTful是一種架構風格, REST意思是表示層狀態轉化(Representation state transfer)

REST的特色是

  1. 面向資源  通常使用json或者xml的形式
  2. URI 惟必定位標識符  至少有一個URI定位到資源
  3. 統一接口  用HTTP的方法表示CRUD操做
  4. 無狀態  能夠直接定位, 和其餘資源沒有前置關係

依賴注入

 

異步同步

同步

程序同步執行 , 當代碼A執行完以後再執行B , 若是A沒有執行完 , B要等待 .

異步

程序異步執行 , 當代碼A執行中 , B不須要等待A執行完再執行 , 能夠進入就緒狀態準備執行 . 

回調函數

在A代碼片斷中 , 會執行B , 當B執行完 , B會執行A的callback函數 . 這是一種機制 . 能夠將A和B抽象成接口 , 易於擴展 .

Spring 核心功能

Spring core 

核心功能 , 核心容器提供IoC

Spring AOP

面向切面編程

Spring web

提供了針對web開發的特性

Spring Dao

集成了JDBC , 簡化了DAO的開發步驟

Spring ORM

整合了第三方持久層框架

Spring MVC

提供了web的MVC實現

響應式編程 

根據數據流和變化作出響應 , 經過異步和回調的方式 .

如何在上下文中獲取bean

  1. ContextLoader
  2. new FileSystemXmlApplicationContext("applicationContext.xml");
  3. WebApplicationContextUtils

TCP和UDP的區別

TCP須要創建鏈接,UDP不須要創建鏈接 TCP的數據是可靠的,UDP不可靠 TCP的採用流的形式,UDP是報文的形式

對比Vector、ArrayList、LinkedList有何區別?

Vector和ArrayList都是數組形式的集合,Vector是線程安全的,ArrayList不是. ArrayList讀取比較快,增刪比較慢, LinkedLIst不是線程安全的,是鏈表形式的,他的增刪比較快,可是讀取慢 ArrayList初始容量是10,當有數組添加時才真正的分配容量 每次都是經過copyOf的方式擴容到以前的1.5倍

關於索引

索引的數據結構是:B+樹 B-樹 散列表 索引是放在內存中的,能夠實現快速查詢,可是會下降更新表的速度。 索引不走like,可是‘xx%’會走 索引列不能有null值

SQL優化

儘可能在常常用的where和order by上建索引 儘可能不要用in not in ,會掃描全表 儘可能少用or ,會放棄索引

SOA

面向服務的架構 , 鬆耦合 位置透明 可在異構平臺複用 便於測試

dubbo和Spring cloud

Dubbo是一個開源的SOA治理方案,是一個分佈式服務框架。 註冊中心嚴重依賴第三方zookeeper或者redis,組件出現問題,服務會中斷 Dubbo只支持RPC調用 SpringCloud有本身的註冊組件Eureka 支持RESTfulAPI 消息組建是Stream 集成了MQ和Apache kafka

ThreadLocal

線程本地副本 每一個線程都會有一個副本,ThreadLocal建立的副本是存在線程的ThreadLocals裏面 應用在數據庫鏈接 session管理方面 解決了線程安全問題 線程能夠隨時訪問 適用set/get方法。

Serializable序列化

java支持序列化機制,將一個對象表示爲一個字節序列

callable和runable的區別

callable的方法是call(),runnable的方法是run() Callable執行方法有返回值 Runnable的執行方法沒有返回值 Callable返回一個Future對象,能夠經過get獲取結果

volatile關鍵字

具備可見性,就是被修飾的變量,一旦被其餘線程修改,會當即同步給主存,讓其餘線程知道 沒有原子性 由於被修飾的變量能夠被多線程修改

線程池

頻繁的建立和銷燬線程會下降工做效率 提升線程利用率 經常使用參數 corePoolSize(線程池大小) maximumPoolSize(最大線程數) keepAliveTime(可空閒時間) 執行順序 1. 當前線程小於核心線程數,建立線程 2. 當前線程大於核心線程數,進入任務隊列 3. 任務隊列滿了,核心線程數小於最大線程數,建立線程 4. 拋出異常

Integer的緩存範圍

-127~128

synchronized和鎖(ReentrantLock) 區別

synchronized最慢 synchronized和lock是實現同步鎖(原子性)的兩種方式 Lock提供了更普遍,更優雅的方式. synchronized在執行完後會自動釋放,lock要手動釋放 synchronized是jvm裏面的,是java的關鍵字,lock是一個類 synchronized會讓等待的線程一直等待,lock會嘗試得到鎖

如何保證集合是線程安全的

ConrurentHashMap作了什麼 線程安全:Vector HashTable StringBuffer 線程不安全:ArrayList LinkedList HashMap HashSet TreeMap TreeSet StringBuilder Collections.synchronizedMap()可使集合線程安全 ConrurentHashMap是線程安全的HashMap

對比HashTable HashMap TreeMap

談談你對HashMap的掌握 HashMap不是線程安全的,以數組方式存儲Key-value構成的Entry對象,無限量擴容,擴容時要從新計算Hash

理解java的字符串

String StringBuffer StringBuider有什麼區別 String 是不可變的,不能被繼承和修改,用final修飾的類,線程安全. StringBuffer能夠被改變,可是線程不安全. StringBuilder也是可變的,線程安全.

什麼狀況下java程序會產生死鎖

如何排除 線程T1和T2,T1得到L1,可是要得到L2後才能釋放L1,T2得到L2,可是要得到L1之後才能釋放L2,這樣有可能會出現死鎖,避免方式是加synchronized同步鎖.

JVM運行模塊

程序計數器(至關於指針 不共享) 虛擬機棧 (運行時的數據,方法 不共享) 方法區 (常量,類信息,變異後的代碼 線程共享) 堆 (建立的對象 線程共享) 本地方法棧 (本地方法運行時的數據 不共享)

Spring用到了那些設計模式

簡單工廠模式

BeanFactory根據標識建立bean的過程

單例模式

singleton做用域建立的bean , SpringIoC容器中只有一個對應的實例 .

代理模式

SpringAOP基於JDK的動態代理

適配器模式

觀察者模式

ApplicationListener的實現 . 定義一種一對多的關係 , 當一個對象狀態發生改變時 , 其餘的對象也對應發生改變 .

策略模式

SpringBoot

不是一個框架,而是快速構建項目的方式 默認的代碼和註釋配置 以最少的配置或者零配置開發和構建 適用新項目,不適合將SpringFramework的項目轉化 SpringBoot約定過配置,不須要聲明資源映射,資源映射會自動處理。

Spring線程安全

單例模式不必定線程安全,涉及多線程時要對其改造,通常是加鎖或者適用threadlocal。

ZooKeeper

在分佈式系統中 協調各個節點 監視各個節點的狀態 根據節點提交的反饋進行下一步的合理操做
提供了文件系統 通知機制
根據是否持久化 / 是否有編號 分爲四種znode節點 .
通知機制 是watch關心的節點 當發生變化時 , 通知客戶端 .
命名服務
惟一的path 能夠經過path相互發現
配置管理
管理配置 , 將配置信息放到zk的節點上去 並監聽對應的節點 當有配置發生變化時能夠通知應用程序 .
集羣管理
有新的節點加入或退出 選舉master
分佈式鎖
能夠把zk的節點當作一把鎖 , 全部程序都去建立這個節點 , 成功的即獲得鎖 , 用完刪除便可釋放鎖 .
其餘未獲得鎖的程序能夠排序建立節點 , 等鎖釋放了 , 按照順序獲得鎖 .

Spring bean的做用域和生命週期

singleton

單例做用域下 scope = singleton , 表示一個bean 在Spring IoC 容器中只有一個實例 .

prototype

prototype做用域中 , 每一次請求都會建立一個實例 , 並配置和裝飾 , 但不會調用對象的生命週期回調函數 , 不會負責bean的生命週期 .

request / session

在每一次的HTTP 的request / session中建立實例 , 而且盡在request / session中有效 .  

談談java反射機制, 動態代理是基於什麼原理

java的反射機制能夠得到對象的類 , 以及屬性 , 方法 , 和構造函數 .

動態代理基於反射機制 . IoC的依賴注入也是基於反射機制 . 

抽象類和接口的區別是什麼

抽象類經過extends繼承 ,  接口是經過implements實現接口 .

抽象類能夠有構造器 , 接口沒有構造器 .

抽象類和接口都不能實例化

接口中的方法只能是public的 , 但抽象方法沒有限制 

只能繼承一個抽象類 , 能夠實現多個接口 

事務的四個特性

原子性

事務要完整 , 要麼所有作完 , 要麼沒有作

一致性

事務開始到結束 , 數據庫的完整約束沒有變 .

隔離性

事務在訪問數據庫時 , 不被幹擾 , 相互隔離 .

持久性

事務完成後 , 數據庫不能回滾 .

MySql支持的隔離級別

讀未提交 read-uncommited

讀已提交 read-commited

可重複度 repeateable - read

串行化 serializable 

髒讀

不可重複讀

幻讀

悲觀鎖和樂觀鎖的原理和應用場景

 

談談你對幾種常見排序算法的理解

 

你解決過的最大併發是多少 你採用了那些方法 得到了什麼成效

使用緩存技術 / 查詢語句的優化 / 優化表結構加索引 / 集羣的方式

進程和線程的區別

 

Spring的異常處理 如何返回錯誤信息

  1. 能夠經過web.xml中的error-page來配置錯誤狀態碼 / 異常的跳轉頁面
  2. 實現HandlerExceptionResolver接口 , Spring提供了默認的實現類SimpleMappingExceptionResolver , 要在配置文件中配置 , 實現resolveException方法 , 返回一個ViewandModel
  3. 在類中實現 , 用@ExceptionHandler

Nigix的理解

基於C開發 / 跨平臺 / 能夠做爲HTTP服務器做爲網站的發佈處理 / 做爲反向代理服務器實現負載均衡

表分區

將一個數據表和索引分別存儲在不一樣的物理文件中

-- 增長
partition by range(id){
    partition user_1 values less than (10),
    partition user_2 values less than (20)      
}

--刪除
alter table user drop partition user_1 ;
alter talbe user drop partition user_2;

分區的表不支持外鍵 , 可能會讓索引失靈 .

JDBC操做數據庫步驟

  1. 加載驅動  Class.forName()
  2. 得到鏈接  DriverManager.getConnection()
  3. 建立statement / preparestatement對象  conn.createStatement
  4. 執行SQL得到結果  stmt.executeQuery()

Dubbo

SpringCloud

ActiveMQ

集合基礎操做

map.get(key);
map.put(key, value);

list.get(location);
list.add(object);

boolean flag = set.add(object);

dataType[] array = new dataType[size]

類加載過程

加載 - 鏈接(驗證 - 準備 - 解析) - 初始化 - 使用 - 卸載

加載
將class加載到jvm的方法區中
鏈接
驗證 檢驗加載類是否有問題
準備 將靜態變量分配內存
解析 將符號轉化成直接引用
初始化
執行Static靜態的代碼塊 - 執行構造函數 (從父類開始)

BootstrapClassLoader   jre/lib/rt下的

ExtensionClassLoader  jre/lib/ext下的

AppClassLoader   classpath下的

CustomClassLoader  自定義的

相關文章
相關標籤/搜索