1. 程式人生 > >Java後端面試經驗總結分享(一)

Java後端面試經驗總結分享(一)

今天下午兩點的時候,我去面了一家招Java開發的公司,本人工作經驗2年多一丟丟。

 

跟大部分公司類似,先做一份筆試題,題目都比較簡單,基本都寫完了。我把題目以及答案列在下面一下,給自己做一下總結的,也分享給一些需要的小夥伴,下面答案是我根據網上的進行總結的。

 

一.抽象類與介面的區別。

相同點
都不能被例項化

區別:

1.一個介面可以繼承多個介面,但一個類只能有一個父類,類可以實現多個介面;

2.介面和抽象類必須實現其中所有的方法,抽象類中如果有未實現的抽象方法,那麼子類也需要定義為抽象類。抽象類中可以有非抽象的方法。

3.抽象類中可以包含普通方法,但介面中只能包含public abstract方法(JDK 1.8之前);JDK 1.8允許給介面新增非抽象的方法實現,但必須使用default關鍵字修飾

4.抽象類中的成員變數沒有訪問許可權的限制,但介面中的變數只能被public static final修飾;

5.介面強調特定功能的實現,而抽象類強調所屬關係;

 

二.String,StringBuffer,StringBuilder三者的區別。

1.執行速度方面:StringBuilder > StringBuffer > String。

2.可變性:String是final定義的,是字串常量,一旦建立之後該物件是不可更改的(若重新給原來的引用賦值,改變的只是引用的指向位置,但常量池裡還是保留原來的字串),但後兩者的物件是是可以更改的。

3.執行緒安全方面:StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的。StringBuffer執行緒安全的一個原因是很多方法例如append裡,是帶有synchronized關鍵字,所以可以保證執行緒是安全的,而StringBuffer是沒有的,所以是執行緒不安全;

 

三.try catch finally的三者作用。

其中try{...}這一塊程式碼是需要被檢測異常的程式碼;而catch{...}這一段是處理異常的程式碼;最後的finally{...}程式碼塊是一定會被執行的程式碼。

 

四.Struts,SpringMVC,Springboot三者的區別。

struts2 和 springMvc:

1.Springmvc的入口是servlet前端控制器(DispatcherServlet),struts2入口是一filter過濾器(StrutsPrepareAndExecuteFilter);

2.SpringMVC開發效率高於Struts2;

3.struts2通過在action類中定義成員變數接收引數,它使用多例模式管理action.

4.springmvc通過在coontroller方法中定義形參接收引數,springmvc可以使用單例模式管理controller.      

5.springMvc屬於一個企業WEB開發的MVC框架,涵蓋麵包括前端檢視開發、檔案配置、後臺介面邏輯開發等,XML、config等配置相對比較繁瑣複雜;

6. springBoot框架相對於springMvc框架來說,更專注於開發微服務後臺介面,不開發前端檢視;

 

五.寫一個學生課程成績的主要資料庫,可能需要實現的SQL報表語句;

答案原貼連結:https://blog.csdn.net/jerryDzan/article/details/86217415

表架構

