技術面試(一)

weixin_33797791發表於2017-12-05

序號 問題

1 自我介紹


2 知道的集合類有哪些

List set map

3 String、StringBuffer、StringBuilder區別

String:引用常量,final修飾,不能被繼承

StringBuff 和 StringBuilder:引用變數,便於處理拼接字串,前者執行緒安全,後者不是;

使用時,如果只是建立一個字串,不改變時,使用String;

常進行拼接操作時:單執行緒使用StringBuilder,多執行緒使用StringBuffer

效率:StringBuilder>StringBuffer>String

4 hibernate和mybatis的區別

hibernate全自動,mybatis半自動的: hibernate通過其強大的物件關係模型對資料庫進行操作,可以自動生成sql;mybatis則只是簡單的欄位對映,通過自己手寫sql來操作

hibernate資料庫可移植性大於mybatis:  hibernate使用的系統對映關係自動生成的sql和hql,降低對資料庫的耦合性,mybatis則取決於我們手寫的sql,

sql優化上mybatis要優於hibernate:手寫的容易優化,機器生成的無法直接優化

hibernate擁有完整的日誌系統,mybatis則欠缺一些。

5 什麼是事務

6 spring的事務介紹

事務管理是企業級應用程式開發中必不可少的技術,用來確保資料的完整性和一致性,

事務的四個關鍵屬性:原子性,一致性,隔離性,永續性。

Spring既支援程式設計式事務管理,也支援宣告式的事務管理。程式設計式事務管理:將事務管理程式碼嵌入到業務方法中來控制事務的提交和回滾,在程式設計式管理事務時,必須在每個事務操作中包含額外的事務管理程式碼。宣告式事務管理:大多數情況下比程式設計式事務管理更好用。它將事務管理程式碼從業務方法中分離出來, 以宣告的方式來實現事務管理.事務管理作為一種橫切關注點, 可以通過 AOP 方法模組化. Spring 通過 Spring AOP 框架支援宣告式事務管理.

7 session和cookie的區別

cookie存於客戶端,不安全,有大小限制,通常一個cookie大小為4K,對多儲存20個cookie,

session存於服務端,沒有大小限制,過多時會佔用伺服器效能

1.cookie資料存放在客戶的瀏覽器上,session資料存放在伺服器上。

2.cookie不是很安全,別人可以通過分析存放在本地的cookie並進行cookie欺騙,考慮到安全應當使用session。

3.session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能,考慮到減輕伺服器效能方面,應當使用cookie。

4.Session中儲存的是物件,Cookie中儲存的是字串。

5.單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。

6.個人認為,將登陸資訊等重要資訊存放在session,其他資訊如果需要保留,可以放在cookie中

8 group by 和having的區別用法

group by 分組,having用於分組後的條件

Group By語句從英文的字面意義上理解就是“根據(by)一定的規則進行分組(Group)”。它的作用是通過一定的規則將一個資料集劃分成若干個小的區域,然後針對若干個小區域進行資料處理。group by 是先排序後分組;

HAVING語句通常與GROUP BY語句聯合使用,用來過濾由GROUP BY語句返回的記錄集。HAVING語句的存在彌補了WHERE關鍵字不能與聚合函式聯合使用的不足。

9 tomcat如何增加記憶體

第一種方法:

Windows下,在檔案/bin/catalina.bat,Unix下,在檔案/bin/catalina.sh的前面,增加如下設定:

JAVA_OPTS='-Xms【初始化記憶體大小】 -Xmx【可以使用的最大記憶體】'

需要把這個兩個引數值調大。例如:

JAVA_OPTS='-Xms256m -Xmx512m'

表示初始化記憶體為256MB,可以使用的最大記憶體為512MB。

第二種方法: 

環境變數中設     變數名:JAVA_OPTS     變數值:-Xms512m   -Xmx512m

第三種方法:

前兩種方法針對的是bin目錄下有catalina.bat的情況(比如直接解壓的Tomcat等),但是有些安裝版的Tomcat下沒有catalina.bat,這個時候可以採用如下方法,當然這個方法也是最通用的方法:開啟tomcatHome//bin//tomcat5w.exe,點選Java選項卡,然後將會發現其中有這麼兩項:Initial memory pool和Maximum memory pool.Initial memory pool這個就是初始化設定的記憶體的大小。Maximum memory pool這個是最大記憶體的大小 設定完了就按確定然後再重啟TOMCAT你就會發現tomcat中jvm可用的記憶體改變了

