BAT的一些题

11四、java中实现多态的机制是什么

答:重写,重载。方法的重写Overriding和重载Overloading是Java多态性的不一样表现。 
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。若是在子类中定义某方法与其父类有相同的名称和参数,咱们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被”屏蔽”了。 
若是在一个类中定义了多个同名的方法,它们或有不一样的参数个数或有不一样的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是能够改变返回值的类型。css

11五、静态的多态和动态的多态的区别

答:静态的多态: 即为重载 ;方法名相同,参数个数或类型不相同。(overloading)。动态的多态: 即为重写;子类覆盖父类的方法,将子类的实例传与父类的引用调用的是子类的方法 实现接口的实例传与接口的引用调用的实现类的方法。html

11六、extends和implement的不一样

答:extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,可是能够用接口来实现,这样就要用到implements,继承只能继承一个类,但implements能够实现多个接口,用逗号分开就好了,好比 class A extends B implements C,D,E。前端

11七、适配器模式与桥梁模式的区别

答:适配器模式把一个类的接口变换成客户端所期待的另外一种接口,从而使本来因接口不匹配而没法在一块儿工做的两个类可以在一块儿工做。又称为转换器模式、变压器模式、包装模式(把已有的一些类包装起来,使之能有知足须要的接口)。适配器模式的用意是将接口不一样而功能相同或者相近的两个接口加以转换,包括适配器角色补充一些源角色没有但目标接口须要的方法。就像生活中电器插头是三相的,而电源插座是两相的,这时须要一个三相变两相的转换器来知足。 
好比,在Java I/O库中使用了适配器模式,象FileInputStream是一个适配器类,其继承了InputStrem类型,同时持有一个对FileDiscriptor的引用。这是将一个FileDiscriptor对象适配成InputStrem类型的对象形式的适配器模式。StringReader是一个适配器类,其继承了Reader类型,持有一个对String对象的引用。它将String的接口适配成Reader类型的接口。等等。 
桥梁模式的用意是要把实现和它的接口分开,以便它们能够独立地变化。桥梁模式并非用来把一个已有的对象接到不相匹配的接口上的。当一个客户端只知道一个特定的接口,可是又必须与具备不一样接口的类打交道时,就应该使用桥梁模式。 
好比,JDBC驱动器就是一个桥梁模式的应用,使用驱动程序的应用系统就是抽象化角色,而驱动器自己扮演实现化角色。应用系统和JDBC驱动器是相对独立的。应用系统动态地选择一个合适的驱动器,而后经过驱动器向数据库引擎发出指令就能够访问数据库中的数据。java

11八、抽象类可否被实例化 ?抽象类的做用是什么?

答:抽象类不能被实例化;抽象类一般不是由程序员定义的,而是由项目经理或模块设计人设计抽象类的缘由一般是为了规范方法名 抽象类必需要继承,否则无法用,做为模块设计者,能够把让底层程序员直接用得方法直接调用,而一些须要让程序员覆盖后本身作得方法则定义称抽象方法。mysql

120、String,StringBuffer, StringBuilder 的区别是什么?String为何是不可变的?

答: 
一、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后二者的字符内容可变,而前者建立后内容不可变。 
二、String不可变是由于在JDK中String类被声明为一个final类。 
三、StringBuffer是线程安全的,而StringBuilder是非线程安全的。 
ps:线程安全会带来额外的系统开销,因此StringBuilder的效率比StringBuffer高。若是对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。linux

12一、Vector,ArrayList, LinkedList的区别是什么?

答: 
一、Vector、ArrayList都是以相似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。 
二、List中的元素有序、容许有重复的元素,Set中的元素无序、不容许有重复元素。(TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不容许放入null值,HashSet 是哈希表实现的,HashSet中的数据是无序的,能够放入null,但只能放入一个null,二者中的值都不能重复) 
三、Vector线程同步,ArrayList、LinkedList线程不一样步。 
四、LinkedList适合指定位置插入、删除操做,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操做。 
五、ArrayList在元素填满容器时会自动扩充容器大小的0.5n+1,而Vector则是2n,所以ArrayList更节省空间。程序员

12二、HashTable, HashMap,TreeMap区别?

答: 
一、HashTable线程同步,HashMap非线程同步。 
二、HashTable不容许<键,值>有空值,HashMap容许<键,值>有空值。 
三、HashTable使用Enumeration,HashMap使用Iterator。 
四、HashTable中hash数组的默认大小是11,增长方式的old*2+1,HashMap中hash数组的默认大小是16,增加方式必定是2的指数倍。 
五、TreeMap可以把它保存的记录根据键排序,默认是按升序排序。web

12三、Tomcat,Apache,JBoss,Weblogic的区别?

答: 
Apache:全球应用最普遍的http服务器,免费,出自apache基金组织 
Tomcat:应用也算很是普遍的web服务器,支持部分j2ee,免费,出自apache基金组织 
JBoss:开源的应用服务器,比较受人喜好,免费(文档要收费) 
Weblogic:应该说算是业界第一的app server,所有支持j2ee1.4,对于开发者,有无偿使用一年的许可证。面试

12四、GET,POST区别?

