今天下午两点的时候,我去面了一家招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 |
根据上面这个规律,其实已经看出来, 这是类似斐波那契数列的数列: Sn = 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); } }