一、什么是Java虚拟机(JVM)?为何Java被称做是“平台无关的编程语言”?java
Java虚拟机是一个能够执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。程序员
java的跨平台不是java源程序的跨平台 ,若是是这样,那么因此语言都是跨平台的, java源程序先通过javac编译器编译成二进制的.class字节码文件(java的跨平台指的就是.class字节码文件的跨平台,.class字节码文件是与平台无关的),.class文件再运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行,因此java所谓的跨平台就是在不一样平台上安装了不一样的jvm,而在不一样平台上生成的.class文件都是同样的,而.class文件再由对应平台的jvm解释成对应平台的机器码执行。 最后解释下机器码和字节码的区别: 一,机器码,彻底依附硬件而存在~而且不一样硬件因为内嵌指令集不一样,即便相同的0 1代码 意思也多是不一样的~换句话说,根本不存在跨平台性~好比~不一样型号的CPU,你给他个指令10001101,他们可能会解析为不一样的结果~ 二,咱们知道JAVA是跨平台的,为何呢?由于他有一个jvm,不论哪一种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~web
二、JDK和JRE的区别是什么?算法
线程与进程的区别概括:sql
a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。数据库
b.通讯:进程间通讯IPC,线程间能够直接读写进程数据段(如全局变量)来进行通讯——须要进程同步和互斥手段的辅助,以保证数据的一致性。编程
c.调度和切换:线程上下文切换比进程上下文切换要快得多。数组
d.在多线程OS中,进程不是一个可执行的实体。浏览器
七、建立线程有几种不一样的方式?你喜欢哪种?为何?安全
有4种方式能够用来建立线程:
继承Thread类
实现Runnable接口
应用程序可使用Executor框架来建立线程池
实现Callable接口
八、归纳的解释下线程的几种可用状态。
十二、如何确保N个线程能够访问N个资源同时又不致使死锁?
使用多线程的时候,一种很是简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。所以,若是全部的线程都是以一样的顺序加锁和释放锁,就不会出现死锁了。
1三、Java集合类框架的基本接口有哪些?
集合类接口指定了一组叫作元素的对象。集合类接口的每一种具体的实现类均可以选择以它本身的方式对元素进行保存和排序。有的集合类容许重复的键,有些不容许。
Java集合类提供了一套设计良好的支持对一组对象进行操做的接口和类。Java集合类里面最基本的接口有:
Collection:表明一组对象,每个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,而且能够包含重复元素。
Map:能够把键(key)映射到值(value)的对象,键不能重复。
1四、什么是迭代器(Iterator)?
Iterator接口提供了不少对集合元素进行迭代的方法。每个集合类都包含了能够返回迭代器实例的
一:快速失败(fail—fast)
在用迭代器遍历一个集合对象时,若是遍历过程当中对集合对象的结构进行了修改(增长、删除),则会抛出Concurrent Modification Exception。
原理:迭代器在遍历时直接访问集合中的内容,而且在遍历过程当中使用一个 modCount 变量。集合在被遍历期间若是结构发生变化,就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素以前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;不然抛出异常,终止遍历。
注意:这里异常的抛出条件是检测到 modCount!=expectedmodCount 这个条件。若是集合发生变化时修改modCount值恰好又设置为了expectedmodCount值,则异常不会抛出。所以,不能依赖于这个异常是否抛出而进行并发操做的编程,这个异常只建议用于检测并发修改的bug。
场景:java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程当中被修改)。
二:安全失败(fail—safe)
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
原理:因为迭代时是对原集合的拷贝进行遍历,因此在遍历过程当中对原集合所做的修改并不能被迭代器检测到,因此不会触发Concurrent Modification Exception。
缺点:基于拷贝内容的优势是避免了Concurrent Modification Exception,但一样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。
场景:java.util.concurrent包下的容器都是安全失败,能够在多线程下并发使用,并发修改。
1六、Java中的HashMap的工做原理是什么?
Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap须要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,而后把键值对存储在集合中合适的索引上。若是key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
1六、HashMap和Hashtable有什么区别?
HashMap和Hashtable都实现了Map接口,所以不少特性很是类似。可是,他们有如下不一样点:
HashMap容许键和值是null,而Hashtable不容许键或者值是null。
Hashtable是同步的,而HashMap不是。所以,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,所以,HashMap是快速失败的。另外一方面,Hashtable提供了对键的列举(Enumeration)。
通常认为Hashtable是一个遗留的类。
1七、数组(Array)和列表(ArrayList)有什么区别?何时应该使用Array而不是ArrayList?
下面列出了Array和ArrayList的不一样点:
Array能够包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,好比:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减小编码工做量。可是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
1八、ArrayList和LinkedList有什么区别?
ArrayList和LinkedList都实现了List接口,他们有如下的不一样点:
ArrayList是基于索引的数据接口,它的底层是数组。它能够以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每个元素都和它的前一个和后一个元素连接在一块儿,在这种状况下,查找某个元素的时间复杂度是O(n)。
相对于ArrayList,LinkedList的插入,添加,删除操做速度更快,由于当元素被添加到集合任意位置的时候,不须要像数组那样从新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,由于LinkedList为每个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
也能够参考ArrayList vs. LinkedList。
1九、Comparable和Comparator接口是干什么的?列出它们的区别。
类的方法(字节码...)
类名(Sring对象)
.class文件读到的常量信息
class对象相关的对象列表和类型列表 (e.g., 方法对象的array).
JVM建立的内部对象
JIT编译器优化用的信息
2七、串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上须要大概100M左右的内存)就足够了。
2八、在Java中,对象何时能够被垃圾回收?
当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就能够被回收了。
2九、Java中的两种异常类型是什么?他们有什么区别?
Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。不受检查的异常不须要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,而且不受检查的异常能够传播到方法或者是构造函数的外面。相反,受检查的异常必需要用throws语句在方法或者是构造函数上声明。这里有Java异常处理的一些小建议。
30、Java中Exception和Error有什么区别?
Exception和Error都是Throwable的子类。Exception用于用户程序能够捕获的异常状况。Error定义了不指望被用户程序捕获的异常。
3一、throw和throws有什么区别?
初始化参数指定的类,而且返回此类对应的Class 对象
3七、数据库链接池是什么意思?
数据库链接的创建、关闭资源消耗巨大。 传统数据库访问方式:一次数据访问对应一个物理链接,每次操做数据库都要打开关闭该物理链接,系统性能严重受损。 解决方案:数据库链接池。系统初始运行时,主动创建足够足够的链接,组成一个池,每次应用程序请求数据库链接时,无需从新打开链接,而是从池中取出已有的链接,使用完后,再也不关闭,而是归还。
3八、什么是Servlet?
Servlet是用来处理客户端请求并产生动态网页内容的Java类。Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。
3九、说一下Servlet的体系结构。
全部的Servlet都必需要实现的核心的接口是javax.servlet.Servlet。每个Servlet都必需要直接或者是间接实现这个接口,或者是继承javax.servlet.GenericServlet或者javax.servlet.http.HTTPServlet。最后,Servlet使用多线程能够并行的为多个请求服务。
40、解释下Servlet的生命周期。
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并建立了该Servlet的实例对象。若是是,则直接执行第④步,不然,执行第②步。
②装载并建立该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④建立一个用于封装HTTP请求消息的HttpServletRequest对象和一个表明HTTP响应消息的HttpServletResponse对象,而后调用Servlet的service()方法并将请求和响应对象做为参数传递进去。
⑤WEB应用程序被中止或从新启动以前,Servlet引擎将卸载Servlet,并在卸载以前调用Servlet的destroy()方法。
4一、如何知道是哪个客户端的机器正在请求你的Servlet?
ServletRequest类能够找出客户端机器的IP地址或者是主机名。getRemoteAddr()方法获取客户端主机的IP地址,getRemoteHost()能够获取主机名。
4二、HTTP响应的结构是怎么样的?
HTTP响应由三个部分组成:
状态码(Status Code):描述了响应的状态。能够用来检查是否成功的完成了请求。请求失败的状况下,状态码可用来找出失败的缘由。若是Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.SC_OK。
HTTP头部(HTTP Header):它们包含了更多关于响应的信息。好比:头部能够指定认为响应过时的过时日期,或者是指定用来给用户安全的传输实体内容的编码格式。如何在Serlet中检索HTTP的头部看这里。
主体(Body):它包含了响应的内容。它能够包含HTML代码,图片,等等。主体是由传输在HTTP消息中紧跟在头部后面的数据字节组成的。
4三、什么是cookie?session和cookie有什么区别?
cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户的状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再次请求该网站时,浏览器就会把请求地址和cookie一同给服务器。服务器检查该cookie,从而判断用户的状态。服务器还能够根据须要修改cookie的内容。 session是另外一种记录客户状态的机制。不一样的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session。客户端浏览器再次访问时只须要从该session中查找该客户的状态就能够了。 若是说cookie机制是经过检查客户身上的“通讯证”,那么session机制就是经过检查服务器上的“客户明细表”来确认客户身份。
4四、什么是HTTP隧道?
HTTP隧道是一种利用HTTP或者是HTTPS把多种网络协议封装起来进行通讯的技术。所以,HTTP协议扮演了一个打通用于通讯的网络协议的管道的包装器的角色。把其余协议的请求掩盖成HTTP的请求就是HTTP隧道。
4五、sendRedirect()和forward()方法有什么区别?
forward是服务器内部的跳转,浏览器的地址栏不会发生变化,同时能够把request和response传递给后一个请求。sendRedirect()是浏览器方面的跳转,要发送两次请求,地址栏也会发生变化,同时request和response也会发生变化,从新生成新的对象。
4六、什么是URL编码和URL解码?
URL编码是负责把URL里面的空格和其余的特殊字符替换成对应的十六进制表示,反之就是解码。
4七、面向对象软件开发的优势有哪些?
代码开发模块化,更易维护和修改。
代码复用。
加强代码的可靠性和灵活性。
增长代码的可理解性。
面向对象编程有不少重要的特性,好比:封装,继承,多态和抽象。
4八、封装的定义和好处有哪些?
一是用private把类的细节与外界隔离起来,从而实现数据项和方法的隐藏,而要访问这些数据项和方法惟一的途径就是经过类自己,类才有资格调用它所拥有的资源(方法,数据项属性等等)。因此第一个好处就是数据的安全性提升了。
二是经过隐藏隔离,只容许外部对类作有限的访问,开发者能够自由的改变类的内部实现,而无需修改使用该类的那些程序。只要那些在类外部就能被调用的方法保持其外部特征不变,内部代码就能够自由改变,各取所需,利于分工。