# Java 面试题总结
## 2016年11月15日
### 傲世堂 电话面试
- 第一个问题是前15%输出多少,20%输出多少,问你平均数多少。第一题愣是没懂啥意思,结果面试官说,那好跳过这一题。
- 后面问了图的存储结构有哪些?
- 堆排序和快排序的时间复杂度分别是多少?
- map和set中哪一个可以由另一个得到?
- 四个随机的无序的数字排序,最坏的的情况是要比较多次?
- 二分查找法对一个长度为16的有序数组查询一个不存在的数,最坏的情况下需要多少次查询?
- 一个完全二叉树,有4层,其三层是有一个叶子节点,问该树有多少个节点?
### 武汉方正璞华公司面试题
最后一题SQL
成绩表:Grade
字段:No 学号
Name 姓名
Subject 科目
Score 分数
第一个问题:请查询学生中所有成绩大于80分的学生No,Name
第二个问题:请查询出学生的总分排名,学生No,学生Name,以及总分
题目先记下,有时间补答案。
找了一下答案:
补充如下
1.抽象类和接口的区别?
接口是否可以继承接口,抽象类是否可以实现接口,抽象类是否可以继承实体类。(都可以)
2.重载和重写的区别?
Overload是重载的意思,Override是覆盖的意思,也就是重写。
重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。
重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。
至于Overloaded的方法是否可以改变返回值的类型这个问题,要看你倒底想问什么呢?这个题目很模糊。如果几个Overloaded的方法的参数列表不一样,它们的返回者类型当然也可以不一样。但我估计你想问的问题是:如果两个方法的参数列表完全一样,是否可以让它们的返回值不同来实现重载Overload。这是不行的,我们可以用反证法来说明这个问题,因为我们有时候调用一个方法时也可以不定义返回结果变量,即不要关心其返回结果,例如,我们调用map.remove(key)方法时,虽然remove方法有返回值,但是我们通常都不会定义接收返回结果的变量,这时候假设该类中有两个名称和参数列表完全相同的方法,仅仅是返回类型不同,java就无法确定编程者倒底是想调用哪个方法了,因为它无法通过返回结果类型来判断。
override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
overload对我们来说可能比较熟悉,可以翻译为重载,它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM就会根据不同的参数样式,来选择合适的方法执行。在使用重载要注意以下的几点:
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(当然,同一方法内的几个参数类型必须不一样,例如可以是fun(int,float),但是不能为fun(int,int));
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、对于继承来说,如果某一方法在父类中是访问权限是private,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。
3.java的基本数据类型。
(byte,short,int,long,char,float,double,boolean)
4请问输出的是什么?并说明理由!
public class Demo4 { public static void main(String[] args) { String str="1234"; changStr(str); System.out.println(str); } public static void changStr(String str){ str="welcome"; } }
输出:“1234”
5.在0-9999之间,随机传入一个数字,如果不足四位,前面用“0”补足并输出。例如,传入“12”,输出“0012”。输出“1234”
除了判断长度外还有什么其他的方法。
其中一种方法,利用String的方法实现。还可以通过判断长度补充0
1 public class Snippet { 2 public static void main(String[] args) { 3 int youNumber = 1; 4 // 0 代表前面补充0 5 // 4 代表长度为4 6 // d 代表参数为正数型 7 String str = String.format("%04d", youNumber); 8 System.out.println(str); // 0001 9 } 10 }
6.jsp的内置对象和动作方法?
内置对象:
request,用户端请求。
response,网页传回用户端的回应。
session,会话
application,它实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭
page,网页本身
pageContext,管理网页的属性
config,它是在一个Servlet初始化时,JSP引擎向它传递信息用的
exception,它是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。
out.用来传送回应的输出
动作方法:
jsp:include:在页面被请求的时候引入一个文件。
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean 的属性。
jsp:getProperty:输出某个JavaBean 的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java 插件生成OBJECT 或EMBED 标记
7.介绍你熟悉的mvc框架,并说出它们的优缺点。
MVC框架:struts2、springMVC
8..js和jquery获得input输入的值的方法
js:document.getElementById(id).value();
JQuery:$(“input#test”).val();
SQL基础:这个题我是没有完成的
成绩表(Grade)
字段:学号(No)、姓名(Name)、科目(Subject)、成绩(Score)
9、查询每门课程大于80分的学生的学号和姓名。
select No, Name group by No where No not in (select No from Grade where Score <= 80)
select No, Name group by No where No not in (select No from Grade where Score <= 80)
10、查询名次、学号、姓名、总分信息,并按总分排序。
select No