10 查一張表如果查的慢,如何解決

資料庫優化,sql優化

建立索引語句:create index 索引名 on 表名(欄位名)

explain你的select語句,分析一下

只有一行資料時 limit1

為搜尋欄位新增索引

避免使用select*

拆分大的delete或者insert語句

11 資料庫索引如何使用,哪些欄位需要加索引

索引是一種特殊的查詢表,可以是資料庫引擎增加檢索速度

因為正確的索引可能使效率提高,而無效的索引可能是浪費了資料庫空間,甚至大大降低查詢效能;表的主鍵、外來鍵必須有索引;經常與其他表進行連線的表,在連線欄位上應該建立索引;經常出現在Where子句中的欄位,特別是大表的欄位,應該建立索引;索引應該建在小欄位上,對於大的文字欄位甚至超長欄位,不要建索引

12 圖表工具用過哪些,怎麼用的

13 springmvc的工作原理

1.springmvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模組負責負責對請求進行真正的處理工作。

2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.

3.DispatcherServlet請請求提交到目標Controller

4.Controller進行業務邏輯處理後,會返回一個ModelAndView

5.Dispathcher查詢一個或多個ViewResolver檢視解析器,找到ModelAndView物件指定的檢視物件

6.檢視物件負責渲染返回給客戶端。

14 aop的介紹

Aop即面向切面程式設計,可以說是物件導向程式設計的補充和完善。Aop技術是一種稱為“橫切”的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,即切面,簡單說就是那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於減少系統的重複程式碼,降低模組之間的耦合度,並有利於未來的可操作性和可維護性,比如許可權認證、日誌、事物。Aop的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。

15 jquery的選擇器

(1)基本

(2)層次選擇器:

(3)基本過濾器選擇器

(4)內容過濾器選擇器

(5)可見性過濾器選擇器

(6)屬性過濾器選擇器

(7)子元素過濾器選擇器

(8)表單選擇器

(9)表單過濾器選擇器

$("#myELement")    選擇id值等於myElement的元素

$("div")           選擇所有的div標籤元素,返回div元素陣列

$(".myClass")      選擇使用myClass類的css的所有元素

$("form input")         選擇所有的form元素中的input元素

$("div[id]")              選擇所有含有id屬性的div元素

16 mybatis中$和#的區別,一對多怎麼查詢

# 會給新增的屬性預設增加一個引號,可以防止sql注入

$ 則是直接新增到sql中,會發生sql注入

一對多:在配置時在"一"的resultMap裡邊新增collection標籤新增"多"的一項

17 執行緒的實現方式

繼承Thread

實現Runable介面

18 執行緒同步怎麼實現

同步程式碼塊

同步方法

使用特殊域變數(volatile)實現執行緒同步

使用重入鎖實現執行緒同步

使用區域性變數實現執行緒同步

http://blog.csdn.net/small_lee/article/details/51453019

19 靜態程式碼塊和構造器的執行順序

20 hashMap和HashTable的區別

1、HashTable執行緒同步,HashMap非執行緒同步。

2、HashTable不允許<鍵,值>有空值,HashMap允許<鍵,值>有空值。

3、HashTable使用Enumeration,HashMap使用Iterator。

4、HashTable中hash陣列的預設大小是11,增加方式的old*2+1,HashMap中hash陣列的預設大小是16,增長方式一定是2的指數倍。

5、TreeMap能夠把它儲存的記錄根據鍵排序,預設是按升序排序

21 ArrayList和LinkedList的區別

1.ArrayList是基於陣列的資料結構,LinkedList基於連結串列的資料結構。

2.ArrayList查詢資料比LinedList快,因為LinkedList要移動指標。

3.LinedList新增、刪除資料比ArrayList快,因為ArrayList要移動資料。

22 主鍵外來鍵的區別

1.主鍵是一個表的唯一標識,是這個表的約束,不能有重複,不能為空。關鍵字primary key

2.外來鍵用於與另一張表的關聯,是能確定另一張表記錄的欄位,用於保持資料的一致性。一個表可以有多個外來鍵,關鍵字是foreign key

23 是否瞭解前端框架,用過哪些,簡單介紹

Bootstrap layer  Swiper  amazeui

