一、Java基础部分
1、Java虚拟机(JVM)工作基本原理。
答案:
在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。 可以说,Java虚拟机是Java语言的基础。它是Java技术的重要组成部分。Java虚拟机是一个抽象的计算机,和实际的计算机一样,它具有一个指令集并使用不同的存储区域。它负责执行指令,还要管理数据、内存和寄存器。Java解释器负责将字节代码翻译成特定机器的机器代码。
2、面向对象具有哪几种特性。
答案:
继承、封装、多态。
继承:就是子类对父类的继承,包含父类的方法,还可以添加自己独有的方法。
封装:Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。对象中封装了属性和方法,实现了代码的模块化和信息隐藏。
多态:方法名称允许相同,但根据传入参数的类型,个数不同形成多态的形式。
3、一般类、抽象类和接口有什么区别。
答案:
1、接口不能执行任何的方法,而抽象类可以。
2、类可以执行许多接口,但只有一个父类。
3、接口不是类分级结构的一部分。而没有联系的类可以执行相同的接口。
总结:简单来说在接口里面定义的方法必须全部是抽象方法,而抽象类里面不只能定义抽象方法也可以定义实例方法。
4、描述一下方法的重写和重载。
答案:
重载:指的是在同一个类中,同样的方法,有不同的实现方式。
重写:指的是在父类定义了的方法,由子类自己用自己的实现方式来实现。
5、单例模式有几大要素,如何定义一个单利模式,写出单例模式的实例。
答案:
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
三大要素:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
第一种形式:也是常用的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
第二种形式:
public class Singleton {
//在自己内部定义自己的一个实例,只供内部调用
private static Singleton instance = new Singleton();
private Singleton(){
//do something
}
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance(){
return instance;
}
}
6、在多线程中如何实现加锁机制,为什么要实现加锁。
答案:
因为保证线程中方法的安全性,保证只有一个线程可以被访问,不被多操作、重复操作、误操作。
加锁1(临界区-方法)
synchronized方法名{...}进入该方法时加锁
加锁2(临界区-代码块)
方法名{
...
synchronized{...}//进入该代码段时加锁
...
}
为什么要实现加锁:一个线程为某对象加锁后,便对该对象具有了监控权。
7、你是如何理解同步和异步。
答案:
同步:发送一个请求,等待返回,然后再发送下一个请求
异步:发送一个请求,不等待返回,随时可以再发送下一个请求
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
Java同步:
基本概念:每个Object都会有1个锁。同步就是串行使用一些资源。
多线程中对共享、可变的数据进行同步。
对于函数中的局部变量没必要进行同步。
对于不可变数据,也没必要进行同步。
多线程中访问共享可变数据才有必要。
Java异步:
它要能适应不同类型的请求。
要能同时并发处理多个请求,并能按一定机制调度。
有能力将调用的边界从线程扩展到机器间(RMI)。
分离过度耦合,如分离调用句柄(取货凭证)和真实数据的实现。分离调用和执行的过程,可以尽快地将调返回。
8、在多线程中如何实现同步机制,什么是死锁,如何解决死锁,多线程中如何进行通信协调。
答案:
使用synchronized实现同步机制。
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
避免Java线程死锁问题:
让所有的线程按照同样的顺序获得一组锁。这种方法消除了 X 和 Y 的拥有者分别等待对方的资源的问题。
将多个锁组成一组并放到同一个锁下。
将那些不会阻塞的可获得资源用变量标志出来。
最重要的是,在编写代码前认真仔细地设计整个系统。多线程是困难的,在开始编程之前详细设计系统能够帮助你避免难以发现Java线程死锁的问题。
9、String,StringBuffered和StringBuilder的区别。
答案:
string不可变的字符串
stringbuilder可变的字符串,非线程安全的
stringbuffer 可变的字符串,线程安全的
String的长度是不可变的,Stringbuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
StringBuffer是线程安全的。
StringBuilder不是线程安全的,它的运行速度比StringBuffer快。
Java代码在编译的时候,会自动把安全的String转换为StringBuilder来处理,以提高效率。
10、说出ArrayList,Vector, LinkedList的存储性能和特性,HashMap和HashTable的区别。
答案:
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
HashMap和HashTable都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类没有分类或者排序,它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
11、什么是处理流和节点流,什么字节流和字符流。
答案:
节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
处理流:使用节点流作为输入或输出。是使用一个已经存在的输入流或输出流连接创建的。
字节流与字符流主要的区别是它们的处理方式。
字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的。
但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化。
这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。
在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。
在从字节流转化为字符流时,实际上就是byte[]转化为String时,
public String(byte bytes[], String charsetName)
有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang
而在字符流转化为字节流时,实际上是String转化为byte[]时,byte[] String.getBytes(String charsetName) 也是一样的道理。
12、列举出常用的包装流对应的类。
答案:
字符流:FileReader类。FileWrite类
字节流:FileInputStream类。FileOutputStream类
DataOutputStream类提供了往各种输出流对象中写入各种类型的数据的方法。
13、字节流和字符流如何进行转换。
答案:
InputStreamReader(字节流,如System.in等),一般外套BufferedReader()。
14、网络层有几种协议,面向应用层的协议有哪些,列举三个,面向网络实现通讯功能是哪个协议。
答案:
应用层(Application Layer)表示层(Presentation Layer)会话层(Session Layer)传输层(Transport Layer)网络层(Network Layer)数据链路层(Data Link Layer)物理层(Physical Layer);
16、阐述一下TCP和UDP区别。
答案:
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
17、Java常用的模式有哪些,列举5种。
答案:
静态工厂模式、单例模式、MVC、代理、适配器模式、访问者模式、解释器模式
Java 中的23 种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),Observer(观察者模式), State(状态模式), Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
二、数据库部分
用一个 sql语句完成下列查询
学生 ‘student’及其属性sid(学号)sname(姓名)
课程 ‘course’及其属性cid(课程号)cname(课程名称)
选修记录 ‘sc’及其属性sid( 学号) cid(课程号)scscore(选修成绩)
查询至少选修了当前学生学号为1选修的全部课程的学生学号及姓名;
select s.sid,s.sname
from(select sid,count(*) as num from stucou where cid in (select cid from stucou where sid = 1) group by sid) t,student s
where num = (select count(*) from stucou where sid =1) and s.sid=t.sid order by s.sid
选修成绩在平均分以下超过两门的全部学生及全部课程成绩;
select sc.sid,sc.score
from (
select sid, count(*) as nums from stucou where score<(select avg(score) as avgscore from stucou)
group by sid
) t,stucou sc
where nums>2 and sc.sid=t.sid
删除学生表中重复的记录;
delete from student s2 where rowid not in (
select max(s1.rowid) from student s1 where s1.sname=s2.sname and s1.age=s2.age
);
或
delete from student s2 where s2.sid not in (
select max(s1.sid) from student s1 where s1.sname=s2.sname and s1.age=s2.age
);
现做select操作检验一下后再删除
查询每门课程的平均成绩 ,结果按照平均成绩升序排列,平均成绩相同时,按照课程号降序排列。
select cid ,avg(score) as avgscore from stucou group by cid order by avgscore,cid desc
三、Web部分
1、Jsp有哪些内置对象,至少写6种
答案:
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外
2、Forward和redirect的区别
答案:
Forward(转发)是服务器行为,redirect(重定向)是客户端行为
3、Xml文档解析的组件技术有哪些,你最擅长的是哪种?
答案:
XML解析技术大致可分为四类:
1)面向文档的流式解析;
2)面向文档的对象式解析;
3)面向文档的指针式解析;
4)面向应用的对象式解析;
4、说一说Servlet的生命周期
答案:
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
5、谈谈struts1和struts2的区别,以及struts2的工作原理
答案:
1、配置文件格式不同
2、struts1有from类和action类,属性封装from类里,在struts2里只有action类,属性封装action类里
3、页面调用是struts1 是*.do struts2 是*.action
4、struts1是单例的在内存中只有一个实例存在,struts2是每个请求都会产生一个实例
struts2的工作原理
1.客户端发出一个指向servlet容器的请求;
2.这个请求会经过图中的几个过滤器,最后会到达FilterDispatcher过滤器。
3.过滤器FilterDispatcher是struts2框架的心脏,在处理用户请求时,它和请求一起相互配合访问
6、Struts2中拦截器和一般的过滤器有哪些区别
答案:
1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
5、在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
7、阐述一下hibernate的工作原理以及hibernate自身的优缺点
答案:
工作原理:读取hql语句 然后根据数据库方言转变成sql语句然后使用jdbc执行转变后的数据库
优点:Hibernate最大的优点就是对象话。将SQL和类做了分离。其次优点就是可以使用Hibernate做DB的优化。
缺点:Hibernate的最大缺点就是配置文件比较的烦琐。其次的缺点就复杂和大数量数据的查询不适使用该框架。
8、描述一下hibernate二级缓存使用的优缺点和注意事项
答案:
优点:减少与数据库交互,减少服务器压力和内存开销
缺点:重要的数据和易更改的数据不适合放在二级缓存中,因为可能会发生无法读取真实数据
注意事项:
9、在使用hibernate进行ORM时,在数据库设计层面上针对不同数据库如何做到通用。
答案:
使用主键生成器策略,表示了一个主键生成器,每个主键都必须定义相应的主键生成策略。它用来为持久化类实例生成唯一的标识
如果是使用不同数据库,通常使用为native
主键生成策略
1. assigned数据类型不限、保存前必须赋值
2. identity(重点掌握) 必须是有标识列 一般用来连接SQL和MySQL数字,无需赋值
3. sequence(重点掌握) 这是序列 一般连接Oracle
数字,无需赋值, 默认使hibernate_sequence这个序列,也可以通过sequence参数赋值
insert into t_student(sid,sname) values(hibernate_sequence.nextval,?)
insert into t_student(sid,sname) values(seq_abc.nextval,?)
4. increment数字,无需赋值
5. hilo数字,无需赋值,需要额外提供一个表,还需要在表中定义一个整数类型的字段,并插入一条记录。使用时需要指定3个参数
table:表示hilo算法需要引用的表名(默认表名为hibernate_unique_key)
column:表示hilo算法需要引用的列名(默认列名为next_hi)
max_lo:表示hilo算法需要的变化值(可以随便给,一般设置为1)
6. uuid/uuid.hex (是由容器自动生成的一个32位的字符串,.hex代表的是十六进制)32位的字符串,无需赋值,
7. native(重点掌握)等于identity+sequence
8. foreign(主要用在一对一关系的映射中)
10、Spring中IOC是什么意思,AOP是什么意思,使用spring有什么好处
答案:
ioc是控制反转
aop是面向切面编程
好处:
spring核心概念为IOC以及AOP,IOC能够让使各个bean之间进行自动注入,不需要开发人员写代码注入;
另外,AOP使用代理机制降低了组件间的耦合度;方便扩展开发。总之spring的核心出发点就是降低程序复杂度、耦合度、隔离变化点
11、Spring中通过什么机制来管理事务的,管理器是什么。
答案:
spring中通过aop是面向切面编程机制来管理事物,管理器是事务管理器。