zoukankan      html  css  js  c++  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=1;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);
    }
    }
  • 相关阅读:
    《C# to IL》第一章 IL入门
    multiple users to one ec2 instance setup
    Route53 health check与 Cloudwatch alarm 没法绑定
    rsync aws ec2 pem
    通过jvm 查看死锁
    wait, notify 使用清晰讲解
    for aws associate exam
    docker 容器不能联网
    本地运行aws lambda credential 配置 (missing credential config error)
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
  • 原文地址:https://www.cnblogs.com/zhujiqian/p/11551795.html
Copyright © 2011-2022 走看看