欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java开发工程师面试题

程序员文章站 2022-05-02 12:26:48
...

java是单根继承体系,不能实现多继承,但是可以通过接口模拟多继承

被final修饰的类,成员方法,成员变量分别是什么效果?
答:被final修饰的类不能被继承;
被final修饰的方法可以继承,但不能重写;
被final修饰的变量就是一个常量,只能被赋值一次。

Java的四种修饰符的访问权限范围:public>protected>default>private

重载和重写的区别?

override(重写)

1.方法名,参数,返回值相同;

2.子类方法不能缩小父类方法的访问权限;

3.子类方法不能抛出比父类更多的异常(但子类方法可以不抛出异常);

4.存在于子类和父类之间;

5.方法被定义为final,就不能重写.

overload(重载)

1.参数类型,个数,顺序至少有一个不同;

2.不能重载只有返回值不同的方法名;

3.存在于父类和子类,同类中.

Java有什么优点?

1.Java是纯面向对象编程的语言;

2.平台无关性(一次编程,到处运行);

3.Java提供了许多内置的类库,通过这些类库,简化了开发人员的设计工作,同时缩短了项目开发时间;

4.提供了对Web应用开发的支持;

5.去除了c++中难以理解,容易混淆的特性;

6.具有较好的安全性和健壮性。java语言经常会被用在网络环境中,为了增强程序的安全性
java语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和Bytecode检测等)【敲黑板,This is重点】

java的强类型机制,垃圾回收器,异常处理,安全检查机制使得java语言编写的程序有更好的健壮性和鲁棒性。

jvm垃圾回收机制.

1.java的一个重大特点就是引进了垃圾回收机制,它使得java程序员在编写程序的时候不用考虑内存管理。

2.由于有了垃圾回收机制,java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。

3.垃圾回收机制有效的防止内存泄露,有效的使用可以使用的内存。

GC(Gabage Collection)工作原理:当创建对象时,GC就开始监视这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理heap(堆)中的素有对象。通过这种方式确定哪些对象时“可达的”,哪些是“不可达的”。