答:基础知识:Http的请求格式以下。算法

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">request</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">line</span>></span>:主要包含三个信息:一、请求的类型(GET或POST),二、要访问的资源(如\res\img\a.jif),三、Http版本(http/1.1)
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">header</span>></span>:用来讲明服务器要使用的附加信息
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">blank</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">line</span>></span>:这是Http的规定,必须空一行
[<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">request-body</span>></span>]:请求的内容数据</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

区别: 
一、Get是从服务器端获取数据,Post则是向服务器端发送数据。 
二、在客户端,Get方式经过URL提交数据,在URL地址栏能够看到请求消息,该消息被编码过;Post数据则是放在Html header内提交。 
三、对于Get方式,服务器端用Request.QueryString获取变量的值;对用Post方式,服务器端用Request.Form获取提交的数据值。 
四、Get方式提交的数据最多1024字节,而Post则没有限制。 
五、Get方式提交的参数及参数值会在地址栏显示,不安全,而Post不会,比较安全。

12五、Session, Cookie区别

答: 
一、Session由应用服务器维护的一个服务器端的存储空间;Cookie是客户端的存储空间,由浏览器维护。 
二、用户能够经过浏览器设置决定是否保存Cookie,而不能决定是否保存Session,由于Session是由服务器端维护的。 
三、Session中保存的是对象,Cookie中保存的是字符串。 
四、Session和Cookie不能跨窗口使用,每打开一个浏览器系统会赋予一个SessionID,此时的SessionID不一样,若要完成跨浏览器访问数据,能够使用Application。 
五、Session、Cookie都有失效时间,过时后会自动删除,减小系统开销。

12六、Servlet的生命周期

答:大体分为4部:Servlet类加载–>实例化–>服务–>销毁 
一、Web Client向Servlet容器(Tomcat)发出Http请求。 
二、Servlet容器接收Client端的请求。 
三、Servlet容器建立一个HttpRequest对象,将Client的请求信息封装到这个对象中。 
四、Servlet建立一个HttpResponse对象。 
五、Servlet调用HttpServlet对象的service方法,把HttpRequest对象和HttpResponse对象做为参数传递给HttpServlet对象中。 
六、HttpServlet调用HttpRequest对象的方法,获取Http请求,并进行相应处理。 
七、处理完成HttpServlet调用HttpResponse对象的方法,返回响应数据。 
八、Servlet容器把HttpServlet的响应结果传回客户端。 
其中的3个方法说明了Servlet的生命周期: 
一、init():负责初始化Servlet对象。 
二、service():负责响应客户端请求。 
三、destroy():当Servlet对象推出时,负责释放占用资源。

12七、HTTP 报文包含内容

答:主要包含四部分: 
一、request line 
二、header line 
三、blank line 
四、request body

12八、Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入

答: 
一、PreparedStatement支持动态设置参数,Statement不支持。 
二、PreparedStatement可避免如相似 单引号 的编码麻烦,Statement不能够。 
三、PreparedStatement支持预编译,Statement不支持。 
四、在sql语句出错时PreparedStatement不易检查,而Statement则更便于查错。 
五、PreparedStatement可防止Sql注入,更加安全,而Statement不行。 
什么是SQL注入: 
经过sql语句的拼接达到无参数查询数据库数据目的的方法。 
如将要执行的sql语句为 select * from table where name = “+appName+”,利用appName参数值的输入,来生成恶意的sql语句,如将[‘or’1’=’1’] 传入可在数据库中执行。 
所以能够采用PrepareStatement来避免Sql注入,在服务器端接收参数数据后,进行验证,此时PrepareStatement会自动检测,而Statement不 行,须要手工检测。

12九、sendRedirect, foward区别

答:转发是服务器行为,重定向是客户端行为。 
转发过程:客户浏览器发送http请求->web服务器接受此请求->调用内部的一个方法在容器内部完成请求处理和转发动做->将目标资源 发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其余的web路径上去,中间传递的是本身的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感受不到服务器作了转发的。转发行为是浏览器只作了一次访问请求。 
重定向过程:客户浏览器发送http请求->web服务器接受后发送302状态码响应及对应新的location给客户浏览器->客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址->服务器根据此请求寻找资源并发送给客户。在这里location能够重定向到任意URL,既然是浏览器从新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的 路径,客户能够观察到地址的变化的。重定向行为是浏览器作了至少两次的访问请求的。

130、反射讲一讲,主要是概念,都在哪须要反射机制,反射的性能,如何优化

答:反射机制的定义:是在运行状态中,对于任意的一个类,都可以知道这个类的全部属性和方法,对任意一个对象都可以经过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象方法的功能称为java的反射机制。 
反射的做用: 
一、动态地建立类的实例,将类绑定到现有的对象中,或从现有的对象中获取类型。 
二、应用程序须要在运行时从某个特定的程序集中载入一个特定的类

13一、关于Cache(Ehcache,Memcached)

http://xuezhongfeicn.blog.163.com/blog/static/2246014120106144143737/

13三、画出最熟悉的三个设计模式的类图

13四、写代码分别使得JVM的堆、栈和持久代发生内存溢出(栈溢出)

一个死循环 递归调用就 能够栈溢出。建好多对象实例放入ArrayList里能够堆溢出。持久代溢出能够新建不少 ClassLoader 来装载同一个类文件。 
由于方法区是保存类的相关信息的,因此当咱们加载过多的类时就会致使方法区溢出。CGLIB一样会缓存代理类的Class对象,可是咱们能够经过配置让它不缓存Class对象,这样就能够经过反复建立代理类达到使方法区溢出的目的。

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">package <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">com</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cdai</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.jvm</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.overflow</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
import java<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.lang</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.reflect</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Method</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
import net<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sf</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cglib</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.proxy</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Enhancer</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
import net<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sf</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cglib</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.proxy</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MethodInterceptor</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
import net<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.sf</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cglib</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.proxy</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MethodProxy</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
public class MethodAreaOverflow2 {
    static class OOMObject {
    }
    public static void main(String[] args) {
        while (true) {
            Enhancer enhancer = new Enhancer()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
            enhancer<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setSuperclass</span>(OOMObject<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.class</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
            enhancer<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setUseCache</span>(false)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
            enhancer<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setCallback</span>(new MethodInterceptor() {
                @Override
                public Object intercept(Object obj, Method method,
                        Object[] args, MethodProxy proxy) throws Throwable {
                    return method<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.invoke</span>(obj, args)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
                }
            })<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
            OOMObject proxy = (OOMObject) enhancer<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.create</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
            System<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.out</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.println</span>(proxy<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getClass</span>())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        }
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li></ul>

堆溢出比较简单,只需经过建立一个大数组对象来申请一块比较大的内存,就能够使堆发生溢出。

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">package</span> com.cdai.jvm.overflow;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">HeapOverflow</span> {</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> MB = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span> * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span>;
    SuppressWarnings(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"unused"</span>)
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[] bigMemory = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span> * MB];
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

栈溢出也比较常见,有时咱们编写的递归调用没有正确的终止条件时,就会使方法不断递归,栈的深度不断增大,最终发生栈溢出。

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">package com.cdai.jvm.overflow;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> StackOverflow {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> stackDepth = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">stackOverflow</span>() {
        stackDepth++;
        stackOverflow();
    }

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {
            stackOverflow();
        } 
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (Exception e) {
            System.err.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Stack depth: "</span> + stackDepth);
            e.printStackTrace();
        }
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>

13五、hashmap的内部实现机制,hash是怎样实现的,何时rehash

13六、java的内存管理

13七、分布式缓存的内存管理,如何管理和释放不断膨胀的session,memcache是否熟悉

13八、oralce的底层管理(怎样让查询快,插入慢)

13九、java底层是怎样对文件操做的

140、研究了哪些框架的源码

14一、并发问题,锁,怎么处理死锁,脏数据处理

14一、性能问题

14二、equals和hashcode这些方法怎么使用的

14三、java的NIO

http://lvwenwen.iteye.com/blog/1706221

14四、先从项目模块入手,详细问项目模块是怎么实现的,遇到的问题怎么解决(必定要说本身作过的,真实的状况)

14五、sql语句优化怎么作的,建索引的时候要考虑什么

14六、spring ioc你的理解,ioc容器启动的过程是什么样的,什么是ioc,aop 你我的的理解是什么

14七、jms 你我的的理解,就是消息接收完怎么处理,介质处理(为何重启mq就能恢复)

解答:http://setting.iteye.com/blog/1097767

14八、sychronized 机制 加了static 方法的同步异同,A 调用 B,A执行完了,B没执行完,怎么解决这个同步问题

14九、servlet 默认是线程安全的吗,为何不是线程安全的

解答:不是 :url:http://westlifesz.iteye.com/blog/49511 
http://jsjxqjy.iteye.com/blog/1563249 
http://developer.51cto.com/art/200907/133827.htm

150、spring里面的action 默认是单列的,怎么配置成多列?

socpe =proptype?

15一、socket 是用的什么协议,tcp协议链接(握手)的过程是什么样的,socket使用要注意哪些问题

解答:tcp协议,

15二、数据库链接池设置几个链接,是怎么处理的,说说你的理解

15三、自定义异常要怎么考虑呢,checked的异常跟 unchecked 的异常的区别

15四、线程池是怎么配置的,怎么用的,要注意哪些,说下我的的理解

15五、tomact 里session共享是怎么作到的,

解答:http://zhli986-yahoo-cn.iteye.com/blog/1344694

15六、服务器集群有搭建过吗

解答:http://www.iteye.com/topic/1119823

15七、阿里B2B北京专场java开发面试题(2011.10.29)

http://yueyemaitian.iteye.com/blog/1387901 
jvm的体系结构,画了以后说各个部分的职责,并扯到运行期优化。

15八、文件拷贝,把一个文件的内容拷贝到另一个文件里

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> java.io.File;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> java.io.FileInputStream;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> java.io.FileOutputStream;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> java.io.InputStream;


<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">FileCopy</span> {</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args)
    {
          <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span>
            {
                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> bytesum = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> byteread = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
                File oldfile = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> File( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"c:/test.txt"</span>);
                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ( oldfile.exists() )
                { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//文件存在时</span>
                    InputStream inStream = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileInputStream( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"c:/test.txt"</span> ); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//读入原文件</span>
                    FileOutputStream fs = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileOutputStream( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"d:/test.txt"</span> );
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[] buffer = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[ <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1444</span> ];
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> length;
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ( ( byteread = inStream.read( buffer ) ) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> )
                    {
                        bytesum += byteread; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//字节数 文件大小</span>
                        System.out.println( bytesum );
                        fs.write( buffer, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, byteread );
                    }
                    inStream.close();
                }
            }
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> ( Exception e )
            {
                System.out.println( <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"复制单个文件操做出错"</span> );
                e.printStackTrace();

            }
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li></ul>

15九、HashMap遍历的几种方法

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 第一种:效率高,之后必定要使用此种方式!</span>
  <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Map</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">map</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> HashMap();
  Iterator iter <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">map</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>entrySet()<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>iterator();
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (iter<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>hasNext()) {
  <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Map</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>Entry entry <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> (<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Map</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>Entry) iter<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>next();
  Object key <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> entry<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>getKey();
  Object val <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> entry<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>getValue();
  }
  
<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 第二种:效率低,之后尽可能少使用!</span>
  <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">Map</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">map</span> <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">new</span> HashMap();
  Iterator iter <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">map</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>keySet()<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>iterator();
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (iter<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>hasNext()) {
  Object key <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> iter<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>next();
  Object val <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">map</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>get(key);
  }  </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

160、写一个类,链接数据库并执行一条sql

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">import java.sql.*;

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> SqlDemo{
     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {
            String url = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"jdbc:mysql://localhost/mydb"</span>;
            String user = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"root"</span>;
            String pwd = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"123456"</span>;

            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加载驱动,这一句也可写为:Class.forName("com.mysql.jdbc.Driver");</span>
            Class.forName(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"com.mysql.jdbc.Driver"</span>).newInstance();
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//创建到MySQL的链接</span>
            Connection conn = DriverManager.getConnection(url, user, pwd);

            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//执行SQL语句</span>
            Statement stmt = conn.createStatement();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//建立语句对象,用以执行sql语言</span>
            ResultSet rs = stmt.executeQuery(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"select * from student"</span>);

            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//处理结果集</span>
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (rs.next()) {
                String name = rs.getString(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"name"</span>);
                System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(name);
            }
            rs.close();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//关闭数据库</span>
            conn.close();
        } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (Exception ex) {
            System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Error : "</span> + ex.toString());
        }
    }     
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li></ul>

16一、JVM性能调优,都作了什么?

答: 
1).控制GC的行为。GC是一个后台处理,可是它也是会消耗系统性能的,所以常常会根据系统运行的程序的特性来更改GC行为 
2).控制JVM堆栈大小。通常来讲,JVM在内存分配上不须要你修改,(举例)可是当你的程序新生代对象在某个时间段产生的比较多的时候,就须要控制新生代的堆大小.同时,还要须要控制总的JVM大小避免内存溢出。 
3).控制JVM线程的内存分配。若是是多线程程序,产生线程和线程运行所消耗的内存也是能够控制的,须要经过必定时间的观测后,配置最优结果。

16二、TCP头部都什么内容

这里写图片描述

 源端口和目的端口:各占2字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要经过端口才能实现。

 序号:占4字节.TCP 链接中传送的数据流中的每个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号

 确认号:占 4 字节,是指望收到对方的下一个报文段的数据的第一个字节的序号

 数据偏移/首部长度:占4位,它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远.“数据偏移”的单位是32位字(以 4 字节为计算单位)

 保留:占6位,保留为从此使用,但目前应置为0

 紧急URG:当 URG=1 时,代表紧急指针字段有效.它告诉系统此报文段中有紧急数据,应尽快传送(至关于高优先级的数据)

 确认ACK:只有当 ACK=1 时确认号字段才有效.当 ACK=0 时,确认号无效

 PSH(PuSH):接收 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程,而再也不等到整个缓存都填满了后再向上交付。

 RST (ReSeT):当 RST=1 时,代表 TCP 链接中出现严重差错(如因为主机崩溃或其余缘由),必须释放链接,而后再从新创建运输链接。

 同步 SYN:同步 SYN = 1 表示这是一个链接请求或链接接受报文

 终止 FIN:用来释放一个链接.FIN=1 代表此报文段的发送端的数据已发送完毕,并要求释放运输链接

 检验和:占 2 字节.检验和字段检验的范围包括首部和数据这两部分.在计算检验和时,要在 TCP 报文段的前面加上 12 字节的伪首部

 紧急指针:占 16 位,指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)

 选项:长度可变.TCP 最初只规定了一种选项,即最大报文段长度 MSS.MSS 告诉对方 TCP:“个人缓存所能接收的报文段的数据字段的最大长度是 MSS 个字节.” [MSS(Maximum Segment Size)是 TCP 报文段中的数据字段的最大长度.数据字段加上 TCP 首部才等于整个的 TCP 报文段]

 填充:这是为了使整个首部长度是4 字节的整数倍

 其余选项:

 窗口扩大:占3字节,其中有一个字节表示移位值 S.新的窗口值等于TCP 首部中的窗口位数增大到(16 + S),至关于把窗口值向左移动 S 位后得到实际的窗口大小

 时间戳:占10 字节,其中最主要的字段时间戳值字段(4字节)和时间戳回送回答字段(4字节)

 选择确认:接收方收到了和前面的字节流不连续的两2字节.若是这些字节的序号都在接收窗口以内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据

16三、DUP报文结构

这里写图片描述

16四、HTTP报文结构

HTTP请求报文:一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成。 
这里写图片描述 
or

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">request-line</span>></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">headers</span>></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">blank</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">line</span>></span>
[<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">request-body</span>></span>]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

请求行:请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。

请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:

  • User-Agent:产生请求的浏览器类型。
  • Accept:客户端可识别的内容类型列表。
  • Host:请求的主机名,容许多个域名同处一个IP地址,即虚拟主机。
  • 空行:最后一个请求头以后是一个空行,发送回车符和换行符,通知服务器如下再也不有请求头。

请求数据:请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于须要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

HTTP响应报文:HTTP响应由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">status-line</span>></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">headers</span>></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">blank</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">line</span>></span>
[<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">response-body</span>></span>]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

状态行格式以下:HTTP-Version Status-Code Reason-Phrase CRLF 
HTTP-Version表示服务器HTTP协议的版本; 
Status-Code表示服务器发回的响应状态代码; 
Reason-Phrase表示状态代码的文本描述。 
CRLF表示换行 
状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。 
1xx:指示信息–表示请求已接收,继续处理。 
2xx:成功–表示请求已被成功接收、理解、接受。 
3xx:重定向–要完成请求必须进行更进一步的操做。 
4xx:客户端错误–请求有语法错误或请求没法实现。 
5xx:服务器端错误–服务器未能实现合法的请求。 
常见状态代码、状态描述的说明以下。 
200 OK:客户端请求成功。 
400 Bad Request:客户端请求有语法错误,不能被服务器所理解。 
401 Unauthorized:请求未经受权,这个状态代码必须和WWW-Authenticate报头域一块儿使用。 
403 Forbidden:服务器收到请求,可是拒绝提供服务。 
404 Not Found:请求资源不存在,举个例子:输入了错误的URL。 
500 Internal Server Error:服务器发生不可预期的错误。 
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。

16五、TCP协议和UDP协议的区别

1,TCP协议面向链接,UDP协议面向非链接 
2,TCP协议传输速度慢,UDP协议传输速度快 
3,TCP协议保证数据顺序,UDP协议不保证 
4,TCP协议保证数据正确性,UDP协议可能丢包 
5,TCP协议对系统资源要求多,UDP协议要求少

16六、java对象在虚拟机中怎样实例化。

首先判断对象实例化的类型信息是否已经在JVM,若是不存在就对类型信息进行装载、链接和初始化,以后就能够使用了,能够访问类型的静态字段和方法,最后再建立类型实例,为实例对象分配内存空间。对象的建立分为显示建立和隐式建立两种。

显示建立分为: 
一、经过new建立; 
二、经过java.lang.Class的newInstance方法建立; 
三、经过clone方法建立; 
四、经过java.io.ObjectInputStream的readObject方法建立。

隐式建立分为: 
一、启动类的main方法的string数组参数; 
二、常量池的CONSTANT_String_info表项被解析的时候会建立一个String对象; 
三、每一个加载的类都会建立一个java.lang.Class对象; 
四、字符串+操做的时候,建立StringBuffer/StringBuilder对象。

对象在内存中的存储 
非严格意义来讲,对象都存储在堆上,由垃圾收集器负责回收再也不被引用的对象。可是随着jvm运行期编译技术的不断进步,栈上分配对象和标量替换技术使得非逃逸对象能够分配在栈上。固然绝大多数对象都是分配在堆上的,此处咱们主要讨论对象在堆中的存储。

对象的内容有: 
一、实例数据; 
二、指向堆中类型信息的指针; 
三、对象锁相关的数据; 
四、多线程协调完成同一件事情的时候wait set相关的队列; 
五、垃圾收集相关的内容,如存活时间、finalize方法是否运行过。

对象在内存中存储主要有两种方式: 
一、堆划分为句柄池和对象池,建立对象后的获得的引用是指向句柄池的指针,句柄池指针则指向对象池里的对象; 
二、堆只分为对象池,引用直接指向对象池中的对象。

16七、java链接池中链接如何收缩?

Java链接池中通常都有设置最大、最小链接数,当链接池中的链接达到最大链接数时,就不会再建立新的链接。通常来讲定时检测链接池中空闲链接数,当超过必定时间没有使用的话,先判断现有链接池中的链接是否大于最小链接数,若是大于的话,就好回收这个空闲链接,不然的话,就不会进行回收。 
如何确保链接池中的最小链接数呢?有动态和静态两种策略。动态即每隔必定时间就对链接池进行检测,若是发现链接数量小于最小链接数,则补充相应数量的新链接,以保证链接池的正常运转。静态是发现空闲链接不够时再去检查。

这里写图片描述 
这里写图片描述 
这里写图片描述 
这里写图片描述 
这里写图片描述 
这里写图片描述 
这里写图片描述 
上面就是链接池的配置信息

16八、Java多线程问题

有以下一个类:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">MyStack</span> {</span>  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> List<String> list = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ArrayList<String>();  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">push</span>(String value) {  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>) {  
            list.add(value);  
            notify();  
        }  
    }  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> String <span class="hljs-title" style="box-sizing: border-box;">pop</span>() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> InterruptedException {  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>) {  
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (list.size() <= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {  
                wait();  
            }  
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> list.remove(list.size() - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>);  
        }  
    }  
} </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

问题: 这段代码大多数状况下运行正常,可是某些状况下会出问题。何时会出现什么问题?如何修正? 
代码分析: 
从总体上,在并发状态下,push和pop都使用了synchronized的锁,来实现同步,同步的数据对象是基于List的数据;大部分状况下是能够正常工做的。 
问题描述:

情况1: 
1. 假设有三个线程: A,B,C. A 负责放入数据到list,就是调用push操做, B,C分别执行Pop操做,移除数据。 
2. 首先B先执行,于pop中的wait()方法处,进入waiting状态,进入等待队列,释放锁。 
3. A首先执行放入数据push操做到List,在调用notify()以前; 同时C执行pop(),因为synchronized,被阻塞,进入Blocked状态,放入基于锁的等待队列。注意,这里的队列和2中的waiting等待队列是两个不一样的队列。 
4. A线程调用notify(),唤醒等待中的线程A。 
5. 若是此时, C获取到基于对象的锁,则优先执行,执行pop方法,获取数据,从list移除一个元素。 
6. 而后,A获取到竞争锁,A中调用list.remove(list.size() - 1),则会报数据越界exception。

情况2: 
1. 相同于情况1 
2. B、C都处于等待waiting状态,释放锁。等待notify()、notifyAll()操做的唤醒。 
3. 存在被虚假唤醒的可能。

何为虚假唤醒? 
虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj.notifyAll()的其余状况被唤醒,而此时是不该该唤醒的。 
解决的办法是基于while来反复判断进入正常操做的临界条件是否知足:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">synchronized (obj) {  
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (<condition does not hold>)  
        obj.wait();  
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> // Perform action appropriate to condition  
} </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

