2018最新java面试题总结

1.JDK、JRE和JVM三者之间关系
JDK,JRE,JVM关系、区别。
JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。Java 语言的软件开发工具包
JRE(Java Runtime Environment)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。

三者之间关系 
JDK 包含JRE,JRE包含JVM。

JVM:将字节码文件转成具体系统平台的机器指令。 
JRE:JVM+Java语言的核心类库。 
JDK:JRE+Java的开发工具。 JavaRuntime Environment

2.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。

Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。

3.是否可以在static环境中访问非static变量?

static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

静态方法的两个注意点:

1.  静态方法不能操作非静态变量,也不能调用非静态方法。(这个可以这样理解:静态方法属于类,直接通过类名就可以调用,而此时可能没有任何实例,更谈不上操作实例变量和调用实例方法了。)

2.  静态方法中不能使用 this 和 super 关键字。(道理同上)

4.什么是自动拆装箱?

自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱

5.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。

Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数

6.Java集合类框架的基本接口有哪些

Collection 
├List 
│├LinkedList 
│├ArrayList 
│└Vector 
│ └Stack 
└Set 
Map 
├Hashtable 
├HashMap 

└WeakHashMap

List和Set继承自Collection接口。他们两个都是接口
Set
无序不允许元素重复。HashSet和TreeSet是两个主要的实现类。
List
有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。
Map
也属于集合系统,但和Collection接口没关系。Map是key对value的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。 HashMap、TreeMap和Hashtable是三个主要的实现类。
SortedSet
和SortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

7.JDBC

72.什么是JDBC?

JDBC是允许用户在不同数据库之间做选择的一个抽象层。JDBC允许开发者用JAVA写数据库应用程序,而不需要关心底层特定数据库的细节。

73.解释下驱动(Driver)在JDBC中的角色。

JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection, Statement, PreparedStatement,CallableStatement,ResultSet和Driver。

74.Class.forName()方法有什么作用?

这个方法用来载入跟数据库建立连接的驱动。

75.PreparedStatement比Statement有什么优势?

PreparedStatements是预编译的,因此,性能会更好。同时,不同的查询参数值,PreparedStatement可以重用。

76.什么时候使用CallableStatement?用来准备CallableStatement的方法是什么?

CallableStatement用来执行存储过程。存储过程是由数据库存储和提供的。存储过程可以接受输入参数,也可以有返回结果。非常鼓励使用存储过程,因为它提供了安全性和模块化。准备一个CallableStatement的方法是:

1CallableStament.prepareCall();

8.java虚拟机(JVM)

<1jvm结构

1.  类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中

2.  内存区(也叫运行时数据区):是在JVM运行的时候操作所分配的内存区。运行时内存区主要可以划分为5个区域(如图)

3.  执行引擎:负责执行class文件中包含的字节码指令

4.  本地方法接口:主要是调用C或C++实现的本地方法及返回结果。

 

垃圾检测、回收算法

垃圾收集器一般必须完成两件事:检测出垃圾;回收垃圾。怎么检测出垃圾?一般有以下几种方法(垃圾检测方法):

引用计数法:给一个对象添加引用计数器,每当有个地方引用它,计数器就加1;引用失效就减1

可达性分析:以根集对象为起始点进行搜索,如果有对象不可达的话,即是垃圾对象。这里的根集一般包括java栈中引用的对象、方法区常良池中引用的对象

java中垃圾收集的方法有哪些?(回收算法)

1.  标记-清除:

算法和名字一样,分为两个阶段:标记和清除。标记所有需要回收的对象,然后统一回收。这是最基础的算法,后续的收集算法都是基于这个算法扩展的。

不足:效率低;标记清除之后会产生大量碎片

2.  复制算法:

此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间

3.  标记-整理

该算法主要是为了解决标记-清除,产生大量内存碎片的问题;当对象存活率较高时,也解决了复制算法的效率问题。它的不同之处就是在清除对象的时候现将可回收对象移动到一端,然后清除掉端边界以外的对象,这样就不会产生内存碎片了。

4.  分代收集

现在的虚拟机垃圾收集大多采用这种方式,它根据对象的生存周期,将堆分为新生代老年代。在新生代中,由于对象生存期短,每次回收都会有大量对象死去,那么这时就采用复制算法。老年代里的对象存活率较高,没有额外的空间进行分配担保,所以可以使用标记-整理

持久代:用于存放静态文件,比如java类、方法等。持久代对垃圾回收没有显著的影响

简述java类加载机制?

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的java类型。

9.框架

spring springMvcspring-boot spring-cloud简单介绍

什么是spring

关于spring的定义无论是从官方还是市面上已经很多能够清晰明了的做出解释了。我姑且简单定义它为一个轻量级的控制反转(IoC)和面向切面(AOP)的容器,Java开发框架,至于控制反转、面向切面、轻量级、容器等这些自行百度,很多大牛解释的非常清楚

什么是springMvc

这里我姑且把名词分开来讲、spring与mvc可以更好地解释什么是springMvc,MVC为现代web项目开发的一种很常见的模式,简言之C(控制器)将V(视图、用户客户端)与M(模块,业务)分开构成了MVC ,业内常见的mvc模式的开发框架有Struts1,Struts2等。spring作为专业的开发web项目的开源框架,springMvc为内部的一个模块环节,同样采取mvc设计模式。 所以在使用spring开发web项目时,作为核心环节的MVC可以使用struts1/struts2/springMVc