Student(S#,Sname,Sage,Ssex) 學生表
Course(C#,Cname,T#) 課程表
SC(S#,C#,score) 成績表
Teacher(T#,Tname) 教師表

學生表:

1 CREATE TABLE student 
2 ( 
3      s_id  INT,
4      sname varchar(32),
5      sage  INT, 
6      ssex  varchar(8) 
7  );

課程表:

1 CREATE TABLE course 
2   ( 
3      c_id    INT, 
4      cname varchar(32), 
5      t_id    INT 
6   );

 分數表:

1 CREATE TABLE sc 
2 ( 
3      s_id  INT, 
4      c_id  INT, 
5      score INT 
6 ) ;

教師表:

CREATE TABLE teacher 
( 
     t_id    INT, 
     tname varchar(16) 
);
 1 1、查詢“001”課程比“002”課程成績高的所有學生的學號; 
 2      select a.s_id FROM
 3      (select s_id,score from sc where c_id = '001')a,(select s_id,score from sc where c_id = '002')b
 4      where a.score > b.score and a.s_id = b.s_id;
 5  
 6 2、查詢平均成績大於60分的同學的學號和平均成績; 
 7     select s_id,avg(score)
 8       from sc
 9     group by s_id
10     having avg(score)>60;
11 3、查詢所有同學的學號、姓名、選課數、總成績; 
12    select Student.s_id,Student.Sname,count(SC.c_id),sum(score) 
13    from Student left Outer join SC on Student.S_id=SC.S_id 
14    group by Student.S_id,Sname ;
15 4、查詢姓“李”的老師的個數; 
16         select DISTINCT(count(tname))
17         from teacher
18         where tname like '李%';
19 5、查詢沒學過“葉平”老師課的同學的學號、姓名; 
20    select Student.S_id,Student.Sname 
21    from Student  where s_id not in
22    (select distinct( SC.S_id) from SC,Course,Teacher where  SC.C_id=Course.C_id and Teacher.T_id=Course.T_id and teacher.tname = '葉平')
23    
24     
25 6、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名; 
26     
27     select student.s_id,student.sname from SC,student where  SC.s_id=student.s_id and SC.C_id='001'
28   and EXISTS 
29   (select * from SC as SC2  where  SC2.s_id=SC.s_id and SC2.C_id='002')
30  
31 7、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
32    select s_id,sname
33    from student
34    where s_id in
35    (select SC.S_id from SC,Course,Teacher where  SC.C_id=Course.C_id and Teacher.T_id=Course.T_id and teacher.tname = '葉平' 
36    GROUP BY sc.s_id
37    having count(SC.c_id) =
38    (select count(c.c_id) from course c,teacher t
39    where c.t_id=t.t_id and t.tname = '葉平')) ;
40     
41   
42 8、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名; 
43      select a.s_id,a.sname from
44       (select sc.s_id,sc.score,student.sname from SC,student where  SC.s_id=student.s_id and SC.C_id='001')a,
45       (select sc.s_id,sc.score from SC,student where  SC.s_id=student.s_id and SC.C_id='002')b
46     where a.s_id = b.s_id and a.score> b.score;
47  
48  
49 9、查詢所有課程成績小於60分的同學的學號、姓名; 
50   select S_id,Sname 
51   from Student 
52   where S_id not in (select S.S_id from Student AS S,SC where S.S_id=SC.S_id and score>60); 
53  
54 10、查詢沒有學全所有課的同學的學號、姓名; 
55   select s.s_id,s.sname
56   from student s,sc sc
57   where s.s_id = sc.s_id
58   GROUP BY s.s_id,s.sname
59   HAVING COUNT(sc.c_id) < (select count(c_id) from course)
60     
61 11、查詢至少有一門課與學號為“1”的同學所學相同的同學的學號和姓名; 
62      select  DISTINCT Student.s_id,Student.sname 
63    from Student,sc where student.s_id = sc.s_id
64      and sc.c_id in (select c_id from sc where s_id='1')

 

六.演算法題: 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數?

這道演算法題,我第一眼看到的時候,其實是懵逼的,後來,把他們的前幾個月的數量情況列了一下

1月 2月 3月 4月 5月 6月 7月 8月
1 1 2 3 5 8 13 21



根據上面這個規律,其實已經看出來, 這是類似斐波那契數列的數列: S= Sn-1+Sn-2(斐波那契數列從0開始的),也就是說,每一個值,都等於前面兩個值得和。

基於這個思路,我們可以用遞迴來實現這個演算法:

 1 public class Example{
 2 
 3 public static void main(String[] args){
 4        for(int i=0;i<=24;i++){
 5        System.out.print("每個月兔子的總數:"+f(i));
 6     }
 7 }
 8 
 9 public static int f(int n){
10         if(n==1||n==2)
11                return 1;
12         else f(n-2)+f(n-1);   
13 }
14 
15 }

 

 

七.演算法題:一個球從100米高度自由落下,每次落地後反彈回原高度的一半,再落下。它在第10次落地時,共經過多少米?第10次反彈多高?

這道演算法題也比較簡單,實現思路如下:

public class Example20 {
public static void main(String[] args){
double sum=0;
double height=100;

sum(sum,height);
}
public static void sum(double sum,double height){
for(int i=2;i<=10;i++){
height=height/2;
sum+=height*2;
}
System.out.println("總經過的長度:"+sum+100);
System.out.println("第十次反彈多高:"+height/2);
}
}

&n