如何修复问题? 
1. 使用可同步的数据结构来存放数据,好比LinkedBlockingQueue之类。由这些同步的数据结构来完成繁琐的同步操做。 
2. 双层的synchronized使用没有意义,保留外层便可。 
3. 将if替换为while,解决虚假唤醒的问题。

16八、super.getClass方法调用

先看一下程序的代码,看看最后的输出结果是多少?

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> java.util.Date;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span>  <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Test</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Date</span> {</span>
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">test</span>() {
              System.out.println(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span>.getClass().getName());
      }
      <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) {
              <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Test().test();
      }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

若是不了解,极可能得出错误的答案,其实答案是Test,是否是很奇怪,结果居然是Test。 
这道题就属于脑筋急转弯的题目,很简单的,也很容易落入陷阱中。我想大部分人之因此落入陷阱中多是由于这个类继承了。 
若是在test方法中,直接调用getClass().getName()方法的化,至关于调用this.getClass().getName(),这样返回的就是Test类名,getClass()返回对象运行时的字节码对象,当前对象是Test的实例,因此其字节码对象就是Test 
因为getClass()在Object类中定义成了final,子类不能覆盖该方法,因此,Date类也是没有这个方法的,在test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用super.getClass().getName()方法,因此,super.getClass().getName()方法返回的也应该是Test。 
若是想获得父类的名称,应该用以下代码: 
getClass().getSuperClass().getName();

16九、B树,B+树,B*树

170、知道哪些锁机制?(不限JAVA)什么是可重入性? synchronized的可重入性?显式锁跟synchronized对比?semaphore机制怎么实现?一个线程从wait()状态醒来是否是必定被notify()了?

17一、什么情景下应用过TreeMap?TreeMap内部怎么实现的?

TreeMap 是一个有序的key-value集合,它是经过红黑树实现的。 
TreeMap 继承于AbstractMap,因此它是一个Map,即一个key-value集合。 
TreeMap 实现了NavigableMap接口,意味着它支持一系列的导航方法。好比返回有序的key集合。 
TreeMap 实现了Cloneable接口,意味着它能被克隆。 
TreeMap 实现了java.io.Serializable接口,意味着它支持序列化。 
TreeMap基于红黑树(Red-Black tree)实现。该映射根据其键的天然顺序进行排序,或者根据建立映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 
TreeMap的基本操做 containsKey、get、put 和 remove 的时间复杂度是 log(n) 。 
另外,TreeMap是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。

17八、Java网络编程,socket描述什么的?同一端口能否同时被两个应用监听?

Socket一般也称做”套接字”,用于描述IP地址和端口,是一个通讯链的句柄。网络上的两个程序经过一个双向的通信链接实现数据的交换,这个双向链路的一端称为一个Socket,一个Socket由一个IP地址和一个端口号惟一肯定。应用程序一般经过”套接字”向网络发出请求或者应答网络请求。 Socket是TCP/IP协议的一个十分流行的编程界面,可是,Socket所支持的协议种类也不光TCP/IP一种,所以二者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。 
Socket通信过程:服务端监听某个端口是否有链接请求,客户端向服务端发送链接请求,服务端收到链接请求向客户端发出接收消息,这样一个链接就创建起来了。客户端和服务端均可以相互发送消息与对方进行通信。

Socket的基本工做过程包含如下四个步骤: 
一、建立Socket; 
二、打开链接到Socket的输入输出流; 
三、按照必定的协议对Socket进行读写操做; 
四、关闭Socket。

在java.net包下有两个类:Socket和ServerSocket。ServerSocket用于服务器端,Socket是创建网络链接时使用的。在链接成功时,应用程序两端都会产生一个Socket实例,操做这个实例,完成所需的会话。对于一个网络链接来讲,套接字是平等的,并无差异,不由于在服务器端或在客户端而产生不一样级别。无论是Socket仍是ServerSocket它们的工做都是经过SocketImpl类及其子类完成的。

