java工程师面试题

时间:2021-10-19 18:01:41
 1 IO流在项目中是如何应用的?

当不同的介质之间有数据交互的时候,Java就使用流来实现。数据源可以是文件、数据库、网络甚至是其他的程序。

比如把数据从硬盘文件读取到JVM中叫输入流,实际应用比如(excel导入数据库)

想法即输出流,(excel的导出)

2 谈谈你对线程的理解,如何创建?

进程与线程,启动可执行程序一,叫一个进程。接着又启动一个可执行程序,叫两个进程。

线程是进程内部同时做的事情,比如银行办理业务,如果不使用线程,就是业务员给大厅用户办理业务,一个用户办理完成另一个用户继续办理。如果使用线程,abcd业务员同时给大厅用户办理业务。这样显得第二种效率更高一些。

线程的创建:设计一个线程类,集成Thread,并重写run方法。

启动线程,实例化一个线程类对象,并调用其start方法。

3 什么是高并发?

大量用户请求同一时间访问相同的事件

解决方式有:1、使用缓存2、生成静态页面3、代码优化使用分布式的系统架构,分布式的数据模型设计

4 常用的线程池有哪些?newFixedThreadPoolnewCacheThreadPool的区别是什么?

newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待

5 谈一下线程池的配置。

线程池的大小:N=cpu数量,U=目标cpu的使用率,W/C等待时间与计算时间比率

线程池大小=N*U*(1+W/C)

Runtime.getRuntime().availableProcessors()得到CPU数量

6 JDK 8.0 加入了哪些新的特性?

1、在很多情况下,Java8 都能提升应用性能,而无需任何改变或性能调优。

2 Lambda 表达式、 StreamsAPI 以及现有类的新方法都是提高生产力的重要工具。

3Java8 新推出的 Optional类型在处理 null 值时,能减少 NullPointerExceptions 的可能性,给开发者极大的灵活度。

7 简要谈谈你对AOP的理解。

面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。这个简单来说就是可以在一段程序之前或者之后做一些事。

8 简要谈谈你对IOC的理解 

控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。简单来说就是不需要NEW一个对象了。

9 什么是spring注解?常用的有哪些注解?

减少xml配置,写在java代码文件中,增强程序的内聚性。

1 @Required:依赖检查;

2 @Autowired:自动装配2

自动装配,用于替代基于XML配置的自动装配

基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器、字段、方法注入

3 @Value:注入SpEL表达式

用于注入SpEL表达式,可以放置在字段方法或参数上

@Value(value = "SpEL表达式") 

@Value(value = "#{message}") 

4 @Qualifier:限定描述符,用于细粒度选择候选者

@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者

@Qualifier(value = "限定标识符")

10 Controller中怎么配置注解扫描?

必须将<context:component-scan base-package="包路径.controller"/>放置在dispatcherservlet的配置文件中

11 Controller中获取bean的注解是什么

@Controller配置成的bean

12 Controller里分页的参数都有什么

页面大小、当前页码

13 如何在spring中注入java集合类?简要列举一下用哪些集合配置元素可以实现注入?

