本文主要是介绍Java面试必背,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Integer与int的区别
- int是Java提供的8种原始数据类型之一。Integer是Java为int提供的封装类。
- int的默认值为0,而Integer的默认值为null;
- Integer与new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(在方法区),他们的内存地址不一样,所以为false。
- 两个都是非new出来的Integer,如果数在-128到127之间,则为true,否则为false。因为Java在编译Integer i2=128的时候,被翻译成:Integer i2=Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。
- 两个都是new出来的,都为false。还是内存地址不一样。
- int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。
Java值传递和引用传递区别
- 值传递:
方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,而实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。(简单理解:副本传递) - 引用传递:
也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
在方法执行中,形参与实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。(简单理解:内存地址传递)
如何让多个线程按顺序执行
- 通过主线程Join()
线程1 t1=new线程1();
线程2 t2=new线程2();
线程3 t3=new线程3();
t1.start();
t1.join();
t2.start();
t2.join();
t3.start(); - 通过线程执行时Join()
只是把join();run方法里面罢了, - 共享对象锁,可以保证每个方法只能同时有一个线程进入,配合wait和notifyall方法,可以启动或者唤醒线程。
- 设置线程的优先级(不太推荐,如果优先级数离得近并不会按顺序执行)
start()和run()方法有什么区别?
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动
string和stringbuffer和stringbuilder的区别
- 因为string是不可变的(通过ide的debugger可以发现其属性大都为final类型),因此每次对其操作改变其变量值,其实是生成一个新的对象,然后将变量引用指向新对象;因此速度慢。
- stringbuffer则不同,对其操作即直接操作对象指向的引用,无需产生新对象,速度很快;他是线程安全的,在维护多线程的同步等也会消耗一点性能。
- stringbuilder是jdk5之后新增的,其用法与stringbuffer完全一致,但他是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。
list.map.set的存储特点?
- list以特定次序来持有元素,可有重复元素
- map保存key-value值,value可多值
- set无法拥有重复元素,内部排序
ArrayList和linkedlist
- ArrayList采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦
- linkedlist采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦要从第一个索引开始
Hashtable和HashMap区别
Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现
了解过的设计模式
- 生产消费者设计模式
- 生产者制造数据
- 生产者把数据放入缓冲区
- 消费者把数据取出缓冲区
- 消费者处理数据
- 外观设计模式
加以自己的了解,进行介绍
堆和栈区别
堆:先进先出
栈:先进后出
堆主要用来存放对象的,栈主要是用来执行程序的
堆:内存用来存放由new创建的对象和数组
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理
抽象类和接口区别
- 抽象类可以有构造方法,接口不可以
- 抽象类可以有普通成员变量,接口不可以
- 抽象类可以包含静态方法,接口不可以
- 抽象类可以包含单继承,接口为多接口
拦截器和过滤器
- 拦截器是基于Java的反射机制(Java反射简单理解为任意调用、任意访问,就是调用的)的,而过滤器是基于函数回调(简单理解就是把Java方法的路径调用)。
- 拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
- 拦截器可以访问控制层上下文、值栈里的对象,而过滤器不能访问
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
转发与重定向的区别
- 转发在服务器端完成的;重定向是在客户端完成的
- 转发的速度快;重定向速度慢
- 转发的是同一次请求;重定向是两次不同请求
- 转发不会执行转发后的代码;重定向会执行重定向之后的代码
- 转发地址栏没有变化;重定向地址栏有变化
- 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
- 还有一个大的区别就是,重定向可以访问自己web应用以外的资源
jsp九大内置对象
- request 请求对象
- response 响应对象
- page 页面对象
- application 应用程序对象
- out 输出对象
- exception 例外对象(异常)
- pagecontext 页面上下文对象
- session 会话对象
- config 配置对象
servlet生命周期
servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由Javax.servlet。Servlet接口的init,service和destroy方法表达。
页面间对象传递的方法
request session application cookie等
Spring的优点和缺点
- 优点:有效组织中间层对象,消除在许多工程中使用的单态模式,非入侵试,不需要过多依赖Spring框架,Spring构建的应用程序易于完成单元测试
- 缺点:频繁的使用配置过多的配置文件
Spring的aop的作用
aop 就是扩展第三方服务。比如:日志、持久性、事务等
Springmvc工作流程
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求后调用HandlerMapping处理器映射器
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一同返回给DispatcherServlet
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 执行处理器(Controller,也叫后端控制器)
- Controller执行完成返回ModelAndView
- HandlerAdapter将Controller执行结果ModelAndView返回DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
- DispatcherServlet响应用户
MyBatis工作流程
- 加载配置文件
- 生成SqlSessionFactory
- 建立SqlSession
- 调用MyBatis提供的API
- 查询Map配置文件
- 返回结果
- 关闭SqlSession
什么是控制反转、依赖注入、以及依赖注入的方式
- 控制反转就是本来你该做的事情,你不去做了,让系统去做。比如,你获取一个对象的时候,往往需要new出实例来,如果用了控制反转,那这件事情就不需要你做了,你只需要在配置文件xml中配置好,系统就帮你new了。
- 控制反转也叫依赖注入,就是把该用到的东西提前注入进去,下次直接用,而不是每次都new
- 依赖注入方式:构造器依赖注入和Setter方法注入
码巢带你对标阿里P6
想获取更多知识,可扫码进入群聊、关注我们的微信公众号
这篇关于Java面试必背的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!