<code class="hljs rust has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">Socket(InetAddress address,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> port);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//建立一个流套接字并将其链接到指定 IP 地址的指定端口号</span>
Socket(String host,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> port);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//建立一个流套接字并将其链接到指定主机上的指定端口号</span>
Socket(InetAddress address,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> port, InetAddress localAddr,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> localPort);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//建立一个套接字并将其链接到指定远程地址上的指定远程端口</span>
Socket(String host,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> port, InetAddress localAddr,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> localPort);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//建立一个套接字并将其链接到指定远程主机上的指定远程端口</span>
Socket(SocketImpl <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">impl</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//使用用户指定的 SocketImpl 建立一个未链接 Socket</span>

ServerSocket(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> port);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//建立绑定到特定端口的服务器套接字</span>
ServerSocket(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> port,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> backlog);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//利用指定的 backlog 建立服务器套接字并将其绑定到指定的本地端口号</span>
ServerSocket(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> port,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> backlog, InetAddress bindAddr);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//使用指定的端口、侦听 backlog 和要绑定到的本地 IP地址建立服务器。</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

17九、在多线程里面如何实现一个变量被多线程独立的访问。

1,在线程内部建立变量 
2,使用threadlocal对象

180、concurrentHashMap的实现

ConcurrentHashMap容许多个修改操做并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不一样部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不一样的部分,每一个段其实就是一个小的hash table,它们有本身的锁。只要多个修改操做发生在不一样的段上,它们就能够并发进行。 
有些方法须要跨段,好比size()和containsValue(),它们可能须要锁定整个表而而不只仅是某个段,这须要按顺序锁定全部段,操做完毕后,又按顺序释放全部段的锁。这里“按顺序”是很重要的,不然极有可能出现死锁,在ConcurrentHashMap内部,段数组是final的,而且其成员变量实际上也是final的,可是,仅仅是将数组声明为final的并不保证数组成员也是final的,这须要实现上的保证。这能够确保不会出现死锁,由于得到锁的顺序是固定的。

ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEntry 用来封装映射表的键 / 值对;Segment 用来充当锁的角色,每一个 Segment 对象守护整个散列映射表的若干个桶。每一个桶是由若干个 HashEntry 对象连接起来的链表。一个 ConcurrentHashMap 实例中包含由若干个 Segment 对象组成的数组。 
HashEntry 用来封装散列映射表中的键值对。在 HashEntry 类中,key,hash 和 next 域都被声明为 final 型,value 域被声明为 volatile 型。同时,HashEntry 类的 value 域被声明为 Volatile 型,Java 的内存模型能够保证:某个写线程对 value 域的写入立刻能够被后续的某个读线程“看”到。在 ConcurrentHashMap 中,不容许用 unll 做为键和值,当读线程读到某个 HashEntry 的 value 域的值为 null 时,便知道产生了冲突——发生了重排序现象,须要加锁后从新读入这个 value 值。这些特性互相配合,使得读线程即便在不加锁状态下,也能正确访问 ConcurrentHashMap。 
在 ConcurrentHashMap 中,在散列时若是产生“碰撞”,将采用“分离连接法”来处理“碰撞”:把“碰撞”的 HashEntry 对象连接成一个链表。因为 HashEntry 的 next 域为 final 型,因此新节点只能在链表的表头处插入。 
Segment 类继承于 ReentrantLock 类,从而使得 Segment 对象能充当锁的角色。每一个 Segment 对象用来守护其(成员对象 table 中)包含的若干个桶。 
避免热点域:在 ConcurrentHashMap中,每个 Segment 对象都有一个 count 对象来表示本 Segment 中包含的 HashEntry 对象的个数。这样当须要更新计数器时,不用锁定整个 ConcurrentHashMap。 
ConcurrentHashMap 在默认并发级别会建立包含 16 个 Segment 对象的数组。每一个 Segment 的成员对象 table 包含若干个散列表的桶。每一个桶是由 HashEntry 连接起来的一个链表。若是键能均匀散列,每一个 Segment 大约守护整个散列表中桶总数的 1/16。 
在 ConcurrentHashMap 中,线程对映射表作读操做时,通常状况下不须要加锁就能够完成,对容器作结构性修改的操做才须要加锁。 
用 Volatile 变量协调读写线程间的内存可见性。 
ConcurrentHashMap 实现高并发的总结 
基于一般情形而优化 
在实际的应用中,散列表通常的应用场景是:除了少数插入操做和删除操做外,绝大多数都是读取操做,并且读操做在大多数时候都是成功的。正是基于这个前提,ConcurrentHashMap 针对读操做作了大量的优化。经过 HashEntry 对象的不变性和用 volatile 型变量协调线程间的内存可见性,使得大多数时候,读操做不须要加锁就能够正确得到值。这个特性使得 ConcurrentHashMap 的并发性能在分离锁的基础上又有了近一步的提升。

总结 
ConcurrentHashMap 是一个并发散列映射表的实现,它容许彻底并发的读取,而且支持给定数量的并发更新。相比于 HashTable 和用同步包装器包装的 HashMap(Collections.synchronizedMap(new HashMap())),ConcurrentHashMap 拥有更高的并发性。在 HashTable 和由同步包装器包装的 HashMap 中,使用一个全局的锁来同步不一样线程间的并发访问。同一时间点,只能有一个线程持有锁,也就是说在同一时间点,只能有一个线程能访问容器。这虽然保证多线程间的安全并发访问,但同时也致使对容器的访问变成串行化的了。 
在使用锁来协调多线程间并发访问的模式下,减少对锁的竞争能够有效提升并发性。有两种方式能够减少对锁的竞争: 
1. 减少请求 同一个锁的 频率。 
2. 减小持有锁的 时间。 
ConcurrentHashMap 的高并发性主要来自于三个方面: 
1. 用分离锁实现多个线程间的更深层次的共享访问。 
2. 用 HashEntery 对象的不变性来下降执行读操做的线程在遍历链表期间对加锁的需求。 
3. 经过对同一个 Volatile 变量的写 / 读访问,协调不一样线程间读 / 写操做的内存可见性。 
使用分离锁,减少了请求 同一个锁的频率。 
经过 HashEntery 对象的不变性及对同一个 Volatile 变量的读 / 写来协调内存可见性,使得 读操做大多数时候不须要加锁就能成功获取到须要的值。因为散列映射表在实际应用中大多数操做都是成功的 读操做,因此 2 和 3 既能够减小请求同一个锁的频率,也能够有效减小持有锁的时间。 
经过减少请求同一个锁的频率和尽可能减小持有锁的时间 ,使得 ConcurrentHashMap 的并发性相对于 HashTable 和用同步包装器包装的 HashMap有了质的提升。

18一、TCP长链接和短链接

当网络通讯时采用TCP协议时,在真正的读写操做以前,server与client之间必须创建一个链接,当读写操做完成后,双方再也不须要这个链接时它们能够释放这个链接,链接的创建是须要三次握手的,而释放则须要4次握手,因此说每一个链接的创建都是须要资源消耗和时间消耗的。 
TCP短链接 
咱们模拟一下TCP短链接的状况,client向server发起链接请求,server接到请求,而后双方创建链接。client向server发送消息,server回应client,而后一次读写就完成了,这时候双方任何一个均可以发起close操做,不过通常都是client先发起close操做。为何呢,通常的server不会回复完client后当即关闭链接的,固然不排除有特殊的状况。从上面的描述看,短链接通常只会在client/server间传递一次读写操做 
短链接的优势是:管理起来比较简单,存在的链接都是有用的链接,不须要额外的控制手段。 
TCP长链接 
接下来咱们再模拟一下长链接的状况,client向server发起链接,server接受client链接,双方创建链接。Client与server完成一次读写以后,它们之间的链接并不会主动关闭,后续的读写操做会继续使用这个链接。 
首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用但愿知道客户主机是否崩溃,从而能够表明客户使用资源。若是客户已经消失,使得服务器上保留一个半开放的链接,而服务器又在等待来自客户端的数据,则服务器将永远等待客户端的数据,保活功能就是试图在服务器端检测到这种半开放的链接。 
若是一个给定的链接在两小时内没有任何的动做,则服务器就向客户发一个探测报文段,客户主机必须处于

如下4个状态之一:

 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。

 客户主机已经崩溃,而且关闭或者正在从新启动。在任何一种状况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每一个间隔75秒。若是服务器没有收到一个响应,它就认为客户主机已经关闭并终止链接。

 客户主机崩溃并已经从新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个链接。

 客户机正常运行,可是服务器不可达,这种状况与2相似,TCP能发现的就是没有收到探查的响应。 
从上面能够看出,TCP保活功能主要为探测长链接的存活情况,不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP链接的存活,属于比较斯文的作法,遇到恶意的链接时,保活功能就不够使了。

在长链接的应用场景下,client端通常不会主动关闭它们之间的链接,Client与server之间的链接若是一直不关闭的话,会存在一个问题,随着客户端链接愈来愈多,server迟早有扛不住的时候,这时候server端须要采起一些策略,如关闭一些长时间没有读写事件发生的链接,这样能够避免一些恶意链接致使server端服务受损;若是条件再容许就能够以客户端机器为颗粒度,限制每一个客户端的最大长链接数,这样能够彻底避免某个蛋疼的客户端连累后端服务。 
长链接和短链接的产生在于client和server采起的关闭策略,具体的应用场景采用具体的策略,没有十全十美的选择,只有合适的选择。

18二、Java实现Socket长链接和短链接.

概念 
Socket:socket其实是对TCP/IP进行的封装,咱们能够使用socket套接字经过socket来传输。首先咱们须要明白的一个概念就是通道,简单地说通道就是两个对端能够随时传输数据的信道。我么常说的所谓创建socket链接,也就是创建了客户端与服务器端的通道。 
长短链接:显而易见,长链接也就是这个socket链接一直保持链接,也就是通道一直保持通畅,两个对端能够随时发送和接收数据;短链接就是咱们发送一次或有限的几回,socket通道就被关闭了。首先,咱们必须明白的是socket链接后,若是没有任何一方关闭,这个通道是一直保持着的,换句话说,若是任何一方都不关闭链接,这个socket链接就是长链接,所以Java中的socket自己就是支持长链接的(如一个简单的实验:服务器端不关闭链接,服务器端每隔10秒发送一次数据,服务器端每次都能正确接受数据,这个实验就能够证实)。 
那么既然socket自己是支持长链接的,那么为何咱们还要提短链接的概念呢?试想一个中国移动的短信网关(即经过发布socket通讯接口)每时每分都有N多个链接发送短信请求,加入服务器不加任何限制地直接和客户端使用长链接那么可想而知服务器须要承受多么大的压力。因此通常的socket服务器端都是会设定超时时间的,也就是timeout,若是超过timeout服务器没有接收到任何数据,那么该服务器就会关闭该链接,从而使得服务器资源获得有效地使用。 
如何实现长短链接 
有了长短链接的概念,服务器若是超过timeout时间接收不到客户端的通讯就会断开链接,那么假如客户端在timeout时间前一秒(或者更短的时间)发送一条激活数据来使服务器端从新计时,如此重复就能保证服务器一直不能进入timeout时间,从而一直保持链接,这就是长链接的实现原理。下面咱们经过一张图说明:

由上图可见,是不是长链接彻底取决于客户端是否会在timeout时间发送心跳消息,所以长短链接是和客户端相关的,服务器端没有任何区别(只不过服务器端须要设定timeout而已)。

18三、适配器模式,装饰模式,代理模式异同(适配器模式和代理模式的区别答案在其中)。

适配器模式,一个适配容许一般由于接口不兼容而不能在一块儿工做的类工做在一块儿,作法是将类本身的接口包裹在一个已存在的类中。 
装饰器模式,原有的不能知足现有的需求,对原有的进行加强。 
代理模式,同一个类而去调用另外一个类的方法,不对这个方法进行直接操做。 
适配器的特色在于兼容,从代码上的特色来讲,适配类与原有的类具备相同的接口,而且持有新的目标对象。就如同一个三孔转2孔的适配器同样,他有三孔的插头,能够插到三孔插座里,又有两孔的插座能够被2孔插头插入。适配器模式是在于对原有3孔的改造。在使用适配器模式的时候,咱们必须同时持有原对象,适配对象,目标对象。 
装饰器模式特色在于加强,他的特色是被装饰类和全部的装饰类必须实现同一个接口,并且必须持有被装饰的对象,能够无限装饰。 
代理模式的特色在于隔离,隔离调用类和被调用类的关系,经过一个代理类去调用。 
总的来讲就是以下三句话:

1) 适配器模式是将一个类(a)经过某种方式转换成另外一个类(b). 
2) 装饰模式是在一个原有类(a)的基础之上增长了某些新的功能变成另外一个类(b). 
3) 代理模式是将一个类(a)转换成具体的操做类(b).