Bootstrap 是基於 HTML、CSS、JAVASCRIPT 的,它簡潔靈活,使得 Web 開發更加快捷。Bootstrap中包含了豐富的Web元件,根據這些元件,可以快速的搭建一個漂亮、功能完備的網站。另外一個重點是,Bootstrap是自適應的,可以支援PC和移動端頁面,自動調整其樣式寬度高度,做PC端和移動端的網頁都可以使用它。當然,完全做到自適應是不可能的,但是Bootstrap基本適用大部分場景了。

layer是一款口碑極佳的web彈層元件,與同類彈出層元件相比,layer的優勢明顯,她儘可能地在以更少的程式碼展現出更強健的功能

Swiper是純javascript打造的滑動特效外掛,面向手機、平板電腦等移動終端

簡單來說,Swiper就是實現了一個滑動切換圖片或皮膚的效果。顯然是針對移動端的。

Amaze UI 是一個輕量級(所有 CSS 和 JS gzip 後 100 kB 左右),移動優先的前端框架。

24 抽象類和介面的關係

抽象類:

抽象類是特殊的類,只是不能被例項化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能宣告於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類可以派生自一個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。

介面:

介面是引用型別的,類似於類,和抽象類的相似之處有三點:

1、不能例項化;

2、包含未實現的方法宣告;

3、派生類必須實現未實現的方法,抽象類是抽象方法,介面則是所有成員(不僅是方法包括其他成員);

25 什麼是gc,如何使用

垃圾回收機制,使c++程式設計師最頭疼的記憶體管理的問題迎刃而解,它使得Java程式設計師在編寫程式的時候不再需要考慮記憶體管理。由於有個垃圾回收機制,Java中的物件不再有"作用域"的概念,只有物件的引用才有"作用域"。垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨的低階別的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件進行清楚和回收,程式設計師不能實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。

GC:指java的垃圾回收機制,java的垃圾回收機制是自動呼叫的,並不受程式設計師控制

程式設計師不能具體控制時間,系統在不可預測的時間呼叫System.gc()函式的時候;當然可以通過調優,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制進入oldObject的次數,使得oldObject 儲存空間延遲達到full gc,從而使得計時器引發gc時間延遲OOM的時間延遲,以延長物件生存期。

gc回收的是那些超出了作用域或引用計數為空的物件;從gc root開始搜尋找不到的物件,而且經過一次標記、清理,仍然沒有復活的物件。

刪除不使用的物件,回收記憶體空間;執行預設的finalize,當然程式設計師想立刻呼叫就用dipose呼叫以釋放資源如檔案控制程式碼,JVM用from survivor、to survivor對它進行標記清理,物件序列化後也可以使它復活。

26 版本管理工具svn是幹嘛的,怎麼用的,程式碼衝突怎麼辦

SVN全名Subversion,即版本控制系統。Svn是一種集中式檔案版本管理系統執行方式

常見操作:

svn checkout:將伺服器程式碼完整的下載到本地

svn commit:將本地修改的內容提交到伺服器

svn update:將伺服器最新程式碼下載到本地

SVN是非常實用也好用的版本管理工具,但不是萬能的,有時候還需要你手動解決。

一般在你準備提交一個新版本時,首先update一遍,有時候update完之後發現跟本地版本有衝突,這時候,在有衝突檔案的地方存在4個檔案:

1)petgeniusupdatelayer.ccb,這是衝突的檔案,也就是你update下來的檔案跟本地的檔案合併之後存在衝突的檔案,這個檔案需要你去處理;

2)petgeniusupdatelayer.ccb.mine,這是在update之前本地修改的檔案;

3)petgeniusupdatelayer.ccb.r19732,這是該檔案的初始版本;

4)petgeniusupdatelayer.ccb.r20390,這是SVN伺服器上你update下來的檔案(伺服器最新版本的檔案);

一般衝突出現的原因是你和另外一個比你先commit的傢伙修改到了這個檔案的同一個地方,這個時候你有3種解決方法:

1)手動合併程式碼,這就要求你在不改動另外一個傢伙程式碼目的的情況下,把自己的程式碼加進去,或者你們協商修改,一般問題不大,不要犯迷糊就可以;然後再svn裡,remark as resolved;重新檢查一遍即可commit;

2)無視新版本,使用你自己的版本,這時,只需要把字尾名為.mine的檔案去掉這個字尾名,替代原始檔petgeniusupdatelayer.ccb即可;

這種情況也有,比如某個模組只有你自己負責,別人不會動這個地方的程式碼等,但是由於不小心改動了一些(經常是別人要測試,自己改程式碼,改完之後忘記改回來就提交了)。