垃圾回收机制通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时`间没有使用的对象进行清理,我们虽然可以调用System.gc()让垃圾回收器运行,但依旧无法保证GC一定会执行。

json是什么?json解析

JavaScript Object Notation.是一种轻量级的数据交换格式;JSON是一种传递对象的语法,对象可以是name/value对,数组和其他对象.

json的格式

 

{} 双括号表示对象

[] 中括号表示数组

"" 双引号内是属性或值

: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

 

json解析:

 

 

第一种方法:原生解析

首先要分析json的格式,这里首先是一个json对象(即JsonObject),里面还嵌套有一个json数组(即JsonArray),jsonarray里面又是一个json对象。分析清楚那就可以进行解析了,当然最好的话,还是要建立一个json所对应的实体类bean,这里我就不写了,下面会在提到的。 
这里的result就是网络请求返回来的json字符串。 

第二种解析方式:Gson解析 
Gson解析需要下载gson.jar包,自己去百度下载吧或者下载我的demo里面就有。 
这里解析就需要给json生成实体类,初学的话建议手写,熟悉的话可以使用Android Studio里面插件GsonFormat来自动生成,这里实体类我就不贴出来了,去我的demo里面看吧。 
解析就是一句话的事: 
MenuBean menuBean = new Gson().fromJson(result, MenuBean.class); 
Log.e(“MenuBean—–>”, menuBean.getRet()+”“); 

第三种:

JSON解析之FastJSON(不常用,用法跟gosn差不多.....)

什么是同步请求和异步请求?

同步请求:是发送方发送数据之后,必须等接收方接收数据必须做出回应之后,才可以进行下一步;

异步请求:发送方发送数据之后不需等接收方做出回应,可以进行下一步操作.

举个形象的例子:同步就像A叫B去吃饭,A发出邀请,要B一起吃饭,此时必须等B做出回应,吃或者不吃,A才决定是一个人吃还是等B一起去;而异步请求的话就像是下班了,A跟B说A要去吃饭了,然后走了,不管B是否做出任何回应.

AJAX是做什么用的?

它是一种支持异步请求的技术.简单来说,就是通过XMLHttpRequest对象向服务器发送异步请求,从服务器获取数据之后,再通过JS来操作DOM节点.

ajax的优点:1.无需刷新更新数据,减少用户等待时间,更好的用户体验;

2.异步与服务器通信,无需打断用户,响应更加迅速;

3.可以把服务器的一些负担转到客户端;.

AJAX里面的参数意思:

url:要求为String类型的参数,(默认为当前页地址)发送请求的地址;

type:要求为String类型的参数,请求方式(post或get)默认为get.

timeout:要求为Number类型的参数,设置请求超时的时间(单位是毫秒);(可以不写)

data:要求为Object或String类型的参数,发送到服务器的数据;(可以不写)

dataType:要求为String类型的参数,预期服务器返回的数据类型;(可以不写)

success:要求为Function类型的参数,请求成功后调用的回调函数.

线程的四种实现方式:

Java多线程实现方式主要有四种:

1.继承Thread类;

2.实现Runnable接口;

3.实现Callable接口通过FutureTask包装器来创建Thread线程;

4.使用ExecutorService,Callable,Future实现有返回结果的多线程.

多线程是什么:

 

线程

1、线程是轻量级的进程

2、线程没有独立的地址空间(内存空间)

3、线程是由进程创建的(寄生在进程)

4、一个进程可以拥有多个线程-->这就是我们常说的多线程编程

5、线程有几种状态:

  a、新建状态(new)

  b、就绪状态(Runnable)

  c、运行状态(Running)

  d、阻塞状态(Blocked)

  e、死亡状态(Dead)

线程与进程的区别:进程就是一个应用程序在处理机上的一次执行过程(执行中的程序),它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

synchronized块的写法:
synchronized(object或this)

{

...................代码

 

}
表示线程在执行的时候会对object对象上锁。

synchronized方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该synchronized方法;synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内。synchronized块外的代码是可以被多个线程同时访问到的。

 

自我介绍:

我叫xxx,今年xx岁,毕业于xxxx学校,在校所学的专业是xxx专业.我本人性格开朗乐观积极向上,上课认真听讲,课下自己也会扩展知识.平时喜欢跟同学们一起交流学习方面的问题.也会主动帮助同学解决问题,自己遇到问题无法解决也会虚心去请教别人.

五年来对你职业生涯的一个规划:

 

我想成为这个领域的专业化人士,但我明白这是一个长期努力的过程,现在我的初步打算是:第一阶段,我希望从现在开始,1-2年之内能够在我目前申请的这个职位上沉淀下来,积累最起码的工作经验,把基础打牢;第二阶段,我希望利用3-5年的时间,成为一个在自己的专业方面能够独当一面的人,能够独自承担责任,发现问题,解决问题,不让上司操心;第三阶段,成为该领域的一名专业化人士,在工作中能有创新与发展,能为公司带来更大的价值。

自身最大的缺点和优点:

我本人最大的缺点是性格比较急,不喜欢拖拉.最大的优点是有耐心.

对薪资的要求,期望薪资,对加班,对出差的看法:

对薪资的要求:毕竟我也处于实习期,没有毕业证,薪资方面没有太大要求,能养活自己 ,能够自给自足就好.

期望薪资:差不多3000左右.

对加班的看法:能在工作时间做好的任务,我会尽量做完,如果做不完需要加班的话,可以加班.

对出差的看法:不要太频繁的出差,出差的时间不要过于长时间.

用过哪些数据库,区别是什么:

Oracle和MySQL数据库.

Oracle是大型数据库而Mysql是中小型数据库.

 

①主键 Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将***的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。

②单引号的处理 MYSQL里可以用双引号包起字符串,ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。

③翻页的SQL语句的处理 MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位置, 记录个数;ORACLE处理翻页的SQL语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置, 并且只能用ROWNUM<100, 不能用ROWNUM>80

④ 长字符串的处理 长字符串的处理ORACLE也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型,方法借用ORACLE里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。 ⑤空字符的处理 MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。

⑥字符串的模糊比较 MYSQL里用 字段名 like '%字符串%',ORACLE里也可以用 字段名 like '%字符串%' 但这种方法不能使用索引, 速度不快。

 

⑦Oracle实现了ANSII SQL中大部分功能,如,事务的隔离级别、传播特性等而Mysql在这方面还是比较的若

MVC的设计模式:

全称Model(模型)-View(视图)-Controller(控制器),这是一种开发模式,他的好处是可以将界面和业务逻辑分离。

 

Model(模型),是程序的主体部分,主要包含业务数据和业务逻辑。在模型层,还会涉及到用户发布的服务,在服务中会根据不同的业务需求,更新业务模型中的数据。

     View(视图),是程序呈现给用户的部分,是用户和程序交互的接口,用户会根据具体的业务需求,在View视图层输入自己特定的业务数据,并通过界面的事件交互,将对应的输入参数提交给后台控制器进行处理。

     Controller(控制器)Controller是用来处理用户输入数据,已经更新业务模型的部分。控制器中接收了用户与界面交互时传递过来的数据,并根据数据业务逻辑来执行服务的调用和更新业务模型的数据和状态。

   

MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。实现人机数据之间的交互.

目前,像Spring、hibernate等主流框架,都是遵照着MVC设计模式而设计的。

hibernate:是底层基于jdbcorm(对象关系映射)持久化框架,即:表与类的映射,字段与属性的映射,记录与对象的映射数据库模型也就是Model;

 struts :提供的丰富标签是用于显示层View;同时struts也充当了实现Control的功能(不管是Struts1,还是Struts2),接收参数,视图分发。

 Spring:是用于降低层与层间耦合度的,就是所有的类都可以由spring统一创建,用时只需注入即可(IOC)

 

另外:SpringMVC就是在MVC的技术上实现自己的功能的。

总结:程序设计使用MVC等设计模式,最终目的就是达到天人合一的高内聚,低耦合,甚至零耦合!

 

SpringMVC的注解:

 

 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。

 

使用 @Controller 定义一个 Controller 控制器

使用 @RequestMapping 来映射 Request 请求与处理器

使用 @RequestParam 绑定 HttpServletRequest 请求参数到控制器方法参数

使用 @CookieValue 绑定 cookie 的值到 Controller 方法参数

使用 @RequestHeader 注解绑定 HttpServletRequest 头信息到Controller 方法参数

使用 @ModelAttribute 和 @SessionAttributes 传递和保存数据

Java中如何实现序列化:

把对象转换为字节序列的过程称为对象的序列化。   把字节序列恢复为对象的过程称为对象的反序列化

 

 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
  序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
  序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,

session和cookie的区别,生命周期有什么不同:

 

二者之间的区别

 

cookie和session的比较

一、对于cookie:

①cookie是创建于服务器端

②cookie保存在浏览器端

③cookie的生命周期可以通过cookie.setMaxAge(2000);来设置,如果没有设置setMaxAge,

则cookie的生命周期当浏览器关闭的时候,就消亡了

④cookie可以被多个同类型的浏览器共享  可以把cookie想象成一张表

 

比较:

①存在的位置:

cookie 存在于客户端,临时文件夹中

session:存在于服务器的内存中,一个session域对象为一个用户浏览器服务

②安全性

cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放

session存放于服务器的内存中,所以安全性好

③网络传输量

cookie会传递消息给服务器

session本身存放于服务器,不会有传送流量

④生命周期(以20分钟为例)

(1)cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束,

(2)session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁

但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期

(3)关机会造成session生命周期的结束,但是对cookie没有影响

⑤访问范围

session为一个用户浏览器独享

cookie为多个用户浏览器共享

 

使session失效的方法:

1.关闭tomcat

2.reload web应用

3.session时间到

4invalidate  session

JSP的9大内置对象:

 

1、request对象:request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。

2、response对象:response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。

3、session对象:session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。

4、application对象: application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。

5、out 对象:out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。

6、pageContext 对象:pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。

7、config 对象:config 对象的主要作用是取得服务器的配置信息。

8、page 对象:

9、exception 对象:exception 对象的作用是显示异常信息.

Mybatis和Hibernate的区别:

 

Hibernate与Mybatis对比总结

两者相同点

  • Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
  • Hibernate和MyBatis都支持JDBC和JTA事务处理。

Mybatis优势

  • MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
  • MyBatis容易掌握,而Hibernate门槛较高。

Hibernate优势

  • Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
  • Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
  • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
  • Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

Svn和GitHub使用的时候遇到的问题:

1.如果你正在提交的文件在svn服务器上已经被别人改过,就会发生提交冲突。

2.你和其他人同时修改文件之后,提交时会出现问题(你或别人只有其中一个人改了文件)

解决方案:在使用版本控制工具之前需要更新一下版本控制工具.

B/S和C/S架构的区别:(现在所有的项目都是B/S架构)

硬件环境:C/S用户固定,并且处于相同区域,要求拥有相同的操作系统。
                 B/S要有操作系统和浏览器就行。与操作系统平台无关。

软件安装:C/S每一个客户端都必须安装和配置软件,客户端不必安装,使用浏览器访问,易推广。
               B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。

数据库中图片存储的是什么,图片路径的指向?

数据库字段中保存的是图片的路径。图片路径的指向:项目的发布目录 (自己在项目里创建的upload文件夹)

 

如果用户和后台管理员想通过一个登录页面登陆怎么办?

第一步肯定是数据库表里加个权限字段(用来区分用户和管理员);

第二步业务逻辑里验证用户身份时顺便验证一下权限字段.

Java如何实现前后台的数据交互:

使用ajax

*********************************************************************************************************************

1,webservice是什么?

webservice是一种跨编程语言和跨操作系统的远程调用技术,遵循SOPA/WSDL规范。

2,springCloud是什么?

springcloud是一个微服务框架,并提供全套分布式系统解决方案。支持配置管理,熔断机制,leader选举,服务治理,分布式session,微代理,控制总线,智能路由,一次性token。

 

Java中堆和栈有什么不同?

每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可见的。而堆是所有线程共享的一片公用内存区域。对象都在堆里创建,为了提升效率线程会从堆中弄一个缓存到自己的栈,如果多个线程使用该变量就可能引发问题,这时volatile 变量就可以发挥作用了,它要求线程从主存中读取变量的值。

 

 

 

堆:(对象)

引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量),需要通过new等方式来创建。

堆内存主要作用是存放运行时创建(new)的对象。

(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确定)


 

栈:(基本数据类型变量、对象的引用变量)

基本数据类型的变量(int、short、long、byte、float、double、boolean、char等)以及对象的引用变量,其内存分配在栈上,变量出了作用域就会自动释放。

 

 

 

Spring的Scope有以下几种,通过@Scope注解来实现:

  (1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。

  (2)Prototype:每次调用新建一个Bean实例。

  (3)Request:Web项目中,给每一个 http request 新建一个Bean实例。

  (4)Session:Web项目中,给每一个 http session 新建一个Bean实例。

  (5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。

 

 

 

Spring事务传播行为

      所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

 

 

Spring的声明式事务管理力度是什么级别?

Struts2是类级别的,Spring是方法级别的

 

spring事务可以分为编程式事务和声明式事务

 

 

spring MVC与struts2的区别:

    参考:  http://blog.csdn.net/chenleixing/article/details/44570681

   1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截

   2、SpringMVC的方法之间基本上独立的,独享request response数据

  3、由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个

Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的

   4、拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式

   5、SpringMVC的入口是servlet,而Struts2是filter

  6、SpringMVC集成了Ajax

  7、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱

  8、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高

   9、Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展

  10、SpringMVC开发效率和性能高于Struts2

  11、SpringMVC可以认为已经100%零配置

 

Spring框架中的核心思想包括什么?

主要思想是IOC控制反转,DI依赖注入,AOP面向切面

 

 

ArrayList和LinkedList的大致区别如下:

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 

3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

ArrayList,Vector主要区别为以下几点: 
(1):Vector是线程安全的,源码中有很多的synchronized可以看出,而ArrayList不是。导致Vector效率无法和ArrayList相比; 

(2):ArrayList和Vector都采用线性连续存储空间,当存储空间不足的时候,ArrayList默认增加为原来的50%,Vector默认增加为原来的一倍; 

 

 

 

HashSet与HashMap的区别:

HashMap HashSet
实现了Map接口 实现Set接口
存储键值对 仅存储对象
调用put()向map中添加元素 调用add()方法向Set中添加元素
HashMap使用键(Key)计算Hashcode

HashSet使用成员对象来计算hashcode值,

对于两个对象来说hashcode可能相同,

所以equals()方法用来判断对象的相等性,

如果两个对象不同的话,那么返回false

HashMap相对于HashSet较快,因为它是使用唯一的键获取对象 HashSet较HashMap来说比较慢
 

 

 

HashMap和Hashtable的区别:

 

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。

  1. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
  2. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
  3. 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
  4. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
  5. HashMap不能保证随着时间的推移Map中的元素次序是不变的。

 

线程安全是什么?线程不安全是什么?

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。(Vector,HashTable) 
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。(ArrayList,LinkedList,HashMap等)

 

 

 

线程和进程的区别?

       进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同;

 

       (1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元

          (2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。

          (3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束

          (4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的

          (5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源

          (6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志

 

 

 

黑盒测试、灰盒测试、白盒测试、单元测试有什么区别?

 

黑盒测试关注程序的功能是否正确,面向实际用户;

白盒测试关注程序源代码的内部逻辑结构是否正确,面向编程人员;

灰盒测试是介于白盒测试与黑盒测试之间的一种测试。

单元测试(Unit Testing)是对软件基本组成单元进行的测试,如函数或是一个类的方法。这里的单元,就是软件设计的最小单位。

 

怎么对数据库百万级数据进行优化?

使用读写分离技术(

让主数据库(master)处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库(slave)处理SELECT查询操作

 

 

Spring Bean的生命周期

  • Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例
  • Setter注入,执行Bean的属性依赖注入
  • BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法
  • BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法
  • BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法
  • InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法
  • Bean定义文件中定义init-method
  • BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法
  • DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法
  • Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法

   

简单回答springbean生命周期:

 

(1)实例化(必须的)构造函数构造对象

(2)装配(可选的)为属性赋值

(3)回调(可选的)(容器-控制类和组件-回调类)

(4)初始化(init-method=" ")

(5)就绪

(6)销毁(destroy-method=" ")
springmvc生命周期:

1A)客户端发出http请求,只要请求形式符合web.xml
文件中配置的*.action的话,就由DispatcherServlet
来处理。

1B)DispatcherServlet再将http请求委托给映射器
的对象来将http请求交给对应的Action来处理

2)映射器根据客户的http请求,再对比<bean name="/hello.action
如果匹配正确,再将http请求交给程序员写的Action

3)执行Action中的业务方法,最终返回一个名叫ModelAndView
的对象,其中封装了向视图发送的数据和视图的逻辑名

4)ModelAndView对象随着响应到到DispatcherServlet中了


5)这时DispatcherServlet收到了ModelAndView对象,
它也不知道视图逻辑名是何意,又得委托一个名叫
视图解析器的对象去具体解析ModelAndView对象
中的内容

6)将视图解析器解析后的内容,再次交由DispatcherServlet
核心控制器,这时核心控制器再将请求转发到具体的
视图页面,取出数据,再显示给用户

 

servlet生命周期?

 

  • Servlet 通过调用 init () 方法进行初始化。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 通过调用 destroy() 方法终止(结束)。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的

 

 

ajax怎么解决跨域?

    参考:http://blog.csdn.net/u014727260/article/details/72793459

    1,代理(通过后台操作)

    2,JSONP(添加响应头,允许跨域 )

 

              addHeader(‘Access-Control-Allow-Origin:*’);//允许所有来源访问 

               addHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式

    3,在ajax的dataType方式改为“jsonp”

 

Mysql数据类型:

    1.普通索引
    2.唯一索引
    3.主键索引
    4.组合索引

    5.全文索引

    参考:https://www.cnblogs.com/luyucheng/p/6289714.html

Eureka和zookeeper的区别?

1,做分布式下的服务发现还是使用eureka更好,也就是AP特性的分布式协调工具(zookeeper因为网络故障就无法返回可用的主机)

2,zookeeper技术更加成熟,资料更多

3,Eureka。是spring cloud之下一个专门负责微服务服务注册和发现的组件,Eureka就是为了服务发现而设计的

4,Zookeeper。是用来保证分布式一致性的一个软件。不是为了服务发现注册而设计的,只不过它的特性也可以被二次开发成服务发现注册中心罢了

 

SpringCloud都有哪些组件?

      Spring Cloud为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性token,全局一致性锁,leader选举,分布式session,集群状态管理等操作提供了一种简单的开发方式。

    组件列:

  • Spring Cloud Config:配置管理工具,支持使用Git存储配置内容,支持应用配置的外部化存储,支持客户端配置信息刷新、加解密配置内容等
  • Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。
  • Spring Cloud Netflix:针对多种Netflix组件提供的开发工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
  •                       Netflix Eureka:一个基于rest服务的服务治理组件,包括服务注册中心、服务注册与服务发现机制的实现,实现了云端负载均衡和中间层服务器的故障转移。
  •                       Netflix Hystrix:容错管理工具,实现断路器模式,通过控制服务的节点,从而对延迟和故障提供更强大的容错能力。
  •                       Netflix Ribbon:客户端负载均衡的服务调用组件。
  •                       Netflix Feign:基于Ribbon和Hystrix的声明式服务调用组件。
  •                       Netflix Zuul:微服务网关,提供动态路由,访问过滤等服务。
  •                       Netflix Archaius:配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
  • Spring Cloud for Cloud Foundry:通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。
  • Spring Cloud Sleuth:日志收集工具包,封装了Dapper,Zipkin和HTrace操作。
  • Spring Cloud Data Flow:大数据操作工具,通过命令行方式操作数据流。
  • Spring Cloud Security:安全工具包,为你的应用程序添加安全控制,主要是指OAuth2。
  • Spring Cloud Consul:封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。
  • Spring Cloud Zookeeper:操作Zookeeper的工具包,用于使用zookeeper方式的服务注册和发现。
  • Spring Cloud Stream:数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。
  • Spring Cloud CLI:基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件

 

Hibernate的三种状态是什么?怎么将游离状态转换为持久化状态?

transient(瞬时状态),persistent(持久化状态)以及detached(离线状态)

转换:update()    saveOrUpdate()       lock()

Java开发工程师面试题

 

 

 

 

 

 

 

 

 

相关标签: Java面试题