说明:本面试题集是根据本人面试的几家公司以及在网上经搜集、整理而来。如有错误或纰漏,望指正,定会及时修改。
Java集合类:
1.Java集合类有哪些?
List接口:ArrayList和LinkedList
Set集合:TreeSet和HashSet
Map映射:TreeMap和HashMap
2. ArrayList和LinkedList有什么区别?
(1)ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构
(2)对于随机访问get和set,ArrayList较优,因为LinkedList要移动指针
(3)对于新增和删除操作add和remove,LinedList较优,因为ArrayList要移动数据。
3.HashSet和TreeSet有什么区别?
HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。
4. HashMap和Hashtable的区别?
(1)HashMap允许空键值,Hashtable不允许
(2)HashMap是Java1.2引进的Mapinterface的一个实现,Hashtable继承自Dictionary类
(3)HashMap的方法不是同步的,Hashtable的方法是同步的
5.如何遍历ArrayList?有哪些方法遍历?
迭代器:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ArrayListDemo
{ public static void main(String[] args)
{ List<String> list = new ArrayList<String>(); list.add("luojiahui"); list.add("luojiafeng"); Iterator it1 = list.iterator(); while(it1.hasNext())
{ System.out.println(it1.next()); } } }
6. ArrayList和Vector的最大区别:ArrayList是线程不安全的,Vector是线程安全的
接口和抽象类:
1.接口和抽象类的区别?
(1)类可以实现多个接口,只能继承一个抽象类
(2)接口中的变量都是final的,抽象类中的变量可以包含非final的
(3)接口中的成员函数是public,抽象类的成员函数可以使private,protected或public
(4)接口中的方法是抽象的,抽象类的方法既有抽象又有非抽象
进程线程:
1.多线程原理,如何创建线程对象。
通过继承Thread类或实现Runnable接口实现多线程。Thread类提供创建、管理和控制线程对象的方法;Runnable接口约定线程的执行方法。
2.线程同步?
如果并发执行的多个线程间需要共享资源或交换数据,则这一线程称为交互线程。因为交互线程并发执行时相互之间会干扰或影响其他线程的执行结果,因此交互线程需要有同步机制。
交互线程间存在两种关系:竞争关系和协作关系。对于竞争关系的交互线程间需要采用线程互斥解决共享资源冲突问题,对于协作关系的交互线程间需要采用线程同步的方式解决线程间通信及执行速度不同而引起的不同步问题。线程的同步机制包括线程互斥和线程同步。线程互斥是线程同步的特殊情况。
Wait()、notify()、notifyAll()方法提供线程间通信方法
3.进程和线程的区别
进程是执行着的应用程序,线程是进程内部的一个执行序列。一个进程可以有多个线程。
4.什么是死锁(deadlock)?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。
5. 如何确保N个线程可以访问N个资源同时又不导致死锁?
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
6.Socket通信?
Java提供ServerSocket和 Scoket类实现TCP Scoket通信。ServerSocket类提供TCP连接服务,Scoket类提供进行通信的Scoket对象。
数据库:
1.JDBC连接数据库的步骤?
(1)加载JDBC驱动程序
(2)提供JDBC连接的URL
(3)创建数据库连接
(4)创建statement实例
(5)执行SQL语句
(6)更新或返回结果集
(7)关闭JDBC对象,释放资源
2.数据库的相关操作:建表、更改表的属性、更改表中数据、查询整张表的数据
(1)建表:
Create table 基本表{…..}
(2)修改表:
Alter table 基本表 add 新列 数据类型[列级完整性约束]
Alter table 基本表 modify 列 数据类型
Alter table 基本表 drop 完整性约束
(3)删除表:
Drop table 表
(4)插入数据:
Insert into 基本表(列) values(值)
(5)修改数据:
Update 基本表 set 列=表达式 where 条件表达式
(6)删除数据:
Delete from 表 where 条件表达式
Web前端:
1.Post和Get方法的区别?
1)GET请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给WEB服务器
2)GET方式对传输的数据大小有限制,通常不能大于2KB,而POST方式传递的数据量要比GET方式大得多,理论上不受限制
3)GET方式请求的数据会被浏览器缓存起来,而POST方式相对来说就可以避免这些问题
2.JSP九大内置对象?四大作用域?
九大内置对象:request、response、session、application、exception、page、pageContext、out、config
四大作用域:page、request、session、application
Page:当前页面有效
Request:同一次请求所涉及的服务器资源属于同一次请求
Session:同一会话期间所访问的资源
Application:服务器启动到关闭的整段时间
3.Servlet的生命周期
(1)init()方法:服务器初始化
(2)service()方法:初始化完毕,Servlet对象调用该方法响应客户的请求
(3)destory()方法:调用该方法销毁Servlet对象
4.前端页面如何实现下拉框?
<select>标签创建下拉列表
<option>标签定义下拉列表中的一个选项
算法和数据结构:
1.二叉树及遍历
先序遍历:1,2,3
中序遍历:2,1,3
后序遍历:2,3,1
2.快速排序、冒泡排序的过程
冒泡排序:
现将第一个数与第二个数比较,如果第一个比第二个大,交换;然后比较第二个与第三个数,以此类推,直至第n-1个数与第n个数进行比较为止。这是第一趟排序,最大的数经过交换在最后一个。进行第二趟排序,对前n-1个数进行同样的操作,这样第二大的数在第n-1的位置,以此类推,得到从小到大的数。
快速排序:
以首元素作为标准将数组A划分为前后两部分,比首元素小的元素构成数组的前部分,比首元素大的元素构成数组的后部分。这两部分构成两个新的子问题,算法接着分别对这两部分递归的进行排序。
一趟排序:先从后向前扫描数组A,找到第一个小于等于A[p]的元素A[j],然后从前向后扫描第一个不小于A[p]的元素,当i<j时,交换A[i]与A[j],接着对数组A从i到j之间的部分继续上面的扫描过程,直到i和j相遇。当i>j时,j就代表A[p]在排好序的数组中的正确位置q。
当一趟排序过程结束后,将数组元素A[q]与A[p]交换,这样A[p]就处于排好序后的正确位置,从而原问题就以q为边界划分成两个需要分别排序的子问题了。
面向对象:
1.如何理解面向对象编程?面向对象的特点?
封装性、继承性、多态性和抽象性
2.String 和StringBuffer的区别
String类提供了数值不可改变的字符串,StringBuff类提供的字符串可以进行修改,它可以改变字符数据,也可以用它来构造字符数据。
3.Overload和Override的区别
重载Overload是一个类中的多态性的一种表现,方法名相同,而参数个数或参数类型或返回值类型不同;
重写Override是父类与子类之间多态性的一种表现,在子类定义的某方法与父类有相同的名称和参数。
4.java中实现多态的机制是什么? 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
5.final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
6、GC是什么? 为什么要有GC?
GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
JavaEE
1.MVC思想、特点?
思想:JSP页面的请求与Servlet(控制器)交互,而Servlet负责与后台的JavaBean通信。在Model 2模式下,模型(Model)由JavaBean 充当,视图(View)由JSP页面充当,而控制器(Controller)则由Servlet充当;
特点:
(1)多个试图对应一个模型
(2)模型返回的数据与显示逻辑分离
(3)分为三层,降低耦合
(4)控制层把把不同的模型和不同的视图组合在一起,完成不同的请求
(5)MVC容易管理
2.Java常用设计模式?
单例模式、简单工厂、工厂方法和抽象工厂、代理模式、命令模式、策略模式、门面模式、桥接模式、观察者模式。
3.什么是单例模式?什么时候用到?举例?
如果一个类始终只能创建一个实例,则这个类被称为单例类,这种模式被称为单例类。
配置Bean实例时指定scope =“singleton”来配置单例模式
举例:
classSingleton{
privatestatic Singletoninstance; //使用一个类变量缓存曾经创建的实例
privateSingleton(){} //将构造器使用private修饰,隐藏该构造器
publicstatic Singleton getInstance() //提供一个静态方法,用于返回Singleton实例
{
if(instance==null) //如果instance为null,表明不曾创建Singleton对象
{
instance=new Singleton();
}
returninstance; //如果不为null,表明已经创建Singleton对象,将不会执行该方法
}
}
public classSingletonTest {
publicstatic void main(String[] args) {
Singletons1 = Singleton.getInstance();
Singletons2 = Singleton.getInstance();
System.out.println(s1== s2); //将输出true
}
}
4.SSH如何实现登录过程?
(1)点击登录submit会提交form表单
(2)根据form表单中action 的路径,在struts.xml中寻找对应的action的class;
(3)根据这个class在aplicationContext.xml中查找对应的UserAction;
(4)执行UserAction中的login方法,查找UserService,查找UserDao;
(5)执行UserDao中的login方法,返回结果集
(6)在Struts.xml中返回result的name,加载登录页面
5.Struts的工作机制?
(1)客户端浏览器发出http请求
(2)根据配置文件web.xml和struts.xml找到执行该请求对应的action
(3)执行该action,返回或更新结果
(4)根据struts.xml返回逻辑视图结果
(5)返回http请求至客户端浏览器
6.什么是ORM?
对象关系映射(Object-RelationalMapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。
8.Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别? Hibernate的对象有三种状态:瞬时态(transient)、持久态(persistent)和游离态(detached)。瞬时态的实例可以通过调用save()、persist()或者saveOrUpdate()方法变成持久态;游离态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate()变成持久态。
9.Hibernate如何实现分页查询?
通过Hibernate实现分页查询,开发人员只需要提供HQL语句(调用Session的createQuery()方法)或查询条件(调用Session的createCriteria()方法)、设置查询起始行数(调用Query或Criteria接口的setFirstResult()方法)和最大查询行数(调用Query或Criteria接口的setMaxResults()方法),并调用Query或Criteria接口的list()方法,Hibernate会自动生成分页查询的SQL语句。
10.如何理解Hibernate的延迟加载机制? 延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载。Hibernate使用了虚拟代理机制实现延迟加载,我们使用Session的load()方法加载数据或者一对多关联映射在使用延迟加载的情况下从一的一方加载多的一方,得到的都是虚拟代理,简单的说返回给用户的并不是实体本身,而是实体对象的代理。代理对象在用户调用getter方法时才会去数据库加载数据。但加载数据就需要数据库连接。而当我们把会话关闭时,数据库连接就同时关闭了。
11.谈一下你对继承映射的理解。 继承关系的映射策略有三种: ① 每个继承结构一张表(table per class hierarchy),不管多少个子类都用一张表。 ② 每个子类一张表(table per subclass),公共信息放一张表,特有信息放单独的表。 ③ 每个具体类一张表(table per concrete class),有多少个子类就有多少张表。
12.简述Hibernate常见优化策略。 ① 制定合理的缓存策略(二级缓存、查询缓存)。 ② 采用合理的Session管理机制。 ③ 尽量使用延迟加载特性。
13.hibernate的执行流程:
1) 初始化hibernate,构建configuration实例
2) 创建sessionfactory实例
3) 创建session实例,建立数据库连接
4) 创建transaction实例,开启一个事务
5) 利用session接口通过各种方法进行持久化操作
6) 提交事务
7) 关闭session,断开与数据库连接
13.Spring中Bean的作用域有哪些?
Singleton、proyotype、request、session、gobalSession
14.什么叫AOP(面向切面编程)?
AOP(Aspect-Oriented Programming)指一种程序设计范型,该范型以一种称为切面(aspect)的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(crosscutting concern)。
15.Spring中自动装配的方式有哪些? no:不进行自动装配,手动设置Bean的依赖关系。 byName:根据Bean的名字进行自动装配。 byType:根据Bean的类型进行自动装配。 constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器 的参数类型相同则可以自动装配,否则会导致错误。 autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。
16.什么是IoC和DI?
IoC,控制反转,是指在程序设计中,实例不再由调用者来创建,而是由Spring容器来创建。Spring容器会负责控制程序之间的关系,而不是由程序代码直接控制,这样控制权由应用代码转移到了外部容器,控制权发生了反转。Spring提供了两种IoC容器:BeanFactory和ApplicationContext。
DI,依赖注入,如果一个对象A需要使用另一个对象B才能实现某个功能,这时就可以说A对象依赖于B对象,而Spring容器在创建A对象时,会自动将A对象需要的B对象注入到A对象中,此过程就是依赖注入。
依赖注入的三种实现方式:设值注入、构造注入、接口注入。