3)放棄本地版本,petgeniusupdatelayer.ccb.r20390去掉字尾名就是最新版本,或者直接全部刪除,重新update一份,這代表完全放棄自己的修改,完全做無用功啊;

為了儘量避免衝突,減少麻煩:

1)提交的時候要注意檢查自己本地修改,每個修改的地方做到心中有數,不需要提交的程式碼,比如列印Log,測試程式碼注意及時刪除;

2)每次開始修改一份程式碼時,儘量保證初始程式碼為最新,這樣可以儘可能減少衝突的發生

27 系統許可權是如何管理的,怎麼實現的

一個系統包含眾多模組,要求能夠通過許可權管理,控制不同使用者對模組的訪問許可權,而且需要控制到對某個模組的某個操作(增刪改查)的級別。一般情況下,通過角色對使用者進行統一授權,在某些特殊情況下,能夠單獨對使用者進行授權。

28 專案是怎麼部署上線的

1、打包成war格式,2.購買雲伺服器3.登入你的阿里雲伺服器4.遠端連線5.配置java web環境6.釋出專案

29 hibernate的延遲載入是怎麼回事

延遲載入就是並不是在讀取的時候就把資料載入進來,而是等到使用時再載入。Hibernate使用了虛擬代理機制實現延遲載入。返回給使用者的並不是實體本身,而是實體物件的代理。代理物件在使用者呼叫getter方法時就會去資料庫載入資料。

30 sql語句怎麼優化的

①選取最適用的欄位屬性,資料庫中的表越小,執行查詢越快,因此將表中欄位的寬度設定儘可能小,如varchar(255)不合適,另外應儘量把欄位設定為not null。查詢時不用去比較null值。

②使用連線join代替子查詢,子查詢即適用查詢語句查詢一個結果,把結果作為過濾條件用在另一個查詢中,適用join時SQL不需要建立臨時表來完成這個邏輯上的步驟。

③使用聯合union來代替手動建立的臨時表,使用union來建立查詢時,只需要用union作為關鍵字把多個select語句連線起來就可以,要注意的是所有select語句中的欄位數目要想同。

④要麼語句塊中每條語句都操作成功,要麼都失敗。換句話說,就是可以保持資料庫中資料的一致性和完整性。事物以BEGIN關鍵字開始,COMMIT關鍵字結束。在這之間的一條SQL操作失敗,那麼,ROLLBACK命令就可以把資料庫恢復到BEGIN開始之前的狀態。事務的另一個重要作用是當多個使用者同時使用相同的資料來源時,它可以利用鎖定資料庫的方法來為使用者提供一種安全的訪問方式,這樣可以保證使用者的操作不被其它的使用者所干擾。

⑤使用外來鍵,能保證資料的關聯性。

⑦使用索引,索引是提高資料庫效能的常用方法,它可以令資料庫伺服器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含有MAX(),MIN()和ORDERBY這些命令的時候,

效能提高更為明顯。

⑧優化的查詢語句,如in和not in操作符效能低,like操作符中'_xx%'會引用範圍索引。

31 如何保證redis和資料庫中的資料是同步的

1)查詢時先查詢快取(redis),如果查詢不到,查詢資料庫,並將會員唯一標識(會員編號),放到redis佇列中(list)

2)啟動一個job從redis佇列中讀取會員唯一標識,並判斷會員編號作為key是否存在於redis中,如果存在,計數器減一,否則直接查詢會員資訊,放到redis中。

3)更新時,先更新資料庫,再清空對應redis資訊,並將會員編號做為key的計數器加一

32 mysql的儲存過程、觸發器

儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數)來呼叫執行它。

mysql觸發器

觸發器是一種與表操作有關的資料庫物件,當觸發器所在表上出現指定事件時,將呼叫該物件,即表的操作事件觸發表上的觸發器的執行。

33 講一下servlet

servlet從客戶端(通過Web伺服器)接收請求,執行某種作業,然後返回結果。

使用servlet的基本流程如下:

·客戶端通過HTTP提出請求.

·Web伺服器接收該請求並將其發給servlet。如果這個servlet尚未被載入,Web伺服器將把它載入到Java虛擬機器並且執行它。

·servlet將接收該HTTP請求並執行某種處理。

·servlet將向Web伺服器返回應答。

·Web伺服器將從servlet收到的應答傳送給客戶端。

