Java面试题分享211102
一.Java基础
1.抽象类和接口的区别。
答:(1).抽象类有默认的方法实现。接口是完全抽象的,不存在方法的实现。
(2).抽象类子类需要extends关键字继承。接口使用关键字Implements来实现接口。
(3).抽象类有构造器。接口没有。
(4).抽象类可以用多种修饰符。接口只能是public。
(5).抽象方法可以继承一个类和实现多个接口。接口只能继承一个或多个其他接口。
(6).抽象方法速度快。
(7).添加新方法,抽象类可以给它提供默认的实现,不需要改变现在的代码。接口必须改变现在的接口的子类
2.Java中是否可以覆盖(override) 一个private或者是static的方法?为什么?
答:不可以。
static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
3.解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
答:定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间。通过new关键字和构造器创建的对象则放在堆空间。方法区和堆都是各个线程共享的内存区域,比如常量池。
4.super()与 this()的区别?
答:super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
5. ArrayList 和 LinkedList 有什么区别。
答:ArrayList 是动态数组结构,有索引,查询快,增删慢(因为要移动索引),LinkedList是链表结构,无索引,有指向前后的指针,查询需要从头开始向下寻找,增删快(只需要修改链表中指针的指向,不需要移动其他)。
6. 怎么去掉一个集合中的重复数据,请列举两种以上的办法。
答:(1).使用set集合。
(2).使用java8中的contains()方法。
7. 集合的泛型有什么优点?
答:达到元素类型明确的目的,提高了代码的复用性,减少了工作量
8. 说说Java创建线程几种方法。
答:通过实现 Runnable 接口。通过继承 Thread 类本身。通过 Callable 和 Future 创建线程。
9. Java回调如何实现异步。
答:使用sleep方法,可实现先返回后执行方法。
10. JAVA 中Exception和Error的区别。
Exception可以是可被控制或不可控制的,一般是程序错误。Error是不可控制的,一般是系统错误。
11.以下代码运行输出是(C)public class Person{ private String name="Person"; int age=0; } public class Child extends Person{ public String grade; public static void main(String[] args){ Person p = new Child(); System.out.println(p.name); } }
A) 输出:Person
B) 没有输出
C) 编译出错
D) 运行出错
12.在使用super 和this关键字时,以下描述正确的是(A)
A) 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
B) super()和this()不一定要放在构造方法内第一行
C) this()和super()可以同时出现在一个构造函数中
D) this()和super()可以在static环境中使用,包括static方法和static语句块
13.Java中的集合类包括ArrayList、LinkedList、HashMap等类,下列关于集合类描述错误的是(C)(单选)
A) ArrayList和LinkedList均实现了List接口
B) ArrayList的访问速度比LinkedList快
C) 添加和删除元素时,ArrayList的表现更佳
D) HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
14.下列哪个方法可以使线程从运行状态进入其他阻塞状态(A)
A. sleep B.wait C.yield D.start
15.以下对异常描述正常的有(ABD)
A.异常分为Error和Exception B. Throwable是所有异常类的父类
C.Exception是所有异常类父类 D. Exception包括RuntimeException和RuntimeException之外的异常二.Spring
1.简单说明Spring的俩大特性。
IOC:控制反转 AOP:面向切面
一个spring项目启动,先有控制反转,后有面向切面。例如,先得注入控制层(controller),业务层(service),数据访问层(dao)之后,才能使用面向切面,例如对service进行事务处理@Transactional,或者日志打印等等,对其进行横切。
2.简要说明Spring MVC运行流程。
客户端(浏览器)发送请求,直接请求到DispatcherServlet。
DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。
解析到对应的Handler后,开始由HandlerAdapter适配器处理。
HandlerAdapter会根据Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。
处理器处理完业务后,会返回一个ModelAndView对象,Model是返回的数据对象,View是个逻辑上的View。
ViewResolver会根据逻辑View查找实际的View,
DispaterServlet把返回的Model传给View。
通过View返回。
3.列举Spring中的常用注解,并说明用处。
@Controller定义表现层组件,@Service定义业务逻辑层组件,@Repository定义数据访问层资源库组件,@Component定义其它组件。@Autowired和@Resource自动装配;@Transactional大家都知道用于开启事务以及设置传播性、隔离性、回滚条件等;@Configuration用于标注配置类,启用Java配置方式的Bean配置,@Bean用于配置一个Bean;@RequestBody从请求体(处理复杂数据,比如JSON),@ResponseBody我们实现Restful接口的时候最常用了,把返回内容(序列化后)输出到请求体。
4.用过Spring boot吗?我同时配置了xml和properties文件,会使用哪个文件呢?
先加载properties文件,再加载yml文件。三.SQL
1.请说明having和where的区别。
having是先分组在进行筛选,而where是先筛选再进行分组
2.如何同时查询两张没有关联的表。
使用union all。
3.请说明不使用外键的好处。
保证数据的完整性和一致性;级联操作方便;将数据完整性判断托付给了数据库完成,减少了程序的代码量
4.
student表
course表
student_course表
查询平均分低于80的学生,列出学生名字和平均分select s.`name`,avg(sc.score) as avg_score from student_course sc left join student s on s.`id` =sc.sid group by sc.sid having(avg_score<80);
查询每个学生的总成绩,结果列出学生姓名和总成绩select name,sum(score) total from student,student_course where student.id=student_course.sid group by sid;
查出各科成绩的前三名,列出学生姓名和成绩,还有科目。select s.`name`,c.`name`,x.score from student_course x left join student s on x.sid = s.id left join course c on c.id =x.cid where 3>( select count(*) from student_course y where y.cid=x.cid and y.score>x.score ) order by cid,score desc;