JAVA面试题大全希望能够挑动大家的味蕾!(附赠BAT面试大全)

● Java的跨平台原理是什么?

Java通过不同的系统,不同版本,不同位数的java虚拟机来屏蔽不同的系统指令集差异,而对外提供统一的接口(Java API),对于我们普通的java开发者,只需要按照接口开发即可。如果我们系统需要部署到不同的环境时,只需要在系统上安装对应版本的虚拟机即可。

● Java面向对象的特征是什么?

封装:将一个对象封装成一个高度自治和相对封闭的个体。

抽象:把现实生活中的对象抽象成为类。

继承:把一个已经存在的类所定义的内容作为自己的内容,并且可以加入若干新的内容,或修改原来的方法使之更合适特殊的需要,这就是继承。

多态:利用父类引用指向子类对象。程序调用某个方法在运行期动态绑定。

● ==和equals方法的区别是什么?

==用来判断两个变量之间的值是否相等,变量就可以分为基本数据类型引用类型,如果是基本数据类型的变量直接比较值,而引用数据类型要比较对象的内存首地址。equals方法用来比较两个对象长得是否一样,判断两个对象某些特征是否一样

● String和StringBuilder的区别?StringBuffer和StringBuilder的区别?

String是内容不可变的字符串,String底层使用了一个不可变的字符数组(final char[]),而StringBuffer和StringBuilder是内容可变的字符串,底层使用了一个可变的字符数组。StringBuffer是线程安全的,效率较低。StringBuilder是线程不安全的,效率较高。

● forward和redirect的区别是什么?

(1) forward是服务器端的转向,而redirect是客户端的跳转

(2) 使用forward浏览器地址不会发生改变,而redirect会发生改变。

(3) forward是一次请求中完成,而redirect是重新发起请求

(4) forward是在服务器端完成,而不用客户端重新发起请求,效率高。

● HashMap和HashTable的区别是什么?

(1) HashMap和HashTable都可以使用来存储key-value的数据。

(2) HashMap是可以把null作为key或者value的。而HashTable是不可以的。

(3) HashMap是线程不安全的,效率高。而HashTable是线程安全的,效率较低。

(4) 如何做到线程安全效率又高?

使用ConcurrentHashMap。ConcurrentHashMap通过把Map分为N个Segment,可以提供相同的线程安全,但是效率提高数倍。

● 实现一个文件拷贝功能时,我们使用字节流还是字符流?

我们拷贝的文件时候,不确定文件是只包含字符流,有可能字节流(图片、声音、图像等),为了考虑到通用性,要使用字节流。

● 说说你对Servlet的理解?

Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序,而这些程序都要实现Servlet这个接口。其主要功能在于交互式的浏览和修改数据,生成动态的web内容,并且Servlet运行于支持Java的应用服务器中。

● 有没有使用过线程并发库?

java.util.concurrent包提供了对线程优化、管理的各项操作。该包提供了线程的运行、线程池的创建、线程生命周期的控制。Java通过executors提供4个静态方法创建线程池。

  • newCachedThreadPool创建一个可以缓存线程池,如果线程长度超过处理需要,可以灵活回收空闲线程。若无可回收,则创建线程。
  • newFixedThreadPool创建一个定长线程池。可以控制线程最大并发,超出线程会在队列中等待。
  • newScheduledThreadPool创建一个定长的线程池,支持定时及周期性任务执行。
  • newSingleThreadExecutor创建一个单例化的线程池,它只会唯一的工作线程来执行任务,保证所有任务按照指定的顺序执行。

● 线程池的作用?

(1) 限定线程的个数,不会导致由于线程过多而导致系统运行缓慢或崩溃。

(2) 线程池不需要每次去创建或销毁,响应时间更快以及节约了资源。

● 讲一讲线程的几种创建方式?

(1) 通过继承Thread类实现一个线程。

(2) 通过实现Runnable接口实现一个线程。

注意:继承的扩展性不强,java总只支持单继承,如果一个类继承了Thread就不能继承其他的类了。