18四、什么是可重入锁

见文章

18五、volatile变量的两种特性。

可见性:volatile变量则是经过主内存完成交换,可是二者区别在于volatile变量能当即同步到主内存中,当一个线程修改变量的变量的时候,马上会被其余线程感知到。 
阻止重排序:普通变量仅仅会保证在该方法的执行过程当中所依赖复制结果的地方都能获取到正确的结果,而不能保证变量复制操做的 
顺序与程序代码中的执行顺序一致。

18六、volatile变量详解

Volatile 变量具备 synchronized 的可见性特性,可是不具有原子特性。这就是说线程可以自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,可是只能应用于很是有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。所以,单独使用 volatile 还不足以实现计数器、互斥锁或任何具备与多个变量相关的不变式(Invariants)的类(例如 “start <=end”)。此外,volatile 变量不会像锁那样形成线程阻塞,所以也不多形成可伸缩性问题。在某些状况下,若是读操做远远大于写操做,volatile 变量还能够提供优于锁的性能优点。

正确使用 volatile 变量的条件: 
要使 volatile 变量提供理想的线程安全,必须同时知足下面两个条件:

对变量的写操做不依赖于当前值。 
该变量没有包含在具备其余变量的不变式中。

这些条件代表,能够被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。 
第一个条件的限制使 volatile 变量不能用做线程安全计数器。虽然增量操做(x++)看上去相似一个单独操做,实际上它是一个由读取-修改-写入操做序列组成的组合操做,必须以原子方式执行,而 volatile 不能提供必须的原子特性。实现正确的操做须要使 x 的值在操做期间保持不变,而 volatile 变量没法实现这点。(然而,若是将值调整为只从单个线程写入,那么能够忽略第一个条件。) 
使用 volatile 变量的主要缘由是其简易性:在某些情形下,使用 volatile 变量要比使用相应的锁简单得多。使用 volatile 变量次要缘由是其性能:某些状况下,volatile 变量同步机制的性能要优于锁。 
很难作出准确、全面的评价,例如 “X 老是比 Y 快”,尤为是对 JVM 内在的操做而言。(例如,某些状况下 VM 也许可以彻底删除锁机制,这使得咱们难以抽象地比较 volatile 和 synchronized 的开销。)就是说,在目前大多数的处理器架构上,volatile 读操做开销很是低 —— 几乎和非 volatile 读操做同样。而 volatile 写操做的开销要比非 volatile 写操做多不少,由于要保证可见性须要实现内存界定(Memory Fence),即使如此,volatile 的总开销仍然要比锁获取低。 
volatile 操做不会像锁同样形成阻塞,所以,在可以安全使用 volatile 的状况下,volatile 能够提供一些优于锁的可伸缩特性。若是读操做的次数要远远超过写操做,与锁相比,volatile 变量一般可以减小同步的性能开销。 
不少并发性专家事实上每每引导用户远离 volatile 变量,由于使用它们要比使用锁更加容易出错。然而,若是谨慎地遵循一些良好定义的模式,就可以在不少场合内安全地使用 volatile 变量。要始终牢记使用 volatile 的限制 —— 只有在状态真正独立于程序内其余内容时才能使用 volatile —— 这条规则可以避免将这些模式扩展到不安全的用例。

18七、Sesson怎么建立和销毁。

当客户端发出第一个请求时(无论是被访问网站的任何页面)就会在此站点的服务其中开辟一块内存空间,这块内存就是session,session的销毁有两种方式,一种是session过时时间已到,会自动销毁(注意这里不是立刻就会销毁,具体销毁时间由Tomcat容器所决定)。在咱们项目中的web.xml中就能够配置:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">session-config</span>></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">session-timeout</span>></span>30<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">session-timeout</span>></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">session-config</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

表示设置session过时时间为30分钟。值得注意的就是上面说的即便30分钟到了session不必定会立刻销毁,能够经过session监听器测试获得每次session销毁的时间都不同。若是要想安全的话就用下面第二种方法。在Tomcat的conf文件夹中的web.xml中能够找到Tomcat默认的session过时时间为30分钟。若是咱们在咱们的站点中配置了session过时时间Tomcat容器会以站点配置为主,若是咱们没有在站点中配置session过时时间,将会以Tomcat下conf文件夹下的web.xml文件中配置的session过时时间为准。 
第二种销毁方式经过手工方式销毁,这种销毁方式会马上释放服务器端session的资源,咱们手动销毁能够经过session().invalidate();实现。

18八、“static”关键字是什么意思?Java中是否能够覆盖(override)一个private或者是static的方法?

“static”关键字代表一个成员变量或者是成员方法能够在没有所属的类的实例变量的状况下被访问。Java中static方法不能被覆盖,由于方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,因此概念上不适用。

18九、接口和抽象类的区别是什么?

Java提供和支持建立抽象类和接口。它们的实现有共同点,不一样点在于: 
1. 接口中全部的方法隐含的都是抽象的。而抽象类则能够同时包含抽象和非抽象的方法。 
2. 类能够实现不少个接口,可是只能继承一个抽象类 
3. 类若是要实现一个接口,它必需要实现接口声明的全部方法。可是,类能够不实现抽象类声明的全部方法,固然,在这种状况下,类也必须得声明成是抽象的。 
4. 抽象类能够在不提供接口方法实现的状况下实现接口。 
5. Java接口中声明的变量默认都是final的。抽象类能够包含非final的变量。 
6. Java接口中的成员函数默认是public的。抽象类的成员函数能够是private,protected或者是public。 
7. 接口是绝对抽象的,不能够被实例化。抽象类也不能够被实例化,可是,若是它包含main方法的话是能够被调用的。

190、在监视器(Monitor)内部,是如何作线程同步的?程序应该作哪一种级别的同步?

监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每个监视器都和一个对象引用相关联。线程在获取锁以前不容许执行同步代码。

19一、如何确保N个线程能够访问N个资源同时又不致使死锁?

使用多线程的时候,一种很是简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。所以,若是全部的线程都是以一样的顺序加锁和释放锁,就不会出现死锁了。

19二、Java集合类框架的基本接口有哪些?

Java集合类提供了一套设计良好的支持对一组对象进行操做的接口和类。Java集合类里面最基本的接口有: 
 Collection:表明一组对象,每个对象都是它的子元素。 
 Set:不包含重复元素的Collection。 
 List:有顺序的collection,而且能够包含重复元素。 
 Map:能够把键(key)映射到值(value)的对象,键不能重复

19三、为何集合类没有实现Cloneable和Serializable接口?

集合类接口指定了一组叫作元素的对象。集合类接口的每一种具体的实现类均可以选择以它本身的方式对元素进行保存和排序。有的集合类容许重复的键,有些不容许。克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。所以,应该由集合类的具体实现来决定如何被克隆或者是序列化。

19三、Iterator和ListIterator的区别是什么?

下面列出了他们的区别: 
Iterator可用来遍历Set和List集合,可是ListIterator只能用来遍历List。 
Iterator对集合只能是前向遍历,ListIterator既能够前向也能够后向。 
ListIterator实现了Iterator接口,并包含其余的功能,好比:增长元素,替换元素,获取前一个和后一个元素的索引,等等

19四、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

Iterator的安全失败是基于对底层集合作拷贝,所以,它不受源集合上修改的影响。java.util包下面的全部的集合类都是快速失败的,而java.util.concurrent包下面的全部的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。

19五、Java中的HashMap的工做原理是什么?

Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap须要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,而后把键值对存储在集合中合适的索引上。若是key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

19六、hashCode()和equals()方法的重要性体如今什么地方?

Java中的HashMap使用hashCode()和equals()方法来肯定键值对的索引,当根据键获取值的时候也会用到这两个方法。若是没有正确的实现这两个方法,两个不一样的键可能会有相同的hash值,所以,可能会被集合认为是相等的。并且,这两个方法也用来发现重复元素。因此这两个方法的实现对HashMap的精确性和正确性是相当重要的。当equals()方法返回true时,两个对象必须返回相同的hashCode值,不然在HashMap中就会出错。

19七、HashMap和Hashtable有什么区别?

HashMap和Hashtable都实现了Map接口,所以不少特性很是类似。可是,他们有如下不一样点: 
HashMap容许键和值是null,而Hashtable不容许键或者值是null。 
Hashtable是同步的,而HashMap不是。所以,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。 
HashMap提供了可供应用迭代的键的集合,所以,HashMap是快速失败的。另外一方面,Hashtable提供了对键的列举(Enumeration)。 
通常认为Hashtable是一个遗留的类。

19八、数组(Array)和列表(ArrayList)有什么区别?何时应该使用Array而不是ArrayList?

下面列出了Array和ArrayList的不一样点: 
Array能够包含基本类型和对象类型,ArrayList只能包含对象类型。 
Array大小是固定的,ArrayList的大小是动态变化的。 
ArrayList提供了更多的方法和特性,好比:addAll(),removeAll(),iterator()等等。 
对于基本类型数据,集合使用自动装箱来减小编码工做量。可是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

19九、ArrayList和LinkedList有什么区别?