什么是spring-boot

我的理解是这样的、spring系列大家族里面产品超级多了、那么使用spring整合基础框架作为项目架构时,大多数初级人员在搭建项目时话费了很多时间也未必能搭建明白。 spring-boot就是为了解决开发人员这个痛点而诞生的,说白了就是把以前的手动配置的过程自动化封装了,提供默认的配置,借用大牛总结的特点就是:

简单易用,初学者和大牛都可以轻松上手,其中的注解会给使用者提供方便;

Spring boot对第三方技术进行了很好的封装和整合,提供了大量第三方接口;

可以通过依赖自动配置,不需要XML等配置文件

还提供了安全等特性姑且先不做理会。

完了现在boot总结就是可以快速启动,快速构建项目,在配置文件环节省去大量时间和精力,傻瓜式带你进入项目大门,进行业务逻辑编写。现在跟很多框架整合了按照规范去配置 分分钟上手写代码

什么是spring-cloud

微服务是当前架构领域的热门话题,要想知道什么是spring-cloud,麻烦先去弄清楚什么是微服务。 spring-colud是一种云端分布式架构解决方案,基于spring boot,在spring boot做较少的配置,便可成为 spring cloud 中的一个微服务。说点有点冠冕堂皇了 我也没用过、不过简单理解为:spring cloud也就是提供了一些常用的分布式组件,都是应用型的,就根spring mvc差不多。

Mybatis与Hibernate区别

hibernate:是一个标准的ORM框架(对象关系映射)。入门门槛较高,不需要写sql,sql语句自动生成,对sql语句进行优化、修改比较困难。

应用场景:适用需求变化不多的中小型项目,比如:后台管理系统,erp,orm,oa等

mybatis:专注sql本身,需要程序员自己编写sql语句,sql修改、优化比较方便。mybatis是一个不完全的ORM框架,虽然程序员自己写sql,mybatis也可以实现映射(输入映射,输出映射)

应用场景:适用需求变化较多的项目,比如:互联网项目。

10.Webservice服务(接口)

 

二.webService分类(分为两种方式):

<1.soapWebservice

1. soapwebService三要素

SOAP、WSDL(WebServicesDescriptionLanguage)、UDDI(UniversalDescriptionDiscoveryandIntegration)之一, soap用来描述传递信息的格式,SOAP即简单对象访问协(Simple ObjectAccess Protocol),

WSDL 用来描述如何访问具体的接口,

uddi用来管理,分发,查询webService 。

2.soapwebService三要素2

几种流行Webservice框架性能对比

比较流行几个框架:Apache Axis1、ApacheAxis2、Codehaus XFire、Apache CXF等

关键词:Axis1、Axis2、XFire、CXF、Spring、SOAP、StAX、WSDL

<2.restfulwebservice

一是SOAP协议方式,在这种方式下需要WSDL,UDDI等,二是RESfull方式,这种方式根本不需要WSDL,UDDI等。而且REST方式现在看来是更加流行,更有前途的方式。


你所晓得的设计形式有哪些; 

答:Java 中普通以为有23 种设计形式,我们不需求一切的都会,但是其中常用的几种设计形式应该去掌握。上面列出了一切的设计形式。需求掌握的设计形式我独自列出来了,当然能掌握的越多越好。

总体来说设计形式分爲三大类:

创立型形式,共五种:工厂办法形式、笼统工厂形式、单例形式、建造者形式、原型形式。

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

行为型形式,共十一种:战略形式、模板办法形式、察看者形式、迭代子形式、责任链形式、命令形式、备忘录形式、形态形式、拜访者形式、中介者形式、解释器形式。


在Java中wait和seelp办法的不同

答:最大的不同是在等候时wait 会释放锁,而sleep 不释放对象锁。wait 通常被用于线程间交互,sleep 通常被用于暂停执行。


什麼是线程池,如何运用? 

答:线程池就是事前将多个线程对象放到一个容器中,当运用的时分就不必new 线程而是间接去池中拿线程即可,


进程和线程的区别和联系

定义:

进程:是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程。

线程:可以看成是轻量级的进程,是CPU调度和分派的基本单位。

区别:

(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。

(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。

(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。

(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

说说你对Java反射的了解

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

从对象出发,通过反射(Class类)可以取得取得类的完整信息(类名 Class类型,所在包、具有的所有方法 Method[]类型、某个方法的完整信息(包括修饰符、返回值类型、异常、参数类型)、所有属性 Field[]、某个属性的完整信息、构造器 Constructors),调用类的属性或方法

自己的总结: 在运行过程中获得类、对象、方法的所有信息。

获取Class对象有三种方式:

1.通过Object类的getClass()方法。例如:

Class c1 = new String("").getClass();

2.通过Class类的静态方法——forName()来实现:

Class c2 = Class.forName("MyObject");

3.如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:

Class c3 = Manager.class;

Class c4 = int.class;

Class c5 = Double[].class;






猜你喜欢

转载自blog.csdn.net/tianzongnihao/article/details/79730743