面試一

 1、常見的異常和異常的種類。列舉幾種,SpringMVC如何統一處理異常?

編譯時異常:服務器宕機、數據庫崩潰、
運行時異常:空指針異常、索引越界異常、arithmeticException異常、類型轉換異常、方法不存在異常、方法傳遞參數錯誤

springMvc處理異常流程

瀏覽器——》前端控制器——》controller——》service——》dao
  
若是dao層方法有異常,會一層一層往上拋出異常

Spring 統一異常處理有 3 種方式,分別爲:

(1)使用Spring MVC提供的簡單異常處理器SimpleMappingExceptionResolver; 
(2)實現Spring的異常處理接口HandlerExceptionResolver 自定義本身的異常處理器; 
(3)使用@ExceptionHandler註解實現異常處理,只能在同一個controller中;前端

         3.2版本以後: @ControllerAdvice  和 @ ExceptionHandler 註解 

1、實現HandlerExceptionResolverjava

 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  
            Exception ex) {  

applicationContext.xml中定義這樣一個bean對象,如
<bean id="exceptionResolver"class="com.tiantian.xxx.web.handler.ExceptionHandler"/>  mysql



400,500等異常,修改web.xml文件linux

 1 <!-- 出錯頁面定義 -->  
 2 <error-page>  
 3     <exception-type>java.lang.Throwable</exception-type>  
 4     <location>/500.jsp</location>  
 5 </error-page>  
 6 <error-page>  
 7     <error-code>500</error-code>  
 8     <location>/500.jsp</location>  
 9 </error-page>  
10 <error-page>  
11     <error-code>404</error-code>  
12     <location>/404.jsp</location>  
13 </error-page> 


2、Arraylist的初始容量和擴容因子爲多少?hashMap呢?hashMap的hash怎麼實現的,二者底層的數據結構git

  ArrayList的初始容量爲10,擴容因子爲1.按 數組當前足夠的最小容量 * 1.5 進行擴容。                   hashMap的初始容量爲16,擴容因子爲0.75,程序員

HashMap中的hash算法是經過key的hashcode值與其hashcode右移16位後獲得的值進行異或運算獲得的github

1 static final int hash(Object key) {
2     int h;
3     return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
4 }

 

# hashMap原理 #web

HashMap是一個雙列集合,是線程不安全的。以key、value的形式儲存值。底層是由數組+鏈表+紅黑樹組成的,數組是HashMap的主幹,鏈表則是主要爲了解決哈希衝突而存在的,根據key計算出hash值,存儲在數組裏面,當hsah值衝突的時候,經過equals方法比較,若是不一樣就建立鏈表存儲在鏈表裏面。當鏈表長度超過8的時候,會自動轉化爲紅黑樹。他的容量initialCapacity默認爲16,負載因子loadFactory默認爲0.75。當存儲的容量大於hashmap的容量乘以0.75的時候,就會自動擴容。redis

 Arraylist底層爲數組,線程不安全,查找和修改快,有序和能夠重複。hashMap底層爲數組加列表加紅黑樹,線程不安全,可存儲null值。算法

 

3、java8中Lambda表達式和方法引用的瞭解?區別是什麼?經常使用的Stream API哪些是中間操做,哪些是終止操做?

方法引用由::雙冒號操做符
lambda 表達式內可使用方法引用,僅當該方法不修改 lambda 表達式提供的參數。
本例中的 lambda 表達式能夠換爲方法引用,由於這僅是一個參數相同的簡單方法調用。
list.forEach(n -> System.out.println(n));

list.forEach(System.out::println); // 使用方法引用

然而,若對參數有任何修改,則不能使用方法引用,而需鍵入完整地 lambda 表達式,以下所示:

list.forEach((String s) -> System.out.println("*" + s + "*"));

事實上,能夠省略這裏的 lambda 參數的類型聲明,編譯器能夠從列表的類屬性推測出來。

中間操做:
  filter——接收 Lambda , 從流中排除某些元素。
  limit——截斷流,使其元素不超過給定數量。
  skip(n) —— 跳過元素,返回一個扔掉了前 n 個元素的流。若流中元素不足 n 個,則返回一個空流。與 limit(n) 互補
  distinct——篩選,經過流所生成元素的 hashCode() 和 equals() 去除重複元素

終止操做

 allMatch——檢查是否匹配全部元素
  anyMatch——檢查是否至少匹配一個元素
  noneMatch——檢查是否沒有匹配的元素
  findFirst——返回第一個元素
  findAny——返回當前流中的任意元素
  count——返回流中元素的總個數
  max——返回流中最大值
  min——返回流中最小值

 

Java8 中的 Optional 類

這是一個能夠爲 null 的容器對象。若是值存在則 isPresent()方法會返回 true,調用 get()方法會返回該對象。

 

4、Thread,Executor和ExecutorService的區別,他們的使用方式和不一樣點。

建立線程的類Thread,繼承它Thread,重寫run方法,將要執行的方法寫在run方法中,建立Thread的子類對象,開啓線程。

建立線程池的接口Executor。日常咱們建立線程池時,通常使用它的子類:new   ThreadPoolExecutor (。。。。){  }。

ExecutorService是一個接口,繼承了Executor。而Executor也是一個接口,該接口只包含了一個方法:void execute(Runnable command);,該方法接收一個 Runable 實例,它用來執行一個任務,任務即一個實現了 Runnable 接口的類。

Executors 提供了一系列工廠方法用於建立線程池,返回的線程池都實現了 ExecutorService 接口。
  • public static ExecutorService newFixedThreadPool(int nThreads)
    建立固定數目線程的線程池。
  • public static ExecutorService newCachedThreadPool()
    建立一個可緩存的線程池,調用execute將重用之前構造的線程(若是線程可用)。若是現有線程沒有可用的,則建立一個新線 程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。
  • public static ExecutorService newSingleThreadExecutor()
    建立一個單線程化的Executor。
  • public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
    建立一個支持延遲及週期性的任務執行的線程池,多數狀況下可用來替代Timer類。

關閉調用順序

shutdown方法
awaitTermination方法
shutdownNow方法(發生異常或者是Timeout的時候)

 

5、spring的做用以及工做中經常使用的組件,以及BeanFactory和ApplicationContext的區別

用於和其它框架整合,聲明式事務的支持,簡化開發,實現程序低耦合,方便測試,加強了系統的可維護性和擴展性。

經常使用組件:

Spring中我的認爲三大核心組件分別是:beans、context、core。

一、beans:beans又是核心中最重要的一個,由於其它兩個都是圍繞它的。咱們都知道Spring中的IOC(控制反轉)就是將原來又程序員控制的對象(bean)反轉來交給Spring幫咱們管理。天然而然這裏的beans就是咱們Java應用中須要使用到的對象集合。全部我說這個核心中的核心,由於你沒有了bean,Spring也就沒有存在的必要了。

二、context:字面理解就是上下文的意思,彷彿是咱們在文章中使用到的術語,可是Spring的命名者(也就是Spring的發明者)爲何要使用這個名字呢?我的認爲,這裏術語「上下文」中的文,其實就是Spring管理的bean。咱們將Spring容器當作是一片文章,而bean就是每一個段落或者每句文字,而「上下」咱們能夠理解成Java中bean與bean之間的依賴(引用)。咱們都知道文件的段落與段落之間都是有聯繫的(什麼承上啓下啊等等)。固然咱們Java中的bean之間也會存在互相引用等關係。有了前面的理解,咱們其實大概就知道context的做用了。做用就是負責管理Spring中bean與bean之間關係的。

三、core:這翻譯過來就是核心的意思。但其實它的做用主要是爲context在管理Spring中bean與bean之間關係時爲其服務的。其實直白一點就是爲Spring管理bean提交工具的一個工具類。這裏的類是咱們生活中的類,不是Java世界中的類哈!Java中它多是接口。

BeanFactory和ApplicationContext的區別:

BeanFactory 是IoC容器的基礎接口,BeanFactory提供了最基本的IoC容器的功能,即全部的容器至少須要實現的標準。BeanFactory 有三個子類接口:ListableBeanFactory(列出工廠能夠生產的全部實例)、HierarchicalBeanFactory (使BeanFactory有了雙親Factory)和AutowireCapableBeanFactory(管理ApplicationContext以外的Bean)

在ApplicationContext的設計中,一方面,能夠看到它繼承了BeanFactory接口體系中的ListableBeanFactory、AutowireCapableBeanFactory、HierarchicalBeanFactory等BeanFactory的接口,具有了BeanFactory Ioc容器的基本功能(經過適配器模式適配到BeanFactory);另外一方面,經過繼承MessageSource、ResourceLoader、ApplicationEventPublisher這些接口,爲ApplicationContext賦予了更高級的Ioc容器特性。對於ApplicationContext而言,爲了在Web環境中使用它,還設計了WebApplicationContext接口。

其中BeanFactory是純粹的Bean容器,用來存儲描述Bean,無關其餘環境,而像ApplicationContext,也是Bean容器,但它和應用環境息息相關,因此被稱爲應用上下文(環境)更恰當,從圖中也能看出來,ApplicationContext不只有着BeanFactory「血統」,同時也繼承了EnvironmentCapable、MessageSource、ApplicationEventPublisher,即擴展了其許多額外功能,而其實現類則是和具體應用相關了.

6、簡述springboot的自動配置原理?日常使用最高的springboot註解及做用,第三方中間件的整合(redis,mybatis)

 它主要加載了@SpringBootApplication註解主配置類,這個@SpringBootApplication註解主配置類裏邊最主要的功能就是SpringBoot開啓了一個@EnableAutoConfiguration註解的自動配置功能。

  • 引入EnableAutoConfigurationImportSelector類
  • 調用EnableAutoConfigurationImportSelector類的父類方法selectImports()
  • selectImports()調用Spring 4 提供的的SpringFactoriesLoader工具類
  • 經過SpringFactoriesLoader.loadFactoryNames()讀取了ClassPath下面的META-INF/spring.factories文件
  • 讀取文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration裏面全部的參數,開始運行預設好的配置類
  • 各個配置類根據條件註解(判斷是否存在某些類),決定是否實例化配置類內部定義的bean,避免在bean初始化過程當中因爲條件不足,致使應用啓動失敗

7、springboot爲何不須要外置的web服務器,springboot怎麼實現的

 有一個內置的Tomcat服務器

首先是容器的註冊,ServletWebServerFactoryConfiguration是Spring Boot提供的一個配置類,在這個類裏默認註冊了三種容器工廠TomcatServletWebServerFactory,JettyServletWebServerFactory,UndertowServletWebServerFactory,這三種都以Bean的形式加入到了Spring的Bean容器中,以供接下來的程序調用。
Spring Boot在ServletWebServerApplicationContext中重載了onRefresh方法,除了之前Spring默認的onRefresh方法外還增長了createWebServer方法,在這個方法中對Web容器進行了初始化工做。

在ServletWebServerApplicationContext類中獲取到相應的容器工廠後會調用容器工廠的getWebServer方法,下面以Tomcat爲例說明容器工廠的做用。

經過getWebServer方法會new一個TomcatWebServer對象,new對象的方法會調用initialize方法,在這個方法中會對容器進行初始化並啓動。

8、springCloud的瞭解,經常使用的組件有哪些,簡述一下這些組件使用場景以及如何擴展配置

 springcloud是一套完整的微服務解決方案,基於springboot框架。但準確來講,它並非一個框架,而更像是一個大的容器,將市面上成型比較好的微服務框架集成進來,簡化了開發者的代碼;

Springcloud 經常使用組件介紹; 
Spring Cloud Eureka:註冊中心
        Spring Cloud Feign:聲明式服務調用,本質上就是Ribbon+Hystrix,使得Eureka和Ribbon的使用更爲簡單
        Spring Cloud Hystrix:融斷機制,斷路器,防止對某一故障服務持續進行訪問
        Spring Cloud Ribbon:實現客戶端負載均衡
        Spring Cloud Zuul:服務網關,具有服務路由、均衡負載、權限控制等功能
        Spring Cloud Config:統一管理配置文件
        Spring Cloud Sleuth:分佈式追蹤解決方案(服務多了,調用的線路就會很複雜,須要跟蹤來知道你究竟是怎麼走的)

 9、Docker中進入容器的命令是什麼,查看容器詳細信息和資源使用量的命令,dockerfile中CMD和ENTRYPOINT的區別,瞭解過docker-compose

 進入容器  exec 

 查看容器詳細信息  ps

資源使用量  stats

dockerfile中CMD和ENTRYPOINT的區別:

  1. ENTRYPOINT,表示鏡像在初始化時須要執行的命令,不可被重寫覆蓋,需謹記
  2. CMD,表示鏡像運行默認參數,可被重寫覆蓋
  3. ENTRYPOINT/CMD都只能在文件中存在一次,而且最後一個生效 多個存在,只有最後一個生效,其它無效!
  4. 須要初始化運行多個命令,彼此之間可使用 && 隔開,但最後一個需要爲無限運行的命令,需切記!

docker-compose:

Docker Compose是一個用來定義和運行復雜應用的Docker工具。使用Compose,你能夠在一個文件中定義一個多容器應用,而後使用一條命令來啓動你的應用,完成一切準備工做。
- github.com/docker/compose

一個使用Docker容器的應用,一般由多個容器組成。使用Docker Compose,再也不須要使用shell腳原本啓動容器。在配置文件中,全部的容器經過services來定義,而後使用docker-compose腳原本啓動,中止和重啓應用,和應用中的服務以及全部依賴服務的容器。

docker-compose up 用於建立並運行容器.

docker-compose down 用於中止並移除容器,網絡,鏡像和卷。

10、列舉幾個常見的git命令,git中merge和rebase的區別,使用過gitlab自動化部署嗎

提交暫存區到倉庫區

$ git commit -m [message]

# 列出全部本地分支

$ git branch

# 合併指定分支到當前分支

$ git merge [branch]

 

  • merge 是一個合併操做,會將兩個分支的修改合併在一塊兒,默認操做的狀況下會提交合並中修改的內容
  • merge 的提交歷史忠實地記錄了實際發生過什麼,關注點在真實的提交歷史上面
  • rebase 並無進行合併操做,只是提取了當前分支的修改,將其複製在了目標分支的最新提交後面
  • rebase 的提交歷史反映了項目過程當中發生了什麼,關注點在開發過程上面

11、mysql優化

1.保證不查詢多餘的列與行。
2.慎用distinct關鍵字(去重)
3.慎用union關鍵字(合併),知足union的語句必須知足:1.列數相同。 2.對應列數的數據類型要保持兼容
4.判斷表中是否存在數據?使用select count(1) id from product
5.鏈接查詢的優化,根據左右鏈接關聯查詢特色肯定使用哪一種查詢方式
       select * from ((select * from orde where OrderId>10000) o  left join orderproduct op on o.orderNum=op.orderNum )
        select * from (orde o left join orderproduct op on o.orderNum=op.orderNum ) where o.OrderId>10000
6.查詢條件中,必定不要使用select *
7.在表中創建索引,優先考慮where.group by使用到的字段
8.對於連續的數值,能用 between 就不要用 in 
9.儘可能不要在 where 子句中對字段進行表達式操做

like不能%開頭,會致使索引無效;當like前綴沒有%,後綴有%時,索引有效。

 組合索引,要第一列用索引,不然索引失效。

數據類型出現隱式轉化。如varchar要加單引號,不然會使索引無效,產生全表掃描。

在索引列上不能使用 IS NULL 或 IS NOT NULL操做。索引是不索引空值的,因此這樣的操做不能使用索引,能夠用其餘的辦法處理,例如:數字類型,判斷大於0,字符串類型設置一個默認值,判斷是否等於默認值便可。

在索引字段上不能使用not,<>,!=。不等於操做符是永遠不會用到索引的,所以對它的處理只會產生全表掃描。 優化方法: key<>0 改成 key>0 or key<0。

對索引字段不能進行計算操做。
在索引字段上不能使用函數。

 

12、常見的linux命令

列出文件列表:ls 【參數 -a -l】

建立目錄和移除目錄:mkdir rmdir

cp(copy)功能:複製文件或目錄
打包:tar -xvf
打包並壓縮:tar -zcvf
 tar  -zxvf  ./1.tar        將當前目錄下的1.tar文件解壓縮
mv(move)功能:移動或改名現有的文件或目錄
顯示當前所在目錄:pwd
cd(change directory)功能:切換目錄
編輯器:vim vi
相關文章
相關標籤/搜索