新建xml文件,设置实体类集合bean的配置信息(property name=listsetmap

读取配置文件,getBean获得集合

14Spring有哪些事务管理类型?请简要叙述它们的特点。

①编程式  ②声明式。编程式的比较灵活,但是代码量大,存在重复的代码比较多;而声明式事务管理比编程式更灵活方便

15、如何用spring进行日志管理?简要叙述步骤。

Spring的事务管理接口主要有三个:TransactionDefinitionPlatformTransactionManagerTransaction Status

①在Spring中,事务是通过TransactionDefinition接口来定义的,该接口包含与事务属性相关的方法,TransactionDefinition定义了五个表示隔离级别的常量,代表传播行为的常量,在TransactionDefinition中以int值表示超时时间。

Platform TransactionManager.getInstance()方法返回一个TransactionStatus对象,返回的Transaction Status对象可能代表一个新的或已经存在的事务(如果当前调用堆栈中有一个符合条件的事务)。

Transaction Status接口提供了一个简单的控制事务查询和执行的方法。

16、什么是DIspringDI有哪些?

1  接口注入

2  Setter方法注入

3  构造方法注入

17、当视图模型组件封装好以后,返回到页面是什么?

 

18 谈一谈springmvc的优点

清晰的角色划分、强大而直接的配置方式、可适配、非侵入、可重用的业务代码、

可定制的绑定(binding)和验证(validation)、可定制的handlermappingview resolution、灵活的model转换、可定制的本地化和主题(theme)解析、简单而强大的JSP标签库(Spring Tag Library)JSP表单标签库、Spring Bean的生命周期可以被限制在当前的HTTp Request或者HTTp Session

19 谈谈Dubobo在项目中如何应用?简要谈谈如何配置

DubboAlibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。

从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色

(1)下载dubbo-admin-2.4.1.war包,在windowstomcat部署,先把dubbo-admin-2.4.1放在tomcatwebapps/ROOT下,然后进行解压

(2)然后到webapps/ROOT/WEB-INF下,有一个dubbo.properties(dubbo.registry.addressdubbo.registry.group)文件,里面指向Zookeeper,使用的是Zookeeper 的注册中心。和修改webapps\dubbo\WEB-INF\classes\META-INF\spring下的dubbo-admin.xml里面的注册中心分组:

<dubbo:registryaddress="${dubbo.registry.address}"group="${dubbo.registry.group}" check="false"file="false" />

(3)然后启动tomcat服务,用户名和密码:root(dubbo.properties文件可见),并访问服务,显示登陆页面,说明dubbo-admin部署成功

20 谈谈你熟悉的设计模式有哪些,重点谈一下代理模式和单例模式,以及如何运用?

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式。

================================================

代理模式就是多一个代理类出来,替原对象进行一些操作。比如租房中介代理租房、律师代理打官司服务等。

代理模式的应用场景:

如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:

1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。

2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。

使用代理模式,可以将功能划分的更加清晰,有助于后期维护!

================================================

单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在

1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。

2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。

3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

21 finallyfinal的区别

一。final

如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在new一个对象时初始化(即只能在声明变量或构造器或代码块内初始化),而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能覆盖(重写)

二。finally

在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

三。finalize

方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。注意:finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用。

22 方法重写和方法重载的区别

方法重载:

一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,或者是参数的个数或者类型不同。方法的返回类型和参数的名字不参与比较,也就是说如果两个方法的名字相同,即使类型不同,也必须保证参数不同。

方法重写: 
如果子类可以继承父类的某个实例方法,那么子类就有权利重写这个方法。是指:子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同。 
目的:子类可以通过方法的重写可以隐藏继承的方法,子类通过方法的重写可以吧父类的状态和行为改变为自身的状态和行为。 
限制:重写父类方法是,不可以降低方法的访问权限。

23 你知道的运行时异常,用英语说10

NullPointerException

JMRuntimeException

IndexOutOfBoundsException

ClassCastException

WebServiceException 

NoSuchElementException

SystemException

EventException

BufferUnderflowException

AnnotationTypeMismatchException

ArithmeticException

24 Tryreturn 语句和finally中的语句谁最后执行?

1. finally语句在return语句执行之后return返回之前执行的。

2. finally块中的return语句会覆盖try块中的return返回。

3. 如果finally语句中没有return语句覆盖返回值,那么原来的返回值就不会因为finally里的修改而改变。

4. try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况。

5. 当发生异常后,catch中的return执行情况与未发生异常时tryreturn的执行情况完全一样。

最后总结:finally块的语句在trycatch中的return语句执行之后返回之前执行且finally里的修改语句不能影响trycatchreturn已经确定的返回值,若finally里也有return语句则覆盖trycatch中的return语句直接返回。

25 一个类中方法或者属性为私有的,若其他类中要调用这个类的私有方法,如何实现?

利用java给我提供的反射机制就可以实现对私有方法和私有属性的访问

26 StringBuilderStringBuffer的区别?

StringBuilder:线程非安全的

StringBuffer:线程安全的

对于三者使用的总结:

1.如果要操作少量的数据用 = String

2.单线程操作字符串缓冲区 下操作大量数据 =StringBuilder

3.多线程操作字符串缓冲区 下操作大量数据 =StringBuffer

27 Hashmap如何进行遍历?哪一种遍历方式最高效?

28 java中常用的包有哪些?File是哪个包下的?

java.lang.*

java.util.*

java.io.*

java.net.*

java.sql.*

java.io.File  (?)

29 写定时任务通常使用什么技术?

1javatimer

2、使用spring完成定时任务

3、使用quartz实现

30 简要列举你熟悉的前端框架

Bootstrap\easyui\lasyui\miniui\phongap

31 字符流和字节流哪一个更高级?为什么?

stream结尾都是字节流,readerwriter结尾都是字符流

两者的区别就是读写的时候一个是按字节读写,一个是按字符。

实际使用通常差不多。

在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。

只是读写文件,和文件内容无关的,一般选择字节流。

32 Java注解和spring注解的关系?

Java注解对元素及行为进行解释说明的标注 ,比如@Target说明了Annotation所修饰的对象范围,@Retention(定义了该Annotation被保留的时间长短),.@Documented(用于描述其它类型的annotation应该被作为被标注的程序成员的公共API),

@Inherited元注解是一个标记注解

Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作

33 反射机制是怎么创建对象的?

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制

34 如何用Java导出excel表格?

环境准备下载相关jar

将根目录下的poi-3.6-20091214.jarLib目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目的Lib

1、用HSSFWorkbook打开或者创建“Excel文件对象”

2、用HSSFWorkbook对象返回或者创建Sheet对象

3、用Sheet对象返回行对象,用行对象得到Cell对象

4、对Cell对象读写。

35 谈谈hibernatemybatis各自的优、缺点。

Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。

Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。

iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

36 Java中两个值ab如何实现值的交换,如果是int类型,不使用第3个变量暂存的方法如何实现值交换?

37 简要描述一下Java的类加载机制。

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

38 getpost请求的区别?

1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。

2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求

大小:

(1).首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了

(2).理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制”是不准确的,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。

39 项目中调用接口除了使用到get/post方式请求,还用到哪些方法?


40 redis集群怎么同步登录session,简述一下分布式框架搭建步骤。

 

41Google工具包里面的缓存改成redis能提高多少性能,简述一下你们项目中的报表功能

 

42 面向对象的特征有哪些?

JAVA面向对象最重要的特征就是:封装,继承,多态。

43 项目中使用过什么服务器?

TomcatResinJBossWebSphere  WebLogic

44 mysql数据库内海量订单数据如何优化,至少说出两种方案,并简要描述。

第一优化你的sql和索引;第二加缓存,memcached,redis;第三以上都做了后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用三方工具,第三方工具推荐360atlas,其它的要么效率不高,要么没人维护;第四如果以上都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区,另外分区表还有一些坑,在这里就不多说了;第五如果以上都做了,那就先做垂直拆分,其实就是根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;第六才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;

45 mysql如何分页查询?

Limit pagestart,pagesize

46 sql中什么是内连接和外连接?

Inner join

Out join

47 什么是数据库的共享锁和排它锁?

共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

排他锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的*。获准排他锁的事务既能读数据,又能修改数据。

48 关于同步跟异步你是如何理解的?分别谈谈如何实现。

共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

排他锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的*。获准排他锁的事务既能读数据,又能修改数据。

49 简要谈谈web.xml中如何进行配置?

  1. <context-param>   
  2.   <param-name>ContextParameter</para-name>   
  3.   <param-value>test</param-value>   
  4.   <description>It is a test parameter.</description>   
  5. </context-param>   

50、亚马逊的文件服务器?


51、抽象类与接口的区别?

1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 

4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 

7.接口中的方法默认都是 public,abstract 类型的。

abstract class 和 interface 是 Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概 念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会。