ArrayList和LinkedList都实现了List接口,他们有如下的不一样点: 
ArrayList是基于索引的数据接口,它的底层是数组。它能够以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每个元素都和它的前一个和后一个元素连接在一块儿,在这种状况下,查找某个元素的时间复杂度是O(n)。 
相对于ArrayList,LinkedList的插入,添加,删除操做速度更快,由于当元素被添加到集合任意位置的时候,不须要像数组那样从新计算大小或者是更新索引。 
LinkedList比ArrayList更占内存,由于LinkedList为每个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

200、Comparable和Comparator接口是干什么的?列出它们的区别。

Java提供了只包含一个compareTo()方法的Comparable接口。这个方法能够个给两个对象排序。具体来讲,它返回负数,0,正数来代表输入对象小于,等于,大于已经存在的对象。 
Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数代表第一个参数是小于,等于,大于第二个参数。equals()方法须要一个对象做为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator而且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。

20一、什么是Java优先级队列(Priority Queue)?

PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照天然顺序(natural order)排序的。在建立的时候,咱们能够给它提供一个负责给元素排序的比较器。PriorityQueue不容许null值,由于他们没有天然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。 
.

20二、Java集合类框架的最佳实践有哪些?

根据应用的须要正确选择要使用的集合的类型对性能很是重要,好比:假如元素的大小是固定的,并且能事先知道,咱们就应该用Array而不是ArrayList。 
有些集合类容许指定初始容量。所以,若是咱们能估计出存储的元素的数目,咱们能够设置初始容量来避免从新计算hash值或者是扩容。 
为了类型安全,可读性和健壮性的缘由老是要使用泛型。同时,使用泛型还能够避免运行时的ClassCastException。 
使用JDK提供的不变类(immutable class)做为Map的键能够避免为咱们本身的类实现hashCode()和equals()方法。 
编程的时候接口优于实现。 
底层的集合其实是空的状况下,返回长度是0的集合或者是数组,不要返回null。

20三、Enumeration接口和Iterator接口的区别有哪些?

Enumeration速度是Iterator的2倍,同时占用更少的内存。可是,Iterator远远比Enumeration安全,由于其余线程不可以修改正在被iterator遍历的集合里面的对象。同时,Iterator容许调用者删除底层集合里面的元素,这对Enumeration来讲是不可能的。

20四、HashSet和TreeSet有什么区别?

  1. HashSet是经过HashMap实现的,TreeSet是经过TreeMap实现的,只不过Set用的只是Map的key
  2. Map的key和Set都有一个共同的特性就是集合的惟一性.TreeMap更是多了一个排序的功能.
  3. hashCode和equal()是HashMap用的, 由于无需排序因此只须要关注定位和惟一性便可. 
    • a. hashCode是用来计算hash值的,hash值是用来肯定hash表索引的.
    • b. hash表中的一个索引处存放的是一张链表, 因此还要经过equal方法循环比较链上的每个对象 
      才能够真正定位到键值对应的Entry.
    • c. put时,若是hash表中没定位到,就在链表前加一个Entry,若是定位到了,则更换Entry中的value,并返回旧value
  4. 因为TreeMap须要排序,因此须要一个Comparator为键值进行大小比较.固然也是用Comparator定位的. 
    • a. Comparator能够在建立TreeMap时指定
    • b. 若是建立时没有肯定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
    • c. TreeMap是使用Tree数据结构实现的,因此使用compare接口就能够完成定位了. 
      HashSet是由一个hash表来实现的,所以,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。 
      另外一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。所以,add(),remove(),contains()方法的时间复杂度是O(logn)。

20五、stop() 和 suspend() 方 法为什么不推荐使用?

反对使用stop(),是由于它不安全。它会解除由线程获取的全部锁定,并且若是对象处于一种不连贯状态,那么其余线程能在那种状态下检查和修改它们。结果 很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这以前得到的锁定。此 时,其余任何线程都不能访问锁定的资源,除非被”挂起”的线程恢复运行。对任何线程来讲,若是它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就 会形成死锁。因此不该该使用suspend(),而应在本身的Thread类中置入一个标志,指出线程应该活动仍是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()从新启动线程。

20六、当一个线程进入一个对象的一个 synchronized 方法后,其它线程是否可进入此对象的其它方法 ?

答:状况一:当一个线程进入一个对象的一个synchronized方法后,其它线程能够访问该对象的非同步方法。 
状况二:当一个线程进入一个对象的一个synchronized方法后,其它线程不能访问该同步方法。 
状况三:当一个线程进入一个对象的一个synchronized方法后,其它线程不能同时访问该对象的另外一个同步方法。

20七、接口:Collection

全部集合类的根类型,主要的一个接口方法:boolean add(Ojbect c) 
虽返回的是boolean,但不是表示添加成功与否,由于Collection规定:一个集合拒绝添加这个元素,不管什么缘由,都必须抛出异常,这个返回值表示的意义是add()执行后,集合的内容是否改了(就是元素有无数量、位置等变化)。相似的addAll,remove,removeAll,remainAll也是同样的。 
用Iterator模式实现遍历集合 
Collection有一个重要的方法:iterator(),返回一个Iterator(迭代子),用于遍历集合的全部元素。Iterator模式能够把访问逻辑从不一样类的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。 
for(Iterator it = c.iterator(); it.hasNext();) {…} 
不须要维护遍历集合的“指针”,全部的内部状态都有Iterator来维护,而这个Iterator由集合类经过工厂方法生成。 
每一种集合类返回的Iterator具体类型可能不一样,但它们都实现了Iterator接口,所以,咱们不须要关心究竟是哪一种Iterator,它只须要得到这个Iterator接口便可,这就是接口的好处,面向对象的威力。 
要确保遍历过程顺利完成,必须保证遍历过程当中不更改集合的内容(Iterator的remove()方法除外),因此,确保遍历可靠的原则是:只在一个线程中使用这个集合,或者在多线程中对遍历代码进行同步。

20八、JDBC:如何控制事务?

A: conn.setAutoCommit(false); 
当值为false时,表示禁止自动提交。 在默认状况下,JDBC驱动程序会在每个更新操做语句以后自动添加commit语句,若是调用了setAutoCommit(false),则驱动程序再也不添加commit语句了。 
B: conn.commit(); 
提交事务。即驱动程序会向数据库发送一个commit语句。 
C: conn.rollback(); 
回滚事务。即驱动程序会向数据库发送一个rollback语句。

20九、ArrayList总结:

  • ArrayList是基于数组实现的,是一个动态数组,其容量能自动增加,相似于C语言中的动态申请内存,动态增加内存。

  • ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下能够考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也能够使用concurrent并发包下的CopyOnWriteArrayList类。

  • ArrayList实现了Serializable接口,所以它支持序列化,可以经过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是经过下标序号进行快速访问,实现了Cloneable接口,能被克隆。

  • 无参构造方法构造的ArrayList的容量默认为10,带有Collection参数的构造方法,将Collection转化为数组赋给ArrayList的实现数组elementData。

  • ArrayList在每次增长元素(多是1个,也多是一组)时,都要调用该方法来确保足够的容量。当容量不足以容纳当前的元素个数时,就设置新的容量为旧的容量的1.5倍加1,若是设置后的新容量还不够,则直接新容量设置为传入的参数(也就是所需的容量),然后用Arrays.copyof()方法将元素拷贝到新的数组。

  • ArrayList基于数组实现,能够经过下标索引直接查找到指定位置的元素,所以查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。

  • 在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种状况处理,ArrayList中容许元素为null。

2十、CopyOnWriteArrayList

  • 和ArrayList继承于AbstractList不一样,CopyOnWriteArrayList没有继承于AbstractList,它仅仅只是实现了List接口。

  • ArrayList的iterator()函数返回的Iterator是在AbstractList中实现的;而CopyOnWriteArrayList是本身实现Iterator。

  • ArrayList的Iterator实现类中调用next()时,会“调用checkForComodification()比较‘expectedModCount’和‘modCount’的大小”;可是,CopyOnWriteArrayList的Iterator实现类中,没有所谓的checkForComodification(),更不会抛出ConcurrentModificationException异常!

  • CopyOnWriteArrayList不会抛ConcurrentModificationException,是由于全部改变其内容的操做(add、remove、clear等),都会copy一份现有数据,在现有数据上修改好,在把原有数据的引用改为指向修改后的数据。而不是在读的时候copy。

2十一、LinkedList总结

  • LinkedList是基于双向循环链表实现的,且头结点中不存放数据。除了能够当作链表来操做外,它还能够当作栈、队列和双端队列来使用。

  • LinkedList一样是非线程安全的,只在单线程下适合使用。

  • LinkedList实现了Serializable接口,所以它支持序列化,可以经过序列化传输,实现了Cloneable接口,能被克隆。

  • 无参构造方法直接创建一个仅包含head节点的空链表,包含Collection的构造方法,先调用无参构造方法创建一个空链表,然后将Collection中的数据加入到链表的尾部后面。

  • 在查找和删除某元素时,源码中都划分为该元素为null和不为null两种状况来处理,LinkedList中容许元素为null。

  • LinkedList是基于链表实现的,所以不存在容量不足的问题,因此这里没有扩容的方法。

  • 找指定位置的元素时,先将index与长度size的一半比较,若是index

2十二、Vector总结

  • Vector也是基于数组实现的,是一个动态数组,其容量能自动增加。

  • Vector是JDK1.0引入了,它的不少实现方法都加入了同步语句,所以是线程安全的(其实也只是相对安全,有些时候仍是要加入同步语句来保证线程的安全),能够用于多线程环境。

  • Vector没有实现Serializable接口,所以它不支持序列化,实现了Cloneable接口,能被克隆,实现了RandomAccess接口,支持快速随机访问。

  • Vector有四个不一样的构造方法。无参构造方法的容量为默认值10,仅包含容量的构造方法则将容量增加量明置为0。

  • Vector在每次增长元素(多是1个,也多是一组)时,都要调用该方法来确保足够的容量。当容量不足以容纳当前的元素个数时,就先看构造方法中传入的容量增加量参数CapacityIncrement是否为0,若是不为0,就设置新的容量为就容量加上容量增加量,若是为0,就设置新的容量为旧的容量的2倍,若是设置后的新容量还不够,则直接新容量设置为传入的参数(也就是所需的容量),然后一样用Arrays.copyof()方法将元素拷贝到新的数组。

  • 不少方法都加入了synchronized同步语句,来保证线程安全。

  • 一样在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种状况处理,Vector中也容许元素为null。

  • 其余不少地方都与ArrayList实现大同小异,Vector如今已经基本再也不使用。 
    HashMap总结

  • HashMap是基于哈希表实现的,每个元素是一个key-value对,其内部经过单链表解决冲突问题,容量不足(超过了阀值)时,一样会自动增加。

  • HashMap是非线程安全的,只是用于单线程环境下,多线程环境下能够采用concurrent并发包下的concurrentHashMap。

  • HashMap 实现了Serializable接口,所以它支持序列化,实现了Cloneable接口,能被克隆。

  • HashMap共有四个构造方法。构造方法中提到了两个很重要的参数:初始容量和加载因子。这两个参数是影响HashMap性能的重要参数,其中容量表示哈希表中槽的数量(即哈希数组的长度),初始容量是建立哈希表时的容量(若是不指明,则默认为16),加载因子是哈希表在其容量自动增长以前能够达到多满的一种尺度,当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 resize 操做(即扩容)。若是加载因子越大,对空间的利用更充分,可是查找效率会下降(链表长度会愈来愈长);若是加载因子过小,那么表中的数据将过于稀疏(不少空间还没用,就开始扩容了),对空间形成严重浪费。若是咱们在构造方法中不指定,则系统默认加载因子为0.75,这是一个比较理想的值,通常状况下咱们是无需修改的。另外,不管指定的容量为多少,构造方法都会将实际容量设为不小于指定容量的2的次方的一个数,且最大值不能超过2的30次方。每次扩容也是扩大两倍,也就是容量老是2的幂次方。

  • HashMap中key和value都容许为null。

  • key为null的键值对永远都放在以table[0]为头结点的链表中,固然不必定是存放在头结点table[0]中。若是key不为null,则先求的key的hash值,根据hash值找到在table中的索引,在该索引对应的单链表中查找是否有键值对的key与目标key相等,有就返回对应的value,没有则返回null。