● MVC的各个部分都由哪些常见技术来实现?

(1) M(Model):javaBean

(2) V(View):html、jsp、volicity、freemaker

(3) C(Control):Servlet、Action、

最经典的MVC模式:Jsp+Servlet+javaBean,实际上就是model2的实现方式,就是把视图和逻辑隔离开,而Model1的实现方式jsp+service+dao

● 简谈关系型数据库的三范式?

范式就是规范,就是关系型数据库在设计表要遵循的三个规范。要满足第二范式必须先满足第一范式,要满足第三范式必须满足第二范式。另外反三范式是指有的时候为了效率,可以设置重复的字段(如订单表总价与订单项单价)。

第一范式:是指数据库表的每一列都是不可分割的基本数据项,同一个列中不能有多个值。

第二范式:是指数据库表的每一行必须可以被唯一区分,(通常利用到的是主键列)。

第三范式:是要求一个数据表中不包含已在其他表中已包含的非关键字信息(通常利用外键,多个表的数据重复,用外键引入)。

● 事务的四大特征?

事务是并发控制的单位,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的单位。事务的四大特征是:

原子性:表示事务内操作不可分割,要么都成功,要么都失败。

一致性:要么都成功,要么都失败。后面失败了要对前面的操作进行回滚。

隔离性:一个事务开始了,不能受其他事务的干扰。

持久性:表示事务开始了,就不能停止。

● MySQL数据库需要最大连接数,最大默认连接数是什么?

一个数据库服务只能支持一定数目同时连接,这时候需要我们一般都会设置最大连接数。在数据库安装时,都会有一个默认的最大连接数,在my.ini文件的一个max_connection=100

● MySQL和Oracle的分页语句实现思路?

Mysql是使用limit来进行分页的:limit offset, size表示从多少索引到多少位。

Oracle的分页: Oracle的分页有点儿记不住了。只记得大概,是使用了三层嵌套查询,如果在工作中使用了,可以在原来的项目和网上查询。

● 说说存储过程的特点?

(1) 存储过程只在创建时进行编译,以后每次执行存储过程都不需要重新编译,而一般SQL语句每次执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度

(2) 通常,复杂的业务逻辑需要多条SQL语句。这些语句要分别的向客户机发送到服务器,当客户机和服务器之间的操作很多时,将产生大量的网路传输。而存储过程可以把这些SQL封装起来,通过调用存储过程来减少网络传输

(3) 存储过程创建一次便可以反复的使用,从而可以减少数据库开发人员的工作量

(4) 安全性高,存储过程可以屏蔽对底层数据库对象的直接访问,使用EXECUTE权限调用存储过程,无需拥有访问地产数据库对象的显示权限。

(5) MySql是在5.0后实现对存储过程的支持。

● jdbc如何调用存储过程的?

Connection类prepareCall方法调用存储过程,再通过方法获得的返回值对象的调用registerOutParameter方法设置参数

● 简单说一下你对jdbc的理解?

JDBC (Java database connection):java数据库连接,数据库管理系统是很多的,每一个数据库管理系统支持的命令是不一样的。Java只定义接口,而数据库厂商自己实现接口,对于我们开发者而言,只需要导入对应厂商开发的实现即可,然后以接口方式进行调用即可。

● jdbc中preparedStatement与Statement比较有什么优点

(1) PreparedStatement是预编译的,比Statement速度快。

(2) 代码的可读性可维护性PreparedStatement更好。

(3) 安全性,PreparedStatement可以直接防止SQl注入攻击。而Statement不能。

● 数据库连接池的作用?

(1) 限定数据库连接的个数,不会导致由于数据库连接过多而系统运行缓慢或崩溃。

(2) 数据库连接池不需要每次去创建或销毁,响应时间更快以及节约了资源。

● 简单介绍一下MVC模式?

MVC全名是Model View Controller,是模型(model) -- 视图(view) -- 控制器(controller)的缩写。一种软件设计典范,用一种业务逻辑数据界面显示分离的方法组织代码,将业务逻辑聚焦到一个部件里面。在改进和个性化定制界面以及用户交互的同时,不需要重新编写业务逻辑。

