遇到过的面试题
自我介紹:
1.簡單的背景介紹 (Background)
第一部分,簡單介紹類似于「我叫xxx,xxx大學xxx專業研究生在讀,本科畢業于xxxx。目前我在xxx組織擔任xxx職位,在xxx公司兼任xxx職位……」這樣的信息。
2.相關工作經驗介紹 (Professional)
我叫XXX,來自XX,就讀于XX,專業,畢業于, 編程是一項興趣愛好,后來就轉行進入這行,
平時喜歡接觸下各種各樣的技術,看下各種教程等 像C#A ,U3D等。
之前在前一個公司擔當批處理功能的開發,和Excel方面的交互,今天面試這個崗位是因為對金融或者支付
這方面的工作比較感興趣,
0.說明下java的封裝,多態,和繼承有啥區別。
封裝:通過訪問修飾符來限制對類的屬性和方法的訪問,
子類繼承父類的特征和行為,使得子類具有父類的各種屬性和方法。或子類從父類繼承方法,使得子類具有父類相同的行為。
特點:在繼承關系中,父類更通用、子類更具體。父類具有更一般的特征和行為,而子類除了具有父類的特征和行為,還具有一些自己特殊的特征和行為。
如果在子類中需要訪問父類中定義的同名成員變量或方法,需要用的關鍵字super
多態就是以一種類型來,表現出多種狀態
比如,車下,有寶馬,有奇瑞,他們都屬于車,定義一個車接口,兩種車都實現這個接口
在new出來,都可以用車接收,調用的時候,卻是調用的本身自己的方法。
1.簡單說明下java的設計模式。
單例模式:在類本身就通過一個方法給new出來,外部通過這個方法去實例化,
加synchronized會線程安全,可是會影響效率。
2.left join ,inner join ,right join 的差別,他們抽出的數據是否相同。
inner join 基于連接條件兩邊都有會抽出。
left join 如果右邊沒有對應的數據,那么左邊會抽出,右邊為null
right join如果左邊沒有對應的數據那么右邊會抽出,左邊為null
3.mybatis如何批量刪除和插入。
先在mybatis組裝成insert into tablename()value(),()的數據。
提交的時候可以手動提交,每次提交1000個,以免出現內存不足。
批量刪除的畫,也可以采用同樣的方法,delete from emp where empno in ()要刪除的數據。
4.session的生命周期,存放在哪里。
Session存儲在服務器端,一般為了防止在服務器的內存中(為了高速存取),
Sessinon在用戶訪問第一次訪問服務器時創建,
需要注意只有訪問JSP、Servlet等程序時才會創建Session,
只訪問HTML、IMAGE等靜態資源并不會創建Session,
可調用request.getSession(true)強制生成Session。
session的生命周期分為創建、活動、銷毀三個階段
session的銷毀方式:
1.自動注銷,invalidate
2.過期,超時,默認時間為30分鐘,
3.服務器重啟
5.如何解決兩個用戶同時操作一條數據,如何A 修改商品X為20 元,B同時修改商品X為30元。
可以加一個last_update,來確定最后的操作時間,可通過觸發器去實現。
6.說下spring的好處。
1.方便集成各種優秀框架,如Struts,Hibernate、mybatis都可以兼容
2.AOP編程的支持,方便進行面向切面的編程。
?
7.在一個方法體傳入一個list,在里面進行修改,之后這個list會改變么。為什么
集合這個東西跟數組一樣,你把它作為實參傳過去,實際上并不是傳的集合對象本身,而是它的地址(或者是引用,可以這么理解),
然后你在方法中操作集合,都是直接作用于集合本身而不是集合的值。
這跟普通的變量不一樣,普通的變量是值傳遞,你在方法內部操作一個變量只是在操作值,
原來的變量還在那里不會改變。
8.目前寫過最復雜的SQL
with a_tablename as(
select xx as 1 ,ss as 2 where tablename id = 0 union all
select xx as 3 ,ss as 4 where tablename id != 0
)insert into b_tablename (xx,ss)select xx,ss from a_tablename
9.strtus攔截器
攔截器可以做到在已有的業務中插入一塊共通的,
一個功能的時候記錄一下客戶的操作,這樣與其在一個個的action分別記錄,
直接在攔截器去記錄會更加的方便。攔截器,可以設置默認,也可以去設置攔截某些action。
執行后一定要invoke出去,這樣才能走到action
10.strtus 過濾器
過濾器實現Filter接口 ,在doFilter中寫實現
11.說下重定向問題
重定向能看到頁面上的地址的變化。
重定向,其實是兩次request,第一次,客戶端request A,
服務器響應,并response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,
而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。
12.strtus攔截器 和過濾器的區別
1、攔截器是基于java的反射機制的,而過濾器是基于函數回調 。
2、過濾器依賴與servlet容器,而攔截器不依賴與servlet容器 。
3、攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求 起作用 。
4、攔截器可以訪問action上下文、值棧里的對象,而過濾器不能 。
5、在action的生命周期中,攔截器可以多次被調用,而過濾器只能在容 器初始化時被調用一次
13.Servlet 是什么,簡單的說明一下,
Servlet 是最簡單的用于進行web開發的工具,通過繼承HttpServlet,能夠在doget或者dopost的情況下,輸出web頁面。
生命周期:
Servlet 通過調用 init () 方法進行初始化。
Servlet 調用 service() 方法來處理客戶端的請求。
Servlet 通過調用 destroy() 方法終止(結束)
14.mysql性能優化
1.充分使用索引
2.開啟緩存 query_cache_type 為 ON 表示已經開啟
3.當只要一行數據時使用 LIMIT 1,或者加上order by
4.為搜索字段建索引
5. 千萬不要 ORDER BY RAND()
6. 避免 SELECT *
15.遞歸
public class Main {
public static void main(String[] args) {
fun(1);
}
public static void fun(int n) {
System.out.printf("1-lexe:%d \n", n); //#1
if (n < 3)
fun(n + 1);
System.out.printf("2-lexe:%d \n", n); //#2
}
}
16.ajax如何解決js腳本緩存問題
第一種:
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
17.性能分析的命令
1.show indexes 查看表的索引
2.explain 分析表執行計劃
3.information_schema 包含的表的數量和mysql的版本和存儲引擎有關系。
4.show table status 可以查看表的存儲引擎
19.springmvc和Struts2的區別
由于SpringMVC基于方法的攔截,有加載一次單例模式bean注入。
而Struts2是類級別的攔截,每次請求對應實例一個新的Action,需要加載所有的屬性值注入,
SpringMVC開發效率和性能高于Struts2。
spring MVC和Spring是無縫的。從這個項目的管理和安全上也比Struts2高(當然Struts2也可以通過不同的目錄結構和相關配置做到SpringMVC一樣的效果,但是需要xml配置的地方不少)。
SpringMVC可以認為已經100%零配置。
20.掌握Spring mvc架構;
21.Hibernate的優缺點
優點:兼容,和各種數據庫的兼容性好
Hibernate功能強大,數據庫無關性好,O/R映射能力強,
缺點:沉重,繁雜
22. 了解常用的軟件工具:MQ,Redis,Memcache,
Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。
redis緩存,為什么要用緩存呢,舉個例子,假如系統中有2千萬用戶信息,用戶信息基本固定,一旦錄入很少變動,
那么你每次加載所有用戶信息時,如果都要請求數據庫,數據庫編譯并執行你的查詢語句,這樣效率就會低下很多,針對這種信息不經常變動并且數據量
較大的情況,通常做法,就是把他加入緩存,每次取數前先去判斷,如果緩存不為空,那么就從緩存取值,如果為空,再去請求數據庫,并將數據加入緩存,
這樣大大提高系統訪問效率
通過該set,get來存取
?
23、熟悉常用設計模式,有大型分布式、高并發、高負載、高可用性系統設計開發經驗;
24.2、熟練掌握Spring、SpringMVC、MyBatis、SpringBoot、Zookeeper、Duboo等常用當前流行的技術及框架;
?
25. Struts2的工作流程
客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin);
接著StrutsPrepareAndExecuteFilter被調用,StrutsPrepareAndExecuteFilter詢問ActionMapper來決定這個請求是否需要調用某個Action;
如果ActionMapper決定需要調用某個Action,StrutsPrepareAndExecuteFilter把請求的處理交給ActionProxy;
ActionProxy通過ConfigurationManager詢問框架的配置文件,找到需要調用的Action類;
ActionProxy創建一個ActionInvocation的實例。
ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。
一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。
返回結果通常是(但不總是,也可能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2框架中繼承的標簽。在這個過程中需要涉及到ActionMapper。
?
26. 熟悉Struts/Spring/Hibernate等框架,能在開發環境中配置和使用Tomcat/nginx等;
27.Linux常用命令大全
cd /home 進入 '/ home' 目錄'
pwd 顯示工作路徑
ls 查看目錄中的文件
mkdir dir1 創建一個叫做 'dir1' 的目錄'
cp dir/* . 復制一個目錄下的所有文件到當前工作目錄
28.JavaScript中說明“==”和“===”之間的區別?
“==”僅檢查值相等,而“===”是一個更嚴格的等式判定,如果兩個變量的值或類型不同,則返回false。
29. MySQL鎖
MySQL各存儲引擎使用了三種類型(級別)的鎖定機制:
表級鎖定,行級鎖定和頁級鎖定。
樂觀鎖
樂觀鎖不是數據庫自帶的,需要我們自己去實現。
樂觀鎖是指操作數據庫時(更新操作),想法很樂觀,認為這次的操作不會導致沖突,在操作數據時,并不進行任何其他的特殊處理(也就是不加鎖),而在進行更新后,再去判斷是否有沖突了。
通常實現是這樣的:在表中的數據進行操作時(更新),
先給數據表加一個版本(version)字段,每操作一次,將那條記錄的版本號加1。
也就是先查詢出那條記錄,獲取出version字段,如果要對那條記錄進行操作(更新),
則先判斷此刻version的值是否與剛剛查詢出來時的version的值相等,
如果相等,則說明這段期間,沒有其他程序對其進行操作,則可以執行更新,
將version字段的值加1;如果更新時發現此刻的version值與剛剛獲取出來的version的值不相等,
則說明這段期間已經有其他程序對其進行操作了,則不進行更新操作。
悲觀鎖
共享鎖
排它鎖
30.HashMap 和 HashTable的區別
HashMap是非線程安全的,只是用于單線程環境下,多線程環境下可以采用concurrent并發包下的concurrentHashMap。
hashmap 是線程不安全的
HashTable的區別 是線程安全的,。
31.單一索引和聯合索引的區別
單一列索引可以出現在where 條件中的任何位置,而聯合索引需要按一定的順序來寫.
在多條件查詢時,聯合索引效率要高.
32.冒泡排序
33.遞歸
34.整數
22 , 022 , 0x22
35.Tomcat優化
內存優化
配置優化
三、組件優化
36.spring 工作原理及事物機制
內部最核心的就是IOC了,動態注入,讓一個對象的創建不用new了,可以自動的生產,
這其實就是利用java里的反射,反射其實就是在運行時動態的去創建、調用對象,Spring就是在運行時,
跟xml Spring的配置文件來動態的創建對象,和調用對象里的方法的
最明顯的一個例子就是sessionfactiory配置后,可以直接的調用。不用再去new
?
AOP(Aspect-Oriented Programming): 面向方面編程
1、 代理的兩種方式:
靜態代理:
? 針對每個具體類分別編寫代理類;
? 針對一個接口編寫一個代理類;
動態代理:
針對一個方面編寫一個InvocationHandler,然后借用JDK反射包中的Proxy類為各種接口動態生成相應的代理類
?
37.css加載優先級
瀏覽器缺省 < 外部樣式表 < 內部樣式表 < 內聯樣式
38.mybatis工作原理
MyBatis應用程序根據XML配置文件創建SqlSessionFactory,SqlSessionFactory在根據配置,
配置來源于兩個地方,一處是配置文件,一處是Java代碼的注解,獲取一個SqlSession。
SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession實例直接運行映射的sql語句,
完成對數據的增刪改查和事務提交等,用完之后關閉SqlSession。
39.servlet 九大內置對象
request,response ,session ,application ,out ,page,config , exception , pageContext
40.ajax工作原理
Ajax的原理簡單來說通過XmlHttpRequest對象來向服務器發異步請求,從服務器獲得數據,
然后用javascript來操作DOM而更新頁面。這其中最關鍵的一步就是從服務器獲得請求數據。
要清楚這個過程和原理,我們必須對 XMLHttpRequest有所了解。
缺點:1.即對瀏覽器后退機制的破壞。 2、安全問題 3、對搜索引擎的支持比較弱。
41.隊列
隊列是一種特殊的線性表,它只允許在表的前端進行刪除操作,而在表的后端進行插入操作。
?
42.java arraylist 和linklist區別
1.ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。 (LinkedList是雙向鏈表,有next也有previous)
2.對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。
3.對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
43.java操作xml用什么
用SAXReader創建一個xml解析器對象
44.spring常見的注解
@Resource
@Autowired
@Service
@Repository
@Service注解,其實做了兩件事情:
(1)、聲明Zoo.java是一個bean,這點很重要,因為Zoo.java是一個bean,其他的類才可以使用@Autowired將Zoo作為一個成員變量自動注入。
(2)、Zoo.java在bean中的id是"zoo",即類名且首字母小寫。
@Controller
@Scope 默認是"singleton"即單例,"prototype"表示原型即每次都會new一個新的出來。
@Repository、@Service 和 @Controller。 @Component 是等效的
@Service用于標注業務層組件
@Controller用于標注控制層組件(如struts中的action)
@Repository用于標注數據訪問組件,即DAO組件
@Component泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。
45.消息中間件
46.spring 好處:
輕量:Spring 是輕量的,基本的版本大約2MB。
控制反轉:Spring通過控制反轉實現了松散耦合,對象們給出它們的依賴,而不是創建或查找依賴的對象們。
面向切面的編程(AOP):Spring支持面向切面的編程,并且把應用業務邏輯和系統服務分開。
容器:Spring 包含并管理應用中對象的生命周期和配置。
MVC框架:Spring的WEB框架是個精心設計的框架,是Web框架的一個很好的替代品。
事務管理:Spring 提供一個持續的事務管理接口,可以擴展到上至本地事務下至全局事務(JTA)。
?
47.Spring框架中的單例bean是線程安全的嗎?
不,Spring框架中的單例bean不是線程安全的。
在 Spring中如何注入一個java集合?
48.Spring提供以下幾種集合的配置元素:
<list>類型用于注入一列值,允許有相同的值。
<set> 類型用于注入一組值,不允許有相同的值。
<map> 類型用于注入一組鍵值對,鍵和值都可以為任意類型。
<props>類型用于注入一組鍵值對,鍵和值都只能為String類型。
49. Spring支持的事務管理類型
Spring支持兩種類型的事務管理:
編程式事務管理:這意味你通過編程的方式管理事務,給你帶來極大的靈活性,但是難維護。
聲明式事務管理:這意味著你可以將業務代碼和事務管理分離,你只需用注解和XML配置來管理事務。
50.ajax 跨域的問題?
1、使用jsonp
2、服務器代理
3、在服務端設置response header中Access-Control-Allow-Origin字段。
51.前++ 和后++ 的問題
首先,不管前++ 還是后++,被+ 的變量都是會變化的,而,他們的區別就是賦值
int b = 6;
int a = b++;
后加加的話,就是在賦值后,再執行++;這里a=6;b= 7
int c = ++b; 而前加是指在賦值前就加上,這里c=7 ;b=7
轉載于:https://www.cnblogs.com/sunxun/p/8572968.html
總結
- 上一篇: 如何用Postman做接口测试
- 下一篇: jmeter接口测试实例-关联