01 基础篇
JVM内存结构
1、堆、栈、方法区、直接内存、堆和栈区别
一、定义
1)堆:先进先出,堆区是被所有线程所共享的,堆放在二级缓存中,调用对象的速度相对慢一些,生命周期是由虚拟机的垃圾回收机制制定。
2)栈:先进后出,每个线程都包含一个栈区,栈存放在一级缓存中,存取速度快。
3)方法区:用来存放方法和static变量
二、存储的数据类型
1)堆用来存储new出来的对象和数组
2)栈用来存储基本类型变量和对象的应用变量的地址
3)方法区存储方法和static变量
三、优却点
1)堆的优点--可以动态的分配内存大小,生命周期不确定。缺点-速度慢
2)栈的优点--速度快,缺点--存在栈中的数据大小和生命周期必须是明确的,缺少灵活性。
四、直接内存
直接内存不是虚拟机运行数据区的一部分,在jdk1.4中新添加NIO类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它可以使用native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块内存的应用进行操作
直接内存与堆内存比较
1)直接内存申请空间耗费更高的性能,当频繁申请到一定量时尤为明显
2)直接内存IO读写的性能要优于普通的堆内存,在多次读写操作的情况下差异明显
Java内存模型
2、内存可见性、重排序、顺序一致性、volatile、锁、final
1)原子性:不可再分,原子操作是不能被线程中断的操作。
2)指令重排序:volatile关键字的另一个作用是:它禁止了指令重排序(re-order),编译器和cpu为了提高指令的执行效率可能会进行指令重排序,禁止指令重排序虽然导致编译器和cpu无法对一些指令进行可能的优化,但是它某种程度上让代码执行看起来更符合我们的期望。
锁:锁提供了两种主要的特性:互斥和可见性
a、互斥:一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样一次就只有一个线程能够使用该共享数据。
b、可见性:它必须确保释放锁之前对共享数据做出的更改对于随后获得该说的另一个线程是可见的,如果没有同步机制提供的这种可见性保证,线程看到的共享比爱良可能是修改前的值或不一直的值。
3)在Java中,为了保证多线程读写数据时保证数据的一致性,可以采用两种方式:
同步:如用synchronized关键字,或者使用锁对象
使用volatile关键字:他能够使变量在值发生改变时能尽快的让其他线程知道
其他
3、java中的comparator接口简单描述一下?
comparator是比较器接口,如果我们需要控制某个类的次序并且该类本身不支持排序,那么可以建立一个类比较器进行排序,一个类如何实现他的接口,他一定要实现int compare(T 01,TO2)函数
4、String类为什么是final的?
主要考虑到安全和效率的缘故,若String允许被继承,那么他的高度使用率可能会降低程序的性能,因此String被定义成了final
5、什么是序列化及用途,什么时候使用序列化?
序列化是指对象转换为字节序列的过程成为对象的序列化;而反序列化是指把字节序列恢复为对象的过程为对象的反序列化。
对象的序列化主要有两种用途:
1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2)在网络上传送对象的字节序列。
6、用简介的话描述一下关于Spring的IOC与AOP
IOC:控制反转,是一中设计模式,一层含义是控制权的转移;由传统的在程序中控制依赖转移到由容器来控制;
依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系,他们依赖关系只在使用的时候才建立。
AOP:面向切面,是一中编程思想,OOP的延续,将系统中非核心的业务提取出来,进行单独处理。比如事物,日志,安全等。
7、Java虚拟机内存的堆区,栈,方法区
堆区:
1)存储的全部是对象,每个对象都包含一个与之对应的class的信息。
2)jvm只有一个堆区(head)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
3)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
栈区:
1)每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用,对象都存放在堆区
2)每个栈中的数据都是私有的,其他炸不能访问。
3)栈分为3个部分:基本类型变量区,执行环境上下文,操作指令区
4)由编译器自动分配释放,存放函数的参数值,局部变量的值等。
8、Java中的HashMap和HashTable的区别?
HashMap是HashTable的轻量级实现。
区别:HashMap允许空键值,由于是非线程安全的,所以效率上可能高于HashTable,HashTable不允许。
HashTable继承Dictionary类,而HashMap是java1.2引进的Map interface的一个实现。
HashTable的方法是synchronize的,而HashMap不是,在多个线程访问HashTable时,不需要自己为他的方法的实现同步,而HashMap就必须为之提供外同步
9、cookie和session的区别有哪些?
cookie数据存放在客户的浏览器上,而session数据放在服务器上;
cookie分发是通过扩展HTTP协议来实现的
服务器通过HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie不是很安全,可以分析存放本地的cookie并进行cookie欺骗,处于安全考虑应当使用session;
session会在一定时间内保存在服务器上,当访问增多时会比较影响服务器的性能,处于考虑减轻服务器性能方面,应当使用cookie;
10、Java面向对象的特征有哪些方面?
1)抽象
2)继承
3)封装
4)多态性
12、写一个Singleton单例模式
public class Singleton{
private static Singleton instance=new Singleton();
public static Singleton getInstance(){
return instance;
}
}
}
13、JSP九大内置对象和作用是什么?
request:代表是来自客户端的请求
response:代表的是对客户端的响应
pageContext:对象可以称作“页面上下文”对象,代表的是当前页面运行的一些属性。
session:代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,
application:对象负责提供应用程序在服务器中运行时的一些全局信息,常用的方法有getMimeType和getRealPath
out:对象代表了向客户端发送数据的对象,与“response”对象不同,通过“out”对象发送的内容将是浏览器需要显示的内容。
config:对象提供一些配置信息,常用的方法有getInitParameter和getInitParameterNames,以获得servlet初始化的参数
page:对象代表了正在运行的由JSP文件产生的类对象,不建议一般读者使用。
exception:对象则代表了JSP文件运行所产生的例外对象,此对象不能在一般JSP文件中直接使用。
14、运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,
java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
15、说出servlet的生命周期
servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法等,当服务器决定将实例销毁的时候调用器destroy方法。
16、Vector
Vector由于使用了synchronized方法(线程安全),性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快
17、Collections
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现是各种结合的搜索,排序,线程安全化等操作。
18、请说出你所知道的线程同步的方法
wait():使一个线程处于等待状态,并且释放所持有的对象的lock
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterrupedException异常
notify():唤醒一个处于等待状态的线程,注意的是调用方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让他们竞争。
19、Overloaded的方法是否可以改变返回值的类型?
Overloaded的方法可以改变返回值的类型
20、forward和redirect两者有什么区别?
forward:发送请求是浏览器中的地址路径是不变的。
redirect:地址会改变。
21、说说数据连接池的工作机制是什么?
J2ee服务器启动时会建立一定数量的池连接。并一直维持不少于此数目的连接,客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其标记为忙,如果当前没有空闲的连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置参数决定。当使用的池连接调用完成后,池驱动程序将此链接标记为空闲,其他调用就可以使用这个连接。
22、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?==还是equals(),他们有何区别?
Set里元素是不能重复的,是使用iterator()方法来区分重复与否的,equals()是判断两个set是否相等。
23、java中异常处理机制的简单原理和应用?
当java程序违反了java的语义规则时,java虚拟机将发生的错误表示一个异常
1)java类库内置的语义检查,
2)java允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择何时用throw关键字引发异常。
24、Servlet执行时一般实现那几个方法?
init() 1次
getServletConfig()
getServletInfo()
service()
destory()
25、stop()和suspend()方法为何不推荐使用修饰同步方法?
stop()不安全,他会解除由线程获取的所有锁定。
suspend()方法容易发生死锁,调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定,,此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行,对任何线程来说,如果他们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。
26、java有几种类型的流?JDK为每种类型的流提供了一些抽象了以供继承,请说出他们分别是哪些类?
字节流,字符流。
字节流继承于InputStream OutputStream,字符流继承于InputStreamReader,OutputStreamWriter,
27、抽象类的方法是否可同时static,是否可同时native,是否可同时是synchronized?
抽象方法只能被public或protected修饰。其他修饰符不可以。
28、java中的抽象类有没有对象?
抽象类可以声明对象,但是不能使用自身的构造方法创建对象,但是可以使用子类的构造方法进行创建。
29、简述MVC的有什么优缺点?
优点:开发效率高,松耦合,程序灵活性和扩展性好、
代码重用度更高。
缺点:代码复杂度增加,代码数量增加,不适合开发小型项目。
30、你能说出TCP/IP的7层协议吗?
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
31、在connection类中提供了3个控制事务的方法,分别是:
setAutoCommit(boolean bln):
conn.setAutoCommit(false)
commit():
rollback():
32、请简述什么是流?
流是指一连串流动的字符,是以先进先出的方式发送和接受数据的通道,流分为输入流和输出流,输入输出是相对于计算机内存来说的,如果数据输入到内存,则成为输入流,如果从内存中流出则成为输出流
33、java.io.Reader和java.io.InputStream区别?
java.io.Reader和java.io.InputStream组成了java输入类。Reader用于读入16位字符,也就是Unicode编码的字符;而InputStream用于读入ASCII字符和二进制数据。
34、AarryList和Vector的区别?
两方面:
1)同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的。
2)数据增长:当需要增长时,Vector默认增长为原来的一倍,而ArrayList却是原来的一半。
35、HashTable和HashMap?
1)HashTable是线程安全的,HashMap是线程不安全的。
Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些,在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法获取一个线程安全的集合(Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类,这个类实现了Map接口,在调用方法时使用synchroinzed来保证线程同步)
2)HashMap可以使用null作为空值,而HashTable则不允许null作为null值
3)HashMap是对Map接口的实现,HashTable实现Map接口和Dictionary抽象类
4)HashMap的初始容量为16,Hashtable初始化容量为11,两者的填充因子默认都是0.75
5)HashSet不是key value结构,仅仅是存储不重复的元素