最简单、最经典的就是JSP(view)+ Servlet(Controller)+ JavaBean(model)

(1) 控制器接收来自用户请求。

(2) 控制器调用JavaBean来完成业务。

(3) 完成业务后通过控制器跳转JSP页面的方式给用户反馈信息。

(4) JSP为用户做出最终的响应。

● 简单说一下对MVC框架的理解?

是为了解决传统MVC模式一些问题问题而出现的框架,传统的mvc模式存在一下问题:

(1) 所有的Servlet和Servlet映射都要配置在web.xml中,如果项目太大。web.xml太庞大了,并且不能实现模块化管理

(2) Servlet的主要功能就是接收参数、调用逻辑、跳转页面,比如像其他字符编码文件上传等功能也要写在Servlet中,需要做特定的处理。

(3) 接收参数麻烦,不能通过model接收。只能单个的接收。接收完成后需要手动设置进model中。

(4) 跳转页面的方式比较单一(forword,redirect),并且当页面发生修改时需要修改Servlet源代码。

● Struts2的执行流程或者Struts2的原理?

(1) 客户端向服务端发起一个请求,这个请求经过一系列的过滤器(Filter),到达核心Filter。接着FilterDispatcher(StrutsPrepareAndExecuteFilter)被调用,询问ActionMapper来决定着请求是否需要调用某一个Action,如果不需要则走原来的流程。

(2)如果ActionMapper决定需要调用某个Action时,FilterDispatcher(StrutsPrepareAndExecuteFilter)把这个请求交给ActionProxy;

(3) ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需要调用的Action类。

(4) ActionProxy创建一个ActionInvocation实例。

(5) ActionInvocation实例使用命名模式来调用,在调用Action的过程中前后,涉及到相关的拦截器(Intercepter)的调用。

(6) 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置文件找到对应的返回结果。返回结果通常是一个需要被表示的JSP或者FreeMarker的模板。

● Struts2的拦截器是什么?你都用它干什么?

在struts2中的功能(参数处理文件上传字符编码等)都是通过用拦截器完成的。

我们也可以自定义拦截器,进行可插拔配置,在执行Action的方法前后执行相关逻辑完成业务。如:

(1) 用户登录判断,在执行Action的前面判断是否已经登录,如果没有登录的跳转到登录页面。

(2) 用户权限判断,在执行Action的前面判断是否具有权限,如果没有权限就给出提示信息。

操作日志

● 说说Spring MVC的执行流程?

(1) 用户向服务器发送请求,请求被Spring前端控制器Servlet(DispatcherServlet)捕获。

(2) DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器)。最后以HandlerExecutionChain对象的形式返回。

(3) DispatcherServlet选择一个合适的HandlerAdapter。提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller),Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象。

(4) DispatcherServlet根据返回的ModelAndView,选择一个合适的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)。

(5) 通过ViewResolver结合ModelView渲染视图。DispatcherServlet将渲染结构返回给客户端。

● 说说Spring MVC与Struts2的不同?

(1) 核心控制器不同:spring mvc核心控制器是Servlet,而struts2是Filter。

(2) 控制器实例:理论上,spring mvc会比struts2快一些,spring mvc是基于方法设计,而struts2是基于对象,每次发一次请求都会实例化一个action。每一个action都会被注入属性,而Spring mvc更像Servlet一样,只有一个实例,每次请求执行对应的方法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产生线程安全问题)

(3) 管理方式:Spring MVC是Spring的一个模块,所以Spring对Spring MVC的控制器管理更加方便。

(4) 参数传递:Struts2中自身提供多种参数接收,其实都是通过ValueStack进行传递和赋值,而Spring MVC是通过方法的参数进行接收。

(5) 学习难度:Struts2学习成本比较高,比如拦截器、值栈及OGNL表达式,而Spring MVC相对简单。

