面试题
1. 什么是spring?
Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,
但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企
业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
2. 使用Spring框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约2MB
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而
不是创建或查找依赖的对象们
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和
系统服务分开
容器:Spring 包含并管理应用中对象的生命周期和配置
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替
代品
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务
下至全局事务(JTA)
异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,
Hibernate or JDO抛出的)转化为一致的unchecked 异常
3.Spring核心容器模块
这是基于Spring模块, 提供Spring框架的基础功能,BeanFactory是任何
以Spring为基础的应用的核心,Spring框架建立在此模块之上,他使Spring
成为一个容器
4.解释Aop模块
Aop模块用于开发我们的Spring应用做面向切面编程,很多支持由Aop联合
提供,这样就确保了Spring和其他Aop框架的共同性,这个模块将元数据编程
引入Spring
5.为什么需要 public static void main(string [] arg)这个方法?
JVM在运行程序的时候,第一步就是找到main()方法,在这个方法里面
public表示访问修饰符,static表示静态,即当前main()方法为静态方法也就是说
当前这个方法在静态储存区中,当前main()方法不需要实例化访问,JVM在启动
的时候就是上述签名( public static void main(string [] arg))找到主方法运行如果
找不到就不运行。
6.java程序初始化顺序?
在java中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当前所有
类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
1. 静态对象(变量)优先于非静态,静态只能被初始化一次,非静态可以被初始化多次
2.父类优先于子类初始化
3.按照成员变量的定义顺序进行初始化
静态代码块>静态方法>构造代码块>构造方法
7.什么是mybatis?
1.mybatis是一个半ORM(对象关系映射)框架,它内部封装了jdbc,开发时只需要
关注sql语句本身就可。
2.mybatis可以使用xml或注解来配置和映射原生信息,将pojo映射到数据库中的记录
避免了几乎所有的jdbc代码和手工设置以及获取结果集。
3.通过xml文件或注解方式将要执行的各种statement配置起来,并通过java对象和
statement中的sql动态参数进行映射生成最终执行的sql语句,最后有mybatis框架执行
sql并将结果集映射为java对象并返回。
8.mybatis有什么缺点?
1.sql语句编写工作量大,尤其是表字段多等等。
2.sql语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
9.${}和#{}有什么区别?
1.#{}是预编译处理,${}是字符串替换
2.mybatis在处理#{},会将sql中的#{}替换成?号,调用PrepareStatement的set方法来赋值
3. Mybatis在处理${}时,就是把${}替换成变量的值。
4.使用#{}可以有效地防止sql注入,提高系统安全性,
10.hashMap和hashTable的区别?
1.hashTable是线程同步的,安全 :hashMap非线程同步 不安全
2.hashMap可以空键空值:hashTable不可以
3.对于单线程来说,hashTable效率低
11。值传递和引用传递。
值传递: 传值为基本数据类型,方法一中的数据传递到方法二中的数据,当方法
1中数据发生改变时,方法二中数据不会发生改变。
引用传递: 传的参数为地址值,当方法一中地址的数据发生变化时,方法二中的
地址值也会发生变化,因为他们操作的是同一个地址。
12.JVM加载class文件的原理机制是什么?
(编译 将编写的java源代码变成class字节码 计算机认识class字节码不认识编写的源代码
运行 将class字节码进行执行)
java语言是一种具有动态性的解释性语言,类(class)只有被加载到JVM中才能运行
当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,
并组织成为一个完整的java应用程序。这个加载过程是由加载器来完成的,具体来说,就是
ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质就是把类文件从硬盘
中读取到内存中。
类加载方式分为两种,隐式加载和显示加载。隐式加载指的是程序在使用new等方式
创建对象时,会隐式的调用类的加载器把对应的类加载到JVM中。显示加载指的是通过直接
调用class.forName()方法来把所需的类加载到JVM中。(反射和内省)
所有的项目工程都有很多类组成。当程序启动时,只需把类加载到JVM中,其他类只有
被使用到时候才会被加载,使用这种方式,一方面可以加快加载速度,另一方面也可以节约程序
运行过程中内存开销,java语言中,每个类和接口都有自己所对应的.class文件,这些文件可以被
看成一个个动态加载单元,因此当只有部分类被修改时,只需要重新编译变化的类即可,而不需要
重新编译所有文件,因此加快了编译速度。
13.什么是GC(Garbage Collection)
垃圾回收机制GC(Garbage Collection,主要作用就是回收程序中不在使用的内存。为了减轻
开发者负担,java提供垃圾回收器来自动检测对象的作用域,可自动地把不在被使用的储存空间
释放掉。
垃圾回收机制是依据一定的算法进行的:
1.引用计数算法
2.追踪回收算法
3.压缩回收算法
4.复制回收算法
5.按代回收算法
14接口和抽象类的区别?
抽象类: 含有abstract修饰的类称为抽象类,抽象类不能被实例化
抽象类的方法不一定都是抽象方法
抽象类中定义的抽象方法必须在子类中实现
如果实现类中没有完全实现父类的抽象方法,那么当前实现类也必须为abstract修饰
接口: 可以说成抽象类的一种特例,接口中的所有方法都必须是抽象的 。接口中的方法定义
默认为public abstract类型,接口中的成员变量默认为public static final
区别: 1.抽象类可以有构造方法接口中不能有构造方法
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中所有的方法必须是抽象的不能有非抽象方法
4.抽象类中的抽象方法的访问类型可以是public protected和默认类型,接口中只能是public
默认为public abstract修饰。
5.抽象类可以包含静态方法,接口不能包含静态方法
6.一个类可以实现多个接口,但只能继承一个抽象类。
15.java中实现多态的机制是什么?
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运
行期才动态绑定,就是引用变量所指向的具体实例对象的方法,可就是内存里正在运行那个对象的方法,而
不是引用变量的类型中定义的方法.(父类的引用指向子类的对象)。
16.java中是否存在内存泄漏问题?
内存泄漏是指一个不在被程序使用的对象或变量还在内存中占有储存空间。java中引进了垃圾回收机制,由
垃圾回 收器负责回收不在实用的对象,既然有垃圾回收器为什么还会出现内存泄漏问题。
判断内存空间是否符合垃圾回收的标准:
1,给对象赋予了空值null,以后再也没有使用过
2. 给对象赋予新值,重新分配内存空间
java中经常出现内存泄露的原因:
1.静态集合类 例如 :HashMap和Vector
2.各种连接 例如: 数据库连接 、网路连接 、IO连接
3.监听器
4.变量不合理使用
5.单例设计模式可能会造成内存泄漏
java中堆和栈的区别?
在java中,堆和栈都是内存用来存放数据的地方。变量分为基本数据类和引用数据类型,基本数据类型的变量
(byte ,short ,int long, float ,double ,char,boolean)以及对象的引用变量,其内存都分配在栈上,变量出了作
用域就会自动释放。引用类型的变量分配在堆上或常量池中,需要通过new等方式创建。Person p=new Person();
产生俩对象分别存放在堆上或常量池中。
栈内存主要用来存放基本数据类型和引用变量
堆内存主要用来存放运行时创建的对象,一般来说通过new对象创建出来的对象都放在堆内存中。由于JVM是
基于堆栈的虚拟机,而每个java按程序都运行在一个单独的JVM实例上,每一个实例对应一个堆,一个java程序内的
多线程 也就是运行在同一个JVM实例上,因此这些线程 之间会共享堆内存,所以,多线程在访问堆中的数据是需要
对数据进行同步。