1. 程式人生 > >18年11月下,面試題積累

18年11月下,面試題積累

map遍歷方法
1、Iterator遍歷

   Iterator<Map.Entry<String,String>> it = map.entrySet().iterator();
      while(it.hasNext()){
        Map.Entry<String,String> entry=it.next();
        System.out.println("key=" +entry.getKey() +" and value="+entry.getValue());
    }

2、取值遍歷

    for(String key:map.keySet()){
        System.out.println("key="+key+"and value=" +map.get(key));
    }

3、遍歷所有的Value值
該方式取得不了key值,直接遍歷map中存放的value值

  for(String v:map.values()){
        System.out.println("value= "+ v);
  }

4、使用entrySet遍歷

  for(Map.Entry<String,String > entry:map.entrySet()){
        System.out.println("key=" +entry.getKey() +" and value="+entry.getValue());
 }

tomcat配置,專案請求路徑的配置,埠號的配置
conf目錄下 server.xml

public private protect的許可權區別

hibernate和mybatis的快取機制

spring的依賴注入有幾種
myBatis的$和#
@Autowired與@Resource

jdbc的流程
1、 載入JDBC驅動程式:
2、 提供JDBC連線的URL
3、建立資料庫的連線
4、建立一個Statement
5、執行sql
要連線資料庫,需要向java.sql.DriverManager請求並獲得Connection物件, 該物件就代表一個數據庫的連線。
使用DriverManager的getConnectin(String url , String username , String password )方法傳入指定的欲連線的資料庫的路徑、資料庫的使用者名稱和 密碼來獲得。

zookeeper的選取leader 原理
kafka的執行的機制

synchronized和lock鎖的區別,重入鎖
樂觀鎖和悲觀鎖

MySql和Orcale的分頁
mysql --> limit
oracle–> rownum
Herinate --> setfirstResult(),setMaxResult()

sql查詢(批量插入,批量更新)
insert into student values
(1,小明),(2,小黃),(3,小天)

更新多條記錄的同一個欄位為同一個值
UPDATE course SET name=‘course1’ WHERE id in(‘id1’,‘id2’,'id3);

更新多條記錄為多個欄位為不同的值
MySQL沒有提供直接的方法來實現批量更新,但可以使用case when語法來實現這個功能。
UPDATE course
SET name = CASE id
WHEN 1 THEN ‘name1’
WHEN 2 THEN ‘name2’
WHEN 3 THEN ‘name3’
END,
title = CASE id
WHEN 1 THEN ‘New Title 1’
WHEN 2 THEN ‘New Title 2’
WHEN 3 THEN ‘New Title 3’
END
WHERE id IN (1,2,3)

case when then end可用於sql行列互換查詢
題目:資料庫中有一張如下所示的表,表名為sales。
年 季度 銷售量
1991 1 11
1991 2 12
1991 3 13
1991 4 14
1992 1 21
1992 2 22
1992 3 23
1992 4 24

要求:寫一個SQL語句查詢出如下所示的結果。
年 一季度 二季度 三季度 四季度
1991 11 12 13 14
1992 21 22 23 24

我給出的答案是這樣的:
select 年,
sum(case when 季度=1 then 銷售量 else 0 end) as 一季度,
sum(case when 季度=2 then 銷售量 else 0 end) as 二季度,
sum(case when 季度=3 then 銷售量 else 0 end) as 三季度,
sum(case when 季度=4 then 銷售量 else 0 end) as 四季度
from sales group by 年;

叢集和分散式的關係
簡單的解釋:
小飯店原來只有一個廚師,切菜洗菜備料炒菜全乾。後來客人多了,廚房一個廚師忙不過來,又請了個廚師,兩個廚師都能炒一樣的菜,這兩個廚師的關係是叢集。為了讓廚師專心炒菜,把菜做到極致,又請了個配菜師負責切菜,備菜,備料,廚師和配菜師的關係是分散式,一個配菜師也忙不過來了,又請了個配菜師,兩個配菜師關係是叢集

負載均衡的幾種常用方式
1、輪詢(預設)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
upstreambackserver {
server192.168.0.14;
server192.168.0.15;
}
2、weight
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的
情況。
upstreambackserver {
server192.168.0.14weight= 3;
server192.168.0.15weight= 7;
}
權重越高,在被訪問的概率越大,如上例,分別是30%,70%。
3、上述方式存在一個問題就是說,在負載均衡系統中,假如使用者在某臺伺服器上登入了,那麼該使用者第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到伺服器叢集中的某一個,那麼已經登入某一個伺服器的使用者再重新定位到另一個伺服器,其登入資訊將會丟失,這樣顯然是不妥的。
我們可以採用ip_hash指令解決這個問題,如果客戶已經訪問了某個伺服器,當用戶再次訪問時,會將該請求通過雜湊演算法,自動定位到該伺服器。
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
upstream backserver {
ip_hash;
server192.168.0.14: 88;
server192.168.0.15: 80;
}
4、fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
upstream backserver {
serverserver1;
serverserver2;
fair;
}
5、url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。
upstreambackserver {
serversquid1: 3128;
serversquid2: 3128;
hash$request_uri;
hash_methodcrc32;
}