34 java字串類裡常用的方法

length()方法 :字串的長度

charAt()擷取字元

getChars() 擷取多個字元

getBytes() 將字元儲存在位元組陣列中

toCharArrray()

35 request的常用方法

一、獲取客戶機環境資訊常見方法:

1.getRequestURL方法返回客戶端發出請求時的完整URL。

2.getRequestURI方法返回請求行中的資源名部分。

3.getQueryString方法返回請求行的引數部分。

4.getRemoteAddr方法返回發出請求的客戶機的IP地址。

5.getRemoteHost方法返回發出請求的客戶機的完整主機名。

6.getRemotePort方法返回客戶機所使用的網路埠號。

7.getLocalAddr方法返回WEB伺服器的IP地址。

8.getLocalName方法返回WEB伺服器的主機名。

9.getMethod得到客戶機請求方式。

二、獲得客戶機請求頭:

1.getHeader(String name)方法

2.getHeaders(String name)方法

3.getHeaderNames()方法

三、獲得客戶機請求引數(客戶端提交的資料)

1.getParameter(name)方法

2.getParameterValues(String name)方法

3.getParameterNames方法

4.getParameterMap方法,做框架時大量使用

四,其他

Request物件的主要方法:

setAttribute(String name,Object):設定名字為name的request 的引數值

getAttribute(String name):返回由name指定的屬性值

getAttributeNames():返回request 物件所有屬性的名字集合,結果是一個列舉的例項

getCookies():返回客戶端的所有 Cookie 物件,結果是一個Cookie 陣列

getCharacterEncoding() :返回請求中的字元編碼方式

getContentLength() :返回請求的 Body的長度

getHeader(String name) :獲得HTTP協議定義的檔案頭資訊

getHeaders(String name) :返回指定名字的request Header 的所有值,結果是一個列舉的例項

getHeaderNames() :返回所以request Header 的名字,結果是一個列舉的例項

getInputStream() :返回請求的輸入流,用於獲得請求中的資料

getMethod() :獲得客戶端向伺服器端傳送資料的方法

getParameter(String name) :獲得客戶端傳送給伺服器端的有 name指定的引數值

getParameterNames() :獲得客戶端傳送給伺服器端所有引數的名字,結果是一個列舉的例項

getParameterValues(String name):獲得有name指定的引數的所有值

getProtocol():獲取客戶端向伺服器端傳送資料所依據的協議名稱

getQueryString() :獲得查詢字串

getRequestURI() :獲取發出請求字串的客戶端地址

getRemoteAddr():獲取客戶端的 IP 地址

getRemoteHost() :獲取客戶端的名字

getSession([Boolean create]) :返回和請求相關 Session

getServerName() :獲取伺服器的名字

getServletPath():獲取客戶端所請求的指令碼檔案的路徑

getServerPort():獲取伺服器的埠號

removeAttribute(String name):刪除請求中的一個屬性

36 forward和redirect

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

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

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

redirect:不能共享資料.

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

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

forward:高.

redirect:低.

37 maven是做什麼的,怎麼用的

maven是一個專案構建和管理的工具,提供了幫助管理 構建、文件、報告、依賴、scms、釋出、分發的方法。可以方便的編譯程式碼、進行依賴管理、管理二進位制庫等等。

maven的好處在於可以將專案過程規範化、自動化、高效化以及強大的可擴充套件性。利用maven自身及其外掛還可以獲得程式碼檢查報告、單元測試覆蓋率、實現持續整合等等。

38 java中如果不用正規表示式,如何驗證一個郵箱格式是否正確

使用java程式碼驗證

import java.util.Scanner;

public class Test

{

public static void main(String args[])

{

Scanner sc=new Scanner(System.in);

String name=sc.next();

if(chose(name))

{

System.out.println("郵箱合法");

}

else

{

System.out.println("郵箱非法");

}

}

public  static boolean chose(String a)

{

String c;

String d;

char b=a.charAt(0);

if(a.equals(""))

{

return false;

}

if(b==' ' && b=='@' && b=='.')

{

return false;

}

c=a.substring(a.length()-4,a.length());

if(!(c.equals(".com")))

{

return false;

}

//用判定"@."是否存在好一些

if(!a.contains("@."))

{

return false;

}

}

39 hibernate和JPA有什麼區別

JPA是一種ORM規範,提供的只是一些介面

Hibernate除了作為ORM框架之外,它也是一種JPA實現。

相關文章