(6) Intercepter的实例机制:struts有以自己的Intercepter机制,Spring MVC用到是对立的AOP方式。

(7) Spring MVC处理Ajax请求,直接通过返回数据,方法中使用注解@ResponseBody,Spring MVC自动帮我们把对象转成为JSON数据,而Struts2是通过插件的方式进行处理的。

● Spring的两大核心?

Spring是J2EE应用程序框架,是轻量级的IOC和AOP的容器框架(相对于重量级的EJB),主要是针对javaBean的生命周期进行管理的轻量级容器。

(1) IOC(Inversion of Control)或 DI(Dependency Injection):原来我们的Service需要调用DAO,Service就需要创建DAO,Spring发现你的Service需要依赖DAO,就给你注入。核心原理:就是配置文件 + 反射(工厂也可以)+ 容器(map)。

(2) AOP面向切面的编程:我们主要使用AOP来做事务、权限判断、日志等功能,核心原理:使用动态代理的方式,在执行方法前后或出现异常后加入相关逻辑。

● 说说Spring事务的传播特性?

传播特性:多个事务存在是怎么处理的策略

(1) PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。如果没有事务则开启。

(2) PROPAGATION_SUPPORTS:如果存在一个事务,则支持当前事务。如果没有则非事务运行。

(3) PROPAGATION_MANDATORY:如果存在一个事务,则支持当前事务。如果没有则抛异常。

(4) PROPAGATION_REQUIRED_NEW:总是开启一个事务,如果一个事务已经存在,则将这个存在的事务挂起。

(5) REQUIRED_NOT_SUPPORTS:总是非事务的执行,并挂起任何存在的事务。

(6) PROPAGATION_NEVER:总是非事务的执行,如果存在一个事务,则抛出异常。

(7) PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动的事务,则按TransactionDefinition.PROPAGATION_REQUIRED属性执行。

● Mybatis和Hibernate有什么不同?

相同点:都是java的orm框架,屏蔽jdbc api的底层访问细节。

不同点:

(1) hibernate要比Mybatis功能强大很多,因为hibernate自动生成sql语句。

(2) Mybatis要比hibernate简单多,Mybatis是面向sql的。不用考虑对象间一些复杂的映射关系。

(3) 由于Mybatis需要我们在xml配置文件中写sql,hibernate我们无法直接控制语句。我们就无法去写特定的高效sql或复杂sql语句。

Mybatis好处:屏蔽jdbc api的底层访问细节。将sql语句与java代码进行分离;提供了将结果集自动封装为实体对象和对象的集合的功能。

Hibernate好处:hibernate是一个全自动的orm映射工具,他可以自动生成sql语句并执行返回java结果。

● Hibernate对象几状态?

瞬时状态:刚刚new出来,没有被持久化,没有id。(不处于session中,该对象就是临时对象)。

持久化状态/托管状态:已经被持久化,加入到session的缓存中,该状态的对象为持久化 对象。

游离状态:已经被持久化,但没有处于session中,该状态的对象为游离对象。

删除状态:对象有关联的ID,并且在session管理下,但是已经被计划删除。

● 简单介绍Hibernate的缓存?

hibernate一级缓存又称为“Session缓存”。

Session缓存内置不能卸载,Session的缓存是事务范围的缓存,即Session对象的生命周期通常对应一个数据库事务或者一个应用事务。

hibernate二级缓存又称为“SessionFactory缓存”。

由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能存在并发问题,因此需要采用适当的并发访问策略,该策略为被缓存数据提供了事务隔离级别。

第二级缓存是可选的,是一个可配置的插件,默认SessionFactory不会启用这个插件,需要手动开启。

Hibernate提供org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。

什么数据需要存放在第二级缓存中?

1) 很少被修改的数据

2) 经常被查询的数据

3) 不是很重要的数据,允许出现偶尔并发的数据,不会被并发访问的数据。

4) 常量数据。

Hibernate的二级缓存默认是不支持分布式缓存,使用memcaheredis等中央缓存来代替二级缓存。

● WebService的使用场景?