21三、Hashtable总结

  • Hashtable一样是基于哈希表实现的,一样每一个元素是一个key-value对,其内部也是经过单链表解决冲突问题,容量不足(超过了阀值)时,一样会自动增加。

  • Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。

  • Hashtable一样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。

  • HashTable在不指定容量的状况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量必定要为2的整数次幂,而HashMap则要求必定为2的整数次幂。

  • Hashtable中key和value都不容许为null,而HashMap中key和value都容许为null(key只能有一个为null,而value则能够有多个为null)。可是若是在Hashtable中有相似put(null,null)的操做,编译一样能够经过,由于key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。

  • Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

  • Hashtable计算hash值,直接用key的hashCode(),而HashMap从新计算了key的hash值,Hashtable在求hash值对应的位置索引时,用取模运算,而HashMap在求位置索引时,则用与运算,且这里通常先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,由于hash值有可能为负数,而&0x7FFFFFFF后,只有符号外改变,然后面的位都不变。

21四、TreeMap总结

  • TreeMap是基于红黑树实现的。

  • TreeMap是根据key进行排序的,它的排序和定位须要依赖比较器或覆写Comparable接口,也所以不须要key覆写hashCode方法和equals方法,就能够排除掉重复的key,而HashMap的key则须要经过覆写hashCode方法和equals方法来确保没有重复的key。

  • TreeMap的查询、插入、删除效率均没有HashMap高,通常只有要对key排序时才使用TreeMap。

  • TreeMap的key不能为null,而HashMap的key能够为null。

21五、LinkedHashMap总结

  • LinkedHashMap是HashMap的子类,与HashMap有着一样的存储结构,但它加入了一个双向链表的头结点,将全部put到LinkedHashmap的节点一一串成了一个双向循环链表,所以它保留了节点插入的顺序,能够使节点的输出顺序与输入顺序相同。

  • LinkedHashMap能够用来实现LRU算法。

  • LinkedHashMap一样是非线程安全的,只在单线程环境下使用。

  • LinkedHashMap中加入了一个head头结点,将全部插入到该LinkedHashMap中的Entry按照插入的前后顺序依次加入到以head为头结点的双向循环链表的尾部。

  • LinkedHashMap因为继承自HashMap,所以它具备HashMap的全部特性,一样容许key和value为null。

  • 源码中的accessOrder标志位,当它false时,表示双向链表中的元素按照Entry插入LinkedHashMap到中的前后顺序排序,即每次put到LinkedHashMap中的Entry都放在双向链表的尾部,这样遍历双向链表时,Entry的输出顺序便和插入的顺序一致,这也是默认的双向链表的存储顺序;当它为true时,表示双向链表中的元素按照访问的前后顺序排列,能够看到,虽然Entry插入链表的顺序依然是按照其put到LinkedHashMap中的顺序,但put和get方法均有调用recordAccess方法(put方法在key相同,覆盖原有的Entry的状况下调用recordAccess方法),该方法判断accessOrder是否为true,若是是,则将当前访问的Entry(put进来的Entry或get出来的Entry)移到双向链表的尾部(key不相同时,put新Entry时,会调用addEntry,它会调用creatEntry,该方法一样将新插入的元素放入到双向链表的尾部,既符合插入的前后顺序,又符合访问的前后顺序,由于这时该Entry也被访问了),不然,什么也不作。

  • 构造方法,前四个构造方法都将accessOrder设为false,说明默认是按照插入顺序排序的,而第五个构造方法能够自定义传入的accessOrder的值,所以能够指定双向循环链表中元素的排序规则,通常要用LinkedHashMap实现LRU算法,就要用该构造方法,将accessOrder置为true。

  • LinkedHashMap是如何实现LRU的。首先,当accessOrder为true时,才会开启按访问顺序排序的模式,才能用来实现LRU算法。咱们能够看到,不管是put方法仍是get方法,都会致使目标Entry成为最近访问的Entry,所以便把该Entry加入到了双向链表的末尾(get方法经过调用recordAccess方法来实现,put方法在覆盖已有key的状况下,也是经过调用recordAccess方法来实现,在插入新的Entry时,则是经过createEntry中的addBefore方法来实现),这样便把最近使用了的Entry放入到了双向链表的后面,屡次操做后,双向链表前面的Entry即是最近没有使用的,这样当节点个数满的时候,删除的最前面的Entry(head后面的那个Entry)即是最近最少使用的Entry。

21六、ThreadLocal原理

首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,通常状况下,经过ThreadLocal.set() 到线程中的对象是该线程本身使用的对象,其余线程是不须要访问的,也访问不到的。各个线程中访问的是不一样的对象。

另外,说ThreadLocal使得各线程可以保持各自独立的一个对象,并非经过ThreadLocal.set()来实现的,而是经过每一个线程中的new 对象 的操做来建立的对象,每一个线程建立一个,不是什么对象的拷贝或副本。经过ThreadLocal.set()将这个新建立的对象的引用保存到各线程的本身的一个map中,每一个线程都有这样一个map,执行ThreadLocal.get()时,各线程从本身的map中取出放进去的对象,所以取出来的是各自本身线程中的对象,ThreadLocal实例是做为map的key来使用的。

若是ThreadLocal.set()进去的东西原本就是多个线程共享的同一个对象,那么多个线程的ThreadLocal.get()取得的仍是这个共享对象自己,仍是有并发访问问题。 
ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。概括了两点:

  • 每一个线程中都有一个本身的ThreadLocalMap类对象,能够将线程本身的对象保持到其中,各管各的,线程能够正确的访问到本身的对象。

  • 将一个共用的ThreadLocal静态实例做为key,将不一样对象的引用保存到不一样线程的ThreadLocalMap中,而后在线程执行的各处经过这个静态ThreadLocal实例的get()方法取得本身线程保存的那个对象,避免了将这个对象做为参数传递的麻烦。

若是要把原本线程共享的对象经过ThreadLocal.set()放到线程中也能够,能够实现避免参数传递的访问方式,可是要注意get()到的是那同一个共享对象,并发访问问题要靠其余手段来解决。但通常来讲线程共享的对象经过设置为某类的静态变量就能够实现方便的访问了,彷佛不必放到线程中。 
ThreadLocal的应用场合,我以为最适合的是按线程多实例(每一个线程对应一个实例)的对象的访问,而且这个对象不少地方都要用到。 
ThreadLocal类中的变量只有这3个int型:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> threadLocalHashCode = nextHashCode();
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> nextHashCode = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> HASH_INCREMENT = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x61c88647</span>;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

