美文网首页
Java面试题

Java面试题

作者: 代码不会写 | 来源:发表于2018-08-19 16:36 被阅读0次

基础篇

基本功

1.面向对象的特征
封装:也就是把同一类事物的相关属性和行为(方法)方到同一个类中,对于属性和方法我们可以设置访问修饰符来确定他们的访问级别。通常将字段设置为private,然后定义setXXX和getXXX方法来操作这个属性,避免用户直接访问这个字段。

继承:对已有的类派生出一个新类,这个新的类拥有已有类的属性和方法,并可以对方法进行重写来扩展自己的功能。java中只允许单继承,也就是一个类只可能有一个父类,但是一个类可以实现多个接口。

多态:父类接口指向子类的实例对象,当父类接口调用方法时,如果不同的子类均重写了该方法,那么不同的子类会表现出不同的行为。也就是父类接口发出一个消息,不同的子类会对同一个消息做出不同的反应,这就是多态。
2.final, finally, finalize 的区别
final:只可读不可写的常量。它修饰的变量一旦赋值便不可再次赋值。final修饰的变量在编译阶段静态绑定,所以定义的时候必须初始化,或者在构造函数中初始化。static final变量必须在定义的时候就初始化。final引用表示该引用指向一个固定地址的对象,不能再指向其他的同类对象,但是对象里的属性值是允许修改的。
3.int 和 Integer 有什么区别
类型:int是java基本数据类型,Integer是java提供的包装类,是对象,封装了很多方法,比如其他数据类型转化为Integer的方法。
默认值:int 默认值为0,Integer默认值为null
比较:
3.1: int 和Integer(无论是否new)比一定为true,Integer会自动拆箱为int与int进行比较
int a = 128; Integer b = new Integer(128); a == b 为true
3.2:两个Integer比,若都为new,则不相等,因为对象在堆中的地址不同。
Integer a = new Integer(1); Integer b = new Integer(1); a==b 为false
3.3:一个Integer赋值常量,一个Integer new,也肯定不相等,因为一个对象在常量池(值超出-128~127在堆里),一个对象在堆,地址不同。
Integer a = 12; Integer b = new Integer(12); a==b为false ,a在常量池,b在堆里。
Integer a = 400;Integer b = new Integer(400); a==b为false,a和b都在堆中,地址不同。
3.4:两个Integer均赋值常量,可能相等也可能不相等。当常量范围在-128到127之间时,两个Integer均指向常量池同一个地址,相等。若常量范围不在这个之间,肯定不相等,因为会在堆中new一个对象,两个地址肯定不同。
Integer a = 12; Integer b = 12; a==b 为true 因为a和b指向常量池同一个地址。
Integer a = 400; Integer b = 400; a==b 为false 因为400超出常量池缓存范围,会在堆中分配内存,a和b执行不同的地址。
Integer自动装箱时,若值在-128-127,会从常量池中读取
Byte自动装箱时,一定会从常量池中读取。
Character自动装箱时,若字符对应十进制的值在0-127,会从常量池中读取

4.重载和重写的区别
重载(overload):实现了类的多态性。判断一个方法是不是另一个方法的重载,只要看方法名和参数列表。方法名必须相同,但是参数个数或者参数类型必须不同。返回类型不作为判断依据。
重写(override):实现了父类和子类的多态性。判断一个子类方法是不是对父类方法的重写:1方法名和参数类表要完全相同2:返回类型、抛出的异常、访问权限修饰符遵循“两小一大”的原则,即该方法返回类型要小于等于父类方法的返回类型,抛出的异常要小于等于父类抛出的异常,不能抛出无关异常。子类方法的访问权限大于等于父类该方法的访问权限。
5.抽象类和接口有什么区别

6.说说反射的用途及实现

7.说说自定义注解的场景及实现

8.HTTP 请求的 GET 与 POST 方式的区别

9.session 与 cookie 区别

10.session 分布式处理

11.JDBC 流程

12.MVC 设计思想

13.equals 与 == 的区别

14.java中常见的集合?
答:
ArrayList,LinkedList,vector,
HashSet,TreeSet,
HashMap,Hashtable,concurrentHashMap
treeMap
15.ArrayList和LinkedList的区别
答:
A1:ArrayList用数组实现的,适合元素的随机访问
LinkedList用链表实现,适合元素的增加和删除,因为不用移动元素
16.Vector和ArrayList区别
答:
1.vector是线程安全的,适合在多线程环境下使用,ArrayList没有实现线程安全
但是性能更高。
2.当扩容时,ArrayList容量会变为原来的1.5倍,而vector会变为原来的2倍
17.HashMap与TreeMap区别
HashMap存储的key-value不一定是有序的,而TreeMap存储的是有序的
HashMap基于数组+链表+红黑树实现,而TreeMap是基于红黑树实现的。
18.Hashtable与HashMap区别
Hashtable不可以存放null key或者 null value ,HashMap可以
Hashtable是线程安全的,HashMap线程不安全。
19.聊一下Spring中的IOC和AOP
IOC:控制反转。意思是将某个类中的引用的对象的实例化交给spring去构建,而不是类自身去新建这个对象实例。
AOP:面向切面编程,对于系统的服务如日志、安全,事务等封装成
一个切面注入到目标对象或者业务逻辑中去。你只需要关注自己的业务逻辑实现。
如可以对service层配置AOP事务,当执行service层的方法时,自动开启和关闭事务。
我们只需要关注业务逻辑的实现,不需要再关注事务是否开启和关闭,这些spring都帮我们完成
了。
20.Spring IOC初始化过程
step1:对resource进行定位
step2:BeanDefinition的载入
step3:BeanDefinition在IOC容器中进行注册