webservice是一个SOA的架构,它不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间交互。

(1) 异构系统的整合

(2) 不同客户端的整合

● 如何操作Linux?

使用xshell来连接服务器,使用xftp来实习文件上传下载。连接和上传、下载必须依赖于服务器的sshsftp服务

● 如何选择适当的数据数引擎?

在开发中,我们经常使用的存储引擎MyISAM/innodb/memory。

MyISAM存储引擎:没有事务要求,同时是以查询和添加为主,我们考虑MyISAM 存储引擎,比如bbs中的发帖表,回复表。

Innodb存储引擎:对事务要求高,保存的数据都是重要数据,我们建议使用innodb,比如订单表,账号表。

Memory存储引擎:我们数据变化频繁,不需要入库,同时有频繁的查询和修改,我们考虑使用memory,速度极快。

● MyISAM与Innodb有什么区别?、

(1) 事务安全MyISAM不支持事务,而Innodb支持。

(2) 查询和添加速度MyISAM更快。

(3) 支持全文检索。MyISAM支持,Innodb不支持。

(4) MyISAM只支持表锁,而Innodb还支持行锁(事务)。

(5) MyISAM不支持外键,而Innodb支持

● 说一下使用索引的一些技巧?

(1) 对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引。

(2) 对于使用like的查询,查询如果是’%xx’不会使用到索引。而’xx%’会使用到索引。

(3) 如果条件中有or,必须所有字段都必须单独使用时能使用索引,从可以走索引。

(4) 如果列类型是字符串,那一定要在条件中间数据使用引号引用起来,否则不会走索引。

(5) 如果mysql估计使用全表扫描要比索引快,则不使用索引(如表中只有一条数据)。

● 介绍下主从同步和读写分离?

一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了要求就可以集群处理,MySQL的集群处理技术最常用的就是读写分离

主从同步:数据库最终会把数据持久化到磁盘,如果集群必须确保每个数据库服务器的数据是一致的。能改变数据库数据的操作都往主数据库去写,而其他的数据库从主数据库上同步数据。

读写分离:使用负载均衡来实现写的操作都往主数据去,而读的操作都往从的服务器去。

● 有没有使用过redis?

Redis是一个key-value的数据库。先存到内存中,会根据一定的策略持久化到磁盘,即使断电也不会丢失数据,支持的数据类型比较多。主要用了做缓存数据库和web集群中用来做中央缓存存放session

● redis有哪些使用场景?

缓存:把经常需要查询且很少修改的数据,放到读速度较快的空间(内存),以便下次访问 减少时间,减轻压力,减少访问时间。

计数器:redis中的计算器时原子性的内存操作,可以解决库存溢出问题,进销存系统库存溢出。

session缓存服务器:web集群式作为session缓存服务器。

● redis存储对象的方式?

Json字符串:需要把对象转化为json字符串,当作字符串处理,直接使用set、get来设置或者获取。优点是设置和获取比较简单。缺点没有提供专门的方法,需要把对象转换为json,可能存在性能问题。

字节:需要做做序列化,就是把对象序列化为字节保存。如果是存储百万级的大数据对象,建议采用存储序列化对象的方式。

如果是少量的数据级对象,建议使用json转换成String方式。

● 说说redis数据淘汰机制?

在redis中,允许用户设置最大使用内存大小server.maxmemory。在内存限定的情况是很有用的。譬如,在一台8g机子上部署4个redis服务点,每个服务点分配1.5G的内存大小,减少内存紧张的情况,由此获取更为稳健的服务。

Redis内存数据集大小上升到一定的时候,就会施行数据淘汰机制,redis提供6中数据淘汰机制

(1) volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。

(2) volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选要过期的数据淘汰。

(3) volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。

(4) allkeys-lru:从数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。

(5) allkeys-random:从数据集(server.db[i].expires)中任意选择数据淘汰。

(6) no-enviction:禁止驱逐数据。

Redis驱逐某个键值对后,会删除这个数据并,并将这个数据变更消息发布到本地(AOF持久化)和从机(主从连接)。

● MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义?

(1)varchar与char的区别

char是一种固定长度的类型,varchar则是一种可变长度的类型

(2)varchar(50)中50的涵义

最多存放50个字符,varchar(50)和(100)存储hello字符串所占用的空间一样,但后者在排序时会消耗更多内存。

(3)mysql为什么这么设计对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样;

● ArrayList扩容机制?

发生扩容的条件:

ArrayList其实底层就是一个数组的数据结构,根据传入的最小需要容量minCapacity属性来和数组的容量长度对比,若minCapactity大于或等于数组容量,则需要进行扩容。(如果实际存储数组是空数组,则最小需要容量就是默认容量)

实现扩容:

jdk7中采用>>位运算,右移动一位。容量相当于扩大了1.5倍;

举例说明:添加20个元素到ArrayList中

当第一次插入元素时才分配10(默认)个对象空间。之后扩容会按照1.5倍增长。

也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;但是此时扩容的是数组的大小,扩容完之后,ArrayList会调用一个copy方法对原有的数组进行复制,会删除原有的数组。当添加第16个数据时,继续扩容变为15 * 1.5 =22个,同样的道理会把原有的数组进行复制再删除,直到20个元素全部添加完。

● Maven的生命周期?

maven有三套生命周期,分别为:

1、clean 周期:主要用于清理上一次构建产生的文件,可以理解为删除target目录下的文件

2、默认周期

主要阶段包含:

process-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中,

compile 编译src/main/java下的java文件,产生对应的class

process-test-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中,

test-compile 编译src/test/java下的java文件,产生对应的class

test 运行测试用例,

package 打包构件,即生成对应的jar, war等,

install将构件部署到本地仓库,或者说部署到maven所依赖的repository

deploy 部署构件到远程仓库

3、site周期

主要阶段包含

site 产生项目的站点文档

site-deploy 将项目的站点文档部署到服务器

● Oracle的基本数据类型

Oracle的基本数据类型(常用):

1、字符型

char 固定长度字符串 占2000个字节

varchar2 可变长度字符串 占4000个字节

nvarchar2 占2000个字符(最多能存2000个字母/中文)

2、大对象型(lob)

Blob :二进制数据 最大长度4G

Blob 用于存一些图片,视频,文件。

Clob :字符数据 最大长度4G,可以存大字符串 varchar2和nvarchar2都具有一定的局限性,它们长度有限,但数据库中无论用varchar2或nvarchar2类型,还是用clob,在java端都使用String接收。

3、数值型

Integer 整数类型,小的整数。

Float 浮点数类型。

Real 实数类型。

Number(p,s)包含小数位的数值类型。P表示精度,s表示小数后的位数。

Eg: number(10,2) 表示小数点之前可有8位数字,小数点后有2位。

4、日期类型

Date 日期(日-月-年) DD-MM-YY(HH-MI-SS)

Timestamp 跟date比 它可以精确到微秒。精确范围0~9 默认为6.

● sleep()和wait()方法有什么区别?

1、sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

2、sleep()和yield()有什么区别?

1)sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;

2)线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;

3)sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;

4)sleep()方法比yield()方法(跟操作系统相关)具有更好的可移植性。

● 说一下强引用、软引用、弱引用、虚引用以及他们之间和gc的关系?

强引用:new出的对象之类的引用,

只要强引用还在,永远不会回收

软引用:引用但非必须的对象,内存溢出异常之前,回收

弱引用:非必须的对象,对象能生存到下一次垃圾收集发生之前。

虚引用:对生存时间无影响,在垃圾回收时得到通知。

最后给大家分享一波一线大厂(BATJ)JAVA高岗高频面试题,希望大家能够喜欢。

获取方式:转发关注小编,私信“学习”来得到获取方式!感谢大家支持与配合!

发布了29 篇原创文章 · 获赞 17 · 访问量 6622

猜你喜欢

转载自blog.csdn.net/qq_1813353297/article/details/104663164