而做为ThreadLocal实例的变量只有threadLocalHashCode 这一个,nextHashCode 和HASH_INCREMENT 是ThreadLocal类的静态变量,实际上HASH_INCREMENT是一个常量,表示了连续分配的两个ThreadLocal实例的threadLocalHashCode值的增量,而nextHashCode 的表示了即将分配的下一个ThreadLocal实例的threadLocalHashCode 的值。 
建立一个ThreadLocal实例即new ThreadLocal()时作了哪些操做,从构造函数ThreadLocal()里看什么操做都没有,惟一的操做是这句:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> threadLocalHashCode = nextHashCode();
nextHashCode()作了什么呢:
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">synchronized</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">nextHashCode</span>() {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> h = nextHashCode;
    nextHashCode = h + HASH_INCREMENT;
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> h;
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

就是将ThreadLocal类的下一个hashCode值即nextHashCode的值赋给实例的threadLocalHashCode,而后nextHashCode的值增长HASH_INCREMENT这个值。 
所以ThreadLocal实例的变量只有这个threadLocalHashCode,并且是final的,用来区分不一样的ThreadLocal实例,ThreadLocal类主要是做为工具类来使用,那么ThreadLocal.set()进去的对象是放在哪儿的呢? 
看一下上面的set()方法,两句合并一下成为

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">ThreadLocalMap map = Thread<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.currentThread</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.threadLocals</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

这个ThreadLocalMap 类是ThreadLocal中定义的内部类,可是它的实例却用在Thread类中:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Thread</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">implements</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Runnable</span> {</span>
    ......
    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */</span>
    ThreadLocal.ThreadLocalMap threadLocals = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>;  
    ......
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

再看这句。

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (map != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>)
map.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">set</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

也就是将该ThreadLocal实例做为key,要保持的对象做为值,设置到当前线程的ThreadLocalMap 中,get()方法一样相似。

21七、Static Nested Class 和 Inner Class的不一样?

1 建立一个static内部类的对象,不须要一个外部类对象。建立一个非static内部类必需要一个外部类对象 
2 不能从一个static内部类的一个对象访问一个外部类对象,能够从一个非static内部类访问其外部类对象。如OutterClassName.this进行访问。

21八、当你在浏览器输入一个网址,好比http://www.taobao.com,按回车以后发生了什么?请从技术的角度描述,如浏览器、网络(UDP,TCP,HTTP等),以及服务器等各类参数与对象上由此引起的一系列活动。请尽量的涉及到全部的关键技术点。

答案:答题角度有如下几个DNS域名查找,负载均衡,HTTP协议格式,HTTP下一层的TCP协议,服务器应该返回的各类网络的应答。

一、经过访问的域名找出其IP地址。DNS查找过程以下: 
浏览器缓存:浏览器会缓存DNS记录,并存放一段时间。 
系统缓存:若是浏览器缓存中没有找到须要的记录,浏览器会作一个系统调用。 
路由器缓存:接着前面的查询请求发向路由器,它通常会有本身的DNS缓存。 
ISP DNS缓存:接下来要check的就是ISP缓存的DNS服务器,在这通常都能找到相应的缓存记录 
递归搜索:你的ISP的DNS服务器从根域名服务器开始进行递归搜索,从.com顶级域名服务器到叶节点服务器。

二、上述这种域名解析的方式彷佛只能解析出一个ip,咱们知道通常的大型网站都有好几个ip地址,这种问题如何解决?还好,有几种方法能够消除这个瓶颈: 
轮叫调度(round-robin DNS):是DNS查找时返回多个IP时的解决方案。举例来讲,Facebook.com实际上就对应了四个IP地址。 
负载均衡:是以一个特定IP地址进行侦听并将网络请求转发到集群服务器上的硬件设备。一些大型的站点通常都会使用这种昂贵的高性能负载均衡 
地理DNS:根据用户所处的地理位置,经过把域名映射到多个不一样的IP地址提升可扩展性。这样不一样的服务器不可以更新同步状态,但映射静态内容的话很是好。 
Anycast:是一个IP地址映射多个物理主机的路由技术。美中不足,Anycast与TCP协议适应的不是很好,因此不多应用在那些方案中。大多数DNS服务器使用Anycast来得到高效低延迟的DNS查找。

三、浏览器给Web服务器发送一个Http请求 
这里能够回答的更详细一点:好比说http协议的格式,http请求的头,好比说发起一个Get类型请求。

四、服务器给浏览器响应一个301永久重定向响应 
为何要有这一步,缘由之一是为了便于搜索引擎优化

五、浏览器跟中重定向地址 
这个时候浏览器已经知道了正确的URL地址,因而从新发送一个Get请求,请求头中的URL为重定向以后的。

六、服务器处理请求 
Web服务器软件:web服务器软件(IIS和Apatch)介绍到Http请求,而后肯定执行什么请求处理来处理它。请求处理就是一个可以读懂请求而且能生成HTML来进行相应的程序 
请求处理:请求处理阅读请求及它的参数和cookies。它会读取也可能更新一些数据,并将数据存储在服务器上。而后,需求处理会生成一个HTML响应。

七、服务器发回一个HTML响应

八、浏览器开始渲染这个HTML

九、浏览器发送获取嵌入在HTML中的资源对象请求 
一些嵌入在html中的资源,好比说图片,js,css等等

十、浏览器发送异步(AJAX)请求 
在web2.0时代,在页面渲染成功以后,浏览器依然能够跟服务器进行交互,方法就是经过这个异步请求AJAX 
下面这个答案说的尽管跟这道题目关系不大,可是颇有意思。因此仍是给出来: 
你打开了www.taobao.com,这时你的浏览器首先查询DNS服务器,将www.taobao.com转换成ip地址。不过首先你会发现,你在不一样的地区或者不一样的网络(电信,联通,移动)的状况下,转换后的ip地址极可能是不同的,这首先涉及到负载均衡的第一步,经过DNS解析域名时将你的访问分配到不一样的入口,同时尽量保证你所访问的入口是全部入口中可能较快的一个。 
你经过这个入口成功的访问了www.taobao.com的实际的入口ip地址。这时你产生了一个PV,即Page View,页面访问。每日每一个网站的总PV量是形容一个网站规模的重要指标。淘宝网全网在平日(非促销期间)的PV大概是16-25亿之间。同时做为一个独立的用户,你此次访问淘宝网的全部页面,均算做一个UV(Unique Visitor用户访问)。 
由于同一时刻访问www.taobao.com的人数过于巨大,因此即使是生成淘宝首页页面的服务器,也不可能仅有一台。仅用于生成www.taobao.com首页的服务器就有可能有成百上千台,那么你的一次访问时生成页面给你看的任务便会被分配给其中一台服务器完成。这个过程要保证公平公正(也就是说这成百上千台服务器每台负担的用户数要差很少),这一很复杂的过程是由几个系统配合完成,其中最关键的即是LVS,Linux Virtual Server,世界上最流行的负载均衡系统之一。 
通过一系列复杂的逻辑运算和数据处理,用于此次给你看的淘宝网的首页的HTML内容便生成成功了,对Web前端稍微有点常识的童鞋都应该知道,下一步浏览器会去加载页面中用到的css,js,图片等样式,脚本和资源文件。可是可能相对较少的同窗才会知道,你的浏览器在同一个域名下并发加载的资源数量是有限制的,例如ie6-7是两个,ie8是6个,chrome个版本不大同样,通常是4-6个。我刚刚看了一下,我访问的淘宝网首页须要加载126个资源,那么如此小的并发链接数天然会加载好久。因此前端开发人员每每会将上述的这些资源文件分布在好多个域名下,变相的绕过浏览器的这个限制,同时也为下文的CDN工做作准备。 
据不可靠消息,在双十一当天高峰,淘宝的访问流量达到最巅峰达到871GB/S。这个数字意味着须要178万个4mb带宽的家庭带宽才能负担的起,也彻底有能力拖垮一个中小城市的所有互联网带宽。那么显然,这些访问流量不可能集中在一块儿。而且你们都知道,不一样地区不一样网络(电信,联通等)之间互访会很是缓慢,可是你却发现不多发现淘宝网访问缓慢。这即是CDN,Content Delivery Network,即内容分发网络的做用。淘宝在全国各地创建了上百个CDN节点,利用一些手段保证你的访问的(这里主要指js、css、图片等)地方是离你最近的CDN节点,这样便保证了大流量分散已经在各地访问的加速。 
这便出现了一个问题,那就是假如一个卖家发布了一个新宝贝,上传了几张新的宝贝图片,那么淘宝网如何保证全国各地的CDN节点中都会同步的存在这几张图片供用户使用呢?这里边就涉及到大量的内容分发与同步的相关技术。淘宝开发了分布式文件系统TFS来处理这类问题。

21九、进程间通讯的方法主要有如下几种:

  • 管道(Pipe):管道可用于具备亲缘关系进程间的通讯,容许一个进程和另外一个与它有共同祖先的进程之间进行通讯。

  • 命名管道(named pipe):命名管道克服了管道没有名字的限制,所以,除具备管道所具备的功能外,它还容许无亲缘关系进程间的通讯。命名管道在文件系统中有对应的文件名。命名管道经过命令mkfifo或系统调用mkfifo来建立。

  • 信号(Signal):信号是比较复杂的通讯方式,用于通知接受进程有某种事件发生,除了用于进程间通讯外,进程还能够发送信号给进程自己;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又可以统一对外接口,用sigaction函数从新实现了signal函数)。

  • 消息(Message)队列:消息队列是消息的连接表,包括Posix消息队列system V消息队列。有足够权限的进程能够向队列中添加消息,被赋予读权限的进程则能够读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

  • 共享内存:使得多个进程能够访问同一块内存空间,是最快的可用IPC形式。是针对其余通讯机制运行效率较低而设计的。每每与其它通讯机制,如信号量结合使用,来达到进程间的同步及互斥。

  • 内存映射(mapped memory):内存映射容许任何多个进程间通讯,每个使用该机制的进程经过把一个共享的文件映射到本身的进程地址空间来实现它。

  • 信号量(semaphore):主要做为进程间以及同一进程不一样线程之间的同步手段。

  • 套接字(Socket):更为通常的进程间通讯机制,可用于不一样机器之间的进程间通讯。起初是由Unix系统的BSD分支开发出来的,但如今通常能够移植到其它

类Unix系统上:Linux和System V的变种都支持套接字。而在java中咱们实现多线程间通讯则主要采用”共享变量”和”管道流”这两种方法

  • 方法一 经过访问共享变量的方式(注:须要处理同步问题)
  • 方法二 经过管道流

其中方法一有两种实现方法,即 
- 经过内部类实现线程的共享变量 
- 经过实现Runnable接口实现线程的共享变量

2十、什么是trie树(单词查找树、字典树)?

1.Trie树 (特例结构树)

Trie树,又称单词查找树、字典树,是一种树形结构,是一种哈希树的变种,是一种用于快速检索的多叉树结构。典型应用是用于统计和排序大量的字符串(但不只限于字符串),因此常常被搜索引擎系统用于文本词频统计。它的优势是:最大限度地减小无谓的字符串比较,查询效率比哈希表高。 
Trie的核心思想是空间换时间。利用字符串的公共前缀来下降查询时间的开销以达到提升效率的目的。 
Trie树也有它的缺点,Trie树的内存消耗很是大.固然,或许用左儿子右兄弟的方法建树的话,可能会好点. 
2. 三个基本特性:  

  • 1)根节点不包含字符,除根节点外每个节点都只包含一个字符。  

  • 2)从根节点到某一节点,路径上通过的字符链接起来,为该节点对应的字符串。 

  • 3)每一个节点的全部子节点包含的字符都不相同。

3 .说明:和二叉查找树不一样,在trie树中,每一个结点上并不是存储一个元素。trie树把要查找的关键词看做一个字符序列。并根据构成关键词字符的前后顺序构造用于检索的树结构。在trie树上进行检索相似于查阅英语词典。 一棵m度的trie树或者为空,或者由m棵m度的trie树构成。

查找分析 
在trie树中查找一个关键字的时间和树中包含的结点数无关,而取决于组成关键字的字符数。而二叉查找树的查找时间和树中的结点数有关O(log2n)。 
若是要查找的关键字能够分解成字符序列且不是很长,利用trie树查找速度优于 
二叉查找树。如: 
若关键字长度最大是5,则利用trie树,利用5次比较能够从26^5=11881376个可能的关键字中检索出指定的关键字。而利用二叉查找树至少要进行 次比较。

trie树的应用:

  • 字符串检索,词频统计,搜索引擎的热门查询。
  • 字符串最长公共前缀。
  • 排序。
  • 做为其余数据结构和算法的辅助结构。如后缀树,AC自动机等。

22一、在25匹马中,挑出速度最快的3匹。每场比赛只能有5马一块儿跑。所须要的最少比赛次数是多少

至少7次 
先分为5组,每组5匹。 
首先所有5组分别比赛; 
其次,每组的第一名进行第六次比赛:这样可淘汰最后两名及其所在组的所有马匹(共10匹),同时可淘汰第三名所在组排名靠后的其他4匹马,以及第二名所在组的排名最后的3匹,再加上第一名所在小组的最后2名,共计淘汰19名,同时产生25匹中的冠军(即本轮的第一名)。 

最后,剩余的5匹进行第7次比赛,前两名为25匹中的亚军和季军。


转自:http://blog.csdn.net/derrantcm/article/details/46658823

相关文章
相关标签/搜索