21:日常工作中使用过Spring AOP的场景
AOP与日志,AOP与事务,接触比较多的还是AOP与事务。

22.Spring中管理的bean是单例还是多例的,是线程安全的吗?为什么?抛开框架,单例一定是线程安全的么?怎么实现线程安全的单例
答:spring中管理的bean默认是单例的,当该bean所对应的对象存在可变成员变量时,多线程情况下有可能出现数据不一致的问题,因为一旦可变成员变量被某个线程改变时,其他线程访问不到该变量的初始状态,造成数据错乱。
单例模式不一定是线程安全的,取决于该单例对应的对象是否定义了可变的成员变量。
单例想实现线程安全,可以给创建实例的代码添加同步关键字。

23.说说Spring的事物处理以及隔离级别?
答:spring有5种事务隔离级别(数据库有4种)
1:默认事务隔离级别,由数据管理员进行定义
2:未提交读(可能会有脏读、不可重复读,幻读的问题)
3:已提交读 (解决了脏读问题,存在不可重复读,幻读问题)
4:可重复读 (解决了脏读和不可重复读的问题,存在幻读问题)
5:串行化
事务隔离级别越高,则并发性能越差。
spring事务的七种传播行为:
1:支持当前事务。如果当前没有事务,则新建一个事务。PROPAGATION_REQUIRED
2: 支持当前事务。如果当前没有事务,以非事务方式执行。PROPAGATION_SUPPORTS
3:支持当前事务。如果当前没有事务,则抛出异常PROPAGATION_MANDATORY
4:不管当前是否有事务,都新建事务,将原有事务挂起PROPAGATION_REQUIRES_NEW
5:不支持当前事务。有事务就挂起以非事务方式运行PROPAGATION_NOT_SUPPORTED
6:不支持当前事务。有事务就抛出异常。PROPAGATION_NEVER
7:如果当前事务存在,则在嵌套事务中执行,如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。PROPAGATION_NESTED

24.mybatis优点和缺点?

优点:代码量比jdbc少;sql语句写在xml文件中,与程序代码解耦合;可以配置动态sql
缺点:编写sql语句的工作量比较大,对开发人员的sql能力有要求;对数据库有依赖,
移植性不好。
适合对性能要求较高,需求变化较快的项目。

25.用过mybatis的哪些开源插件?
Mybatis-PageHelper:拦截sql语句进行分页,无需修改底层代码。
Mybatis-generator:生成pojo,mapper文件和xml文件.

26.类的实例化顺序?
答:
父类的静态域(静态变量、静态代码块)
子类的静态域(静态变量、静态代码块)
父类的非静态域(构造代码块,构造方法,非静态变量)
子类的非静态域(构造代码块,构造方法,非静态变量)
27.java内存模型?

程序计数器(指向当前执行的字节码指令)
java虚拟机栈(每个线程都创建一个,存储java方法的栈帧,为调用java方法服务)
java本地方法栈(每个线程都创建一个,存储native方法的栈帧,为调用native方法
服务)
(以上三个是线程级别的,每个线程独有,不共享)
堆,
方法区(又称永久代)(所有线程共享这两个区域)

注意:jdk1.8移除了永久代,替换为元数据区,且该元数据区存在于本地内存,与
虚拟机的内存没有关系。

28.内存溢出常见的哪几种?导致溢出的常见场景、用过哪些分析工具排查
OOM,StackOverFlow

jmap:java内存映像工具
jstack:java堆栈跟踪工具

29.mysql事务隔离级别哪几种?默认的是什么?
默认是可重复读。
未提交读,已提交读,可重复读,串行化

30.浅谈Java中的深拷贝和浅拷贝?
浅拷贝:开辟新的内存空间复制一个对象,但是对象
的引用仍然指向原来的内存空间。
深拷贝:开辟新的内存空间复制一个对象,并且也将对象
中的引用所指向的内存空间进行复制。

相关文章

网友评论

      本文标题:Java面试题

      本文链接:https://www.haomeiwen.com/subject/vqwciftx.html