java面试必备考题

1.面向对象与面向过程的有哪些区别?


面向过程:比如洗衣服我们需要:打开洗衣机—》放衣服-》放洗衣粉-》清洗-》烘干
面向对象:需要拆出人和洗衣机两个对象
            人:打开洗衣机  放衣服   放洗衣粉
     洗衣机:清洗   烘干
面向对象
封装:把不想让外部调用的属性封装起来
继承:用于父子类中,子类可以继承父类的方法
多态:基与对象所属性的不同,外部对同一方法的调用,事假执行的逻辑不同

2.JDK、JR、JVM区别和联系

JDK:

JRE:

JVM:

3.==和equals的区别

==:对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址。

equals:比较的是内容

4.Spring、SpringBuffer、SpringBuilder的区别

Spring:spring是final修饰的,长度不可变。

SpringBuffer:SpringBuffer是线程安全的

SpringBuider:SpringBuider是线程不安全的

性能:SpringBuider > springbuffer > sprling

场景:经常需要改变字符串内容时,优先使用SpringBuilder,多线程使用共性变量时使用SpringBuffer。

5.重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于父类。

6.接口和抽象类

  • 抽象类可以存在普通成员函数,而接口只能存在 public abstract方法。
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。
  • 抽象类只能继承一个,几口可以实现多个。

7.list和set

list:有序,可重复,允许多个null元素对象

set:无序,不可重复,最对允许一个null元素对象

8.hashcode和equals

hashcode:哈希码,能根据“键”快速的检索出对应得“值”

  • 如果两个对象相等,这hashcode一定是相同的。
  • 两个对象相等,两个对象分别调用equals方法都返回true
  • 俩个对象有相同的hashcode值,他们也不一定是相等的
  • 因此,equals方法被覆盖国,则hashcode方法也必须被覆盖过
  • hashcode()的默认行为是对堆上的对象产生独特值。如果没有重写hashcode(),则该class的个对象无论如何都不会相等(即使这两个对象指向相同的数据)

9.ArrayList和LinkedLIst区别

ArrayList:基于动态数组,连续内存存储,适合下标访问,随机访问。扩容机制:因为数组长度固定,超出长度存数据是需要新建数组,然后将老数组的数据拷贝到新数组,如果 不是尾部插入数据还会涉及到袁术的移动(往后复制一份,插入元素),使用尾插法并指定初始容量可以极大提升性能、甚至超过linkedList(需要创建大量的node对象)。

LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询。需要逐一遍历。遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体内通过get(i)去的某一元素时都需要对list从新进行遍历,新能消耗极大。

另外不要试图使用indexof等返回元素索引,并利用其进行遍历,使用indexlof对list进行遍历,当结果为空会遍历整个列表。

10.HashMap和HashTable的区别?及底层实现是什么?

区别:

  • HashMap:方法没有synchronized修饰,线程不安全,HashTable:线程安全。
  • HashMap允许key和value为空,而HashTable不允许。

底层实现:数组+链表实现

jdk8开始链表高度到8、数组长度超过64,链表转变为红黑树,元素以内部类Node节点存在。

  • 计算key的hash值,二次hash然后对数组长度取模,对应到数组下标。
  • 如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组。
  • 如果产生hash冲突,先进行equal比较,相同则取代该元素,不同,则判断链表高度插入链表,链表高度达到8,并且数组长度到64则转变为红黑树,长度低于6则将红黑树转回链表。
  • key为null,存在下标0的位置。

11.  java中的异常体系

java中的所有异常都来自顶级父类Throwable。

Throwable下有凉的之类Exception和Error。

Error是程序无法处理的错误,一旦出现这个错误,这程序被迫停止运行。

Exception不会导致程序停止,粪污两个部分RunTimeException运行时异常和CheckedException检查异常。

RunTimeException常常发生在程序运行过程中,会导致程序当前线程执行失败,CheckedException常常发生在程序编译过程中,会导致程序编译不通过。

 12.线程的生命周期及状态

线程中通常的五种状态:创建、就绪、运行、阻塞、死亡。

13.spring是什么?

轻量级的开源的框架。他是一个容器框架哟经来装Javabean(java对象),中间层框架(万能胶)可以起一个链接作用,比如说把Struts和hibernate沾合在一起运用,可以让我们的企业开发更快、更简洁。

14.谈谈你对AOP的理解?

AOP:将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。AOP可以对某个对象或某些对象的功能进行增强,比如对象中的方法进行增强,可以在执行摸个方法之前额外的做一些事情,债摸个方法执行之后额外的做一些事情。

15.谈谈你对IOC的理解?

容器概念:控制反转、依赖注入

IOC容器:实际上就是map(key,value),里面存的是各种对象,在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建对象放到map里,扫描到打上描述的注解的类还是通过反射创建队形放到map里。

这时候map里就有各种对象了,接下来我们在代码里需要用到里面的对象时,在通过DI注入。

控制反转:全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心。

16.Spring、SpringBoot、SpringMVC有什么区别?

  • spring是一个IOC容器,用来管理bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提供AOP机制弥补OOP的代码重复问题,更方便将不同方法中的共同处理抽取成切面、制动注入给方法执行,比如日志,异常等。
  • SpringMVC是spring对web框架的一个解决方案,提供了一个总的前端控制器service,用来接收请求,然后定义了一套路由策略及配置执行handle,两handle结果使用试图解析技术生成视图展现给前端。
  • SpringBoot是Spring提供的一个快速开发工具包,让程序员能更方便、更快速的开发Spring +SpringMVC应用,简化了配置,整合了一些列的解决方案、redis、MongoDB、es、可以开箱即用。

17.springMVC工作流程

  1. 客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配前端控制器(或分发器/DispatcherServlet)的请求映射路径,web容器将请求转交给DispatcherServlet(前端控制器).
  2. DipatcherServlet(前端控制器)接收到这个请求之后将根据请求的信息以及处理器映射器(HandlerMapping)的配置找到处理请求的处理器(Handler)。
  3. 由具体的处理器适配器(HandlerAdapter)对Handler进行具体的调用。
  4. Handler对数据处理完成以后将返回一个ModelAndView()对象给 DispatcherServlet。
  5. DispatcherSevlet通过视图解析器(ViewResolver)将ModelAndView()转 化为真正的视图View。
  6. Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。
     

18.什么是Mybatis?

Mybatis是一个半制动化的ORM框架,底层封装了JDBC,简化对数据库的增删改查操作。

19.Mybatis的优缺点?

1.优点:

  • 基于sql语句编程,相当灵活,不会对硬功程序或者数据库的现有设计造成任何影响,sql写在xml文件中,解除sql与程序代码的耦合,便于统一管理;
  • 与JDBC 相比,减少了50%上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
  • 很好的与各种数数据库兼容。
  • 能够与spring很好的集成;
  • 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

2.缺点:

  • sql语句的编写工作量较大,尤其当字段多、关联表多时对开发人员编写sql语句的功底有一定要求;
  • sql语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值