题目来自http://www.codeceo.com/article/201-java-interview-qa.html,答案自己网上找的,如有疏漏,欢迎斧正。一起学习,共同进步。
一.Java基础
1. String类为什么是final的。
2. HashMap的源码,实现原理,底层结构。
3. 说说你知道的几个Java集合类:list、set、queue、map实现类咯。
4. 描述一下ArrayList和LinkedList各自实现和区别。
5. Java中的队列都有哪些,有什么区别。
6. 反射中,Class.forName和classloader的区别。
7. Java7、Java8的新特性(baidu问的,好BT)。
8. Java数组和链表两种结构的操作效率,在哪些情况下(从开头开始,从结尾开始,从中间开始),哪些操作(插入,查找,删除)的效率高。
9. Java内存泄露的问题调查定位:jmap,jstack的使用等等。
10. string、stringbuilder、stringbuffer区别。
11. hashtable和hashmap的区别。
13.异常的结构,运行时异常和非运行时异常,各举个例子。
14.String a= “abc” String b = “abc” String c = new String(“abc”) String d = “ab” + “c” .他们之间用 == 比较的结果。
15. String 类的常用方法。
16. Java 的引用类型有哪几种。
17. 抽象类和接口的区别?
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。另外,接口和抽象类在方法上有区别:
(1) 抽象类可以有构造方法,接口中不能有构造方法。
(2) 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。Java 8里的接口可以有default方法。
(3) 抽象类中可以有普通成员变量,接口中没有普通成员变量。
(4) 抽象类中的抽象方法的访问类型可以是public,protected和默认类型。
(5) 抽象类中可以包含静态方法,接口中不能包含静态方法。
(6) 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
(7) 一个类可以实现多个接口,但只能继承一个抽象类。二者在应用方面也有一定的区别:接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码。
18. java的基础类型和字节大小。
Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。8 中类型表示范围如下:
byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。
Java决定了每种简单类型的大小。这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是Java程序具有很强移植能力的原因之一。下表列出了Java中定义的简单类型、占用二进制位数及对应的封装器类。
19. Hashtable,HashMap,ConcurrentHashMap底层实现原理与线程安全问题?
可参考的文章:Hashmap实现原理浅析:http://www.cnblogs.com/lzrabbit/p/3721067.html
ConcurrentHashMap原理分析:http://www.cnblogs.com/ITtangtang/p/3948786.html
20.如果不让你用Java Jdk提供的工具,你自己实现一个Map,你怎么做。说了好久,说了HashMap源代码,如果我做,就会借鉴HashMap的原理,说了一通HashMap实现。
21.Hash冲突怎么办?哪些解决散列冲突的方法?
22.HashMap冲突很厉害,最差性能,你会怎么解决? 从O(n)提升到log(n),用二叉排序树的思路说了一通。
23.rehash。
24.hashCode() 与 equals() 生成算法、方法怎么重写。
二.Java IO
1.讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。
2.讲讲NIO。
3.String 编码UTF-8 和GBK的区别?
4.什么时候使用字节流、什么时候使用字符流?
5.递归读取文件夹下的文件,代码怎么实现。
三.Java Web
1.session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。
2.servlet的一些相关问题。
3.webservice相关问题。
4.jdbc连接,forName方式的步骤,怎么声明使用一个事务。举例并具体代码。
参考文章:http://www.cnblogs.com/hongten/archive/2011/03/29/1998311.html
5.无框架下配置web.xml的主要配置内容。
web.xml配置详解1: https://my.oschina.net/u/1383439/blog/224448
web.xml配置详解2:http://www.cnblogs.com/chinafine/archive/2010/09/02/1815980.html
6.jsp和servlet的区别。
(1) jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码, Web容器将JSP的代码编译成JVM能够识别的java类)
(2) jsp更擅长表现于页面显示, servlet更擅长于逻辑控制.
(3) Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
四.JVM
1.Java的内存模型以及GC算法。
参考答案:http://blog.csdn.net/kingofworld/article/details/17718587
2.jvm性能调优都做了什么。
JVM性能调优: http://www.cnblogs.com/chen77716/archive/2010/06/26/2130807.html
深入理解JVM性能调优: http://www.open-open.com/lib/view/open1334729637702.html
3.介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明。
深入理解JVM之内存区域与内存溢出: http://www.codeceo.com/article/jvm-memory-overflow.html
4.介绍GC 和GC Root不正常引用。
没有找到很好的答案,只找到了关于GC Root的介绍:http://blog.csdn.net/fenglibing/article/details/8928927
5.自己从classload加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。反正就是各种扩展。
6.jvm 如何分配直接内存, new 对象如何不分配在堆而是栈上,常量池解析.
(2) JAVA NEW关键字分配的对象只能在堆上。
7.数组多大放在 JVM 老年代。(不只是设置 PretenureSizeThreshold ,问通常多大,没做过一问便知)
大对象直接进入老年代: http://book.51cto.com/art/201107/278927.htm
Java整型数组的最大长度到底有多长: http://blog.csdn.net/mayumin/article/details/5904974
8.老年代中数组的访问方式
JVM的内存分配及运行机制: http://www.cnblogs.com/200911/p/3922704.html
没有被GC回收,在不在老年代都通过数组引用访问.
9.GC算法,永久代对象如何GC,GC有环怎么处理。
1) Java的GC机制及算法:http://blog.chinaunix.net/uid-7374279-id-4489100.html
Java GC基本算法: http://www.blogjava.net/showsun/archive/2011/07/21/354745.html
2) Java内存区域和GC机制: http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html
永久代的回收有两种:常量池中的常量,无用的类信息,常量的回收很简单,没有引用了就可以被回收。对于无用的类进行回收,必须保证3点:
(1) 类的所有实例都已经被回收;
(2) 加载类的ClassLoader已经被回收;
(3) 类对象的Class对象没有被引用(即没有通过反射引用该类的地方).3) 基于引用对象遍历的垃圾回收器可以处理循环引用,只要是涉及到的对象不能从GC Roots强引用可到达,垃圾回收器都会进行清理来释放内存。
10.谁会被GC,什么时候 GC。
(1) 超出了作用域或引用计数为空的对象;从gc root开始搜索找不到的对象,而且经过一次标记、清理,仍然没有复活的对象。
(2) 程序员不能具体控制时间,系统在不可预测的时间调用System.gc()函数的时候;当然可以通过调优,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制进入oldObject的次数,使得oldObject 存储空间延迟达到full gc,从而使得计时器引发gc时间延迟OOM的时间延迟,以延长对象生存期。
11.如果想不被GC怎么办。
只要存在某对象的强引用,就不会被GC回收.
12.如果想在GC中生存1次怎么办。
想在对象生命周期中至少被GC一次后存活,最简单的方法是重写Object的finalize()。
五.开源框架
1.Hibernate和ibatis的区别.
2.讲讲mybatis的连接池。
《深入理解mybatis原理》Mybatis数据源与连接池: http://blog.csdn.net/luanlouis/article/details/37671851
3.Spring框架中需要引用哪些jar包,以及这些jar包的用途.
Spring—jar包详解: http://www.cnblogs.com/yanjunwu/archive/2013/04/06/3001927.html
4.SpringMVC的原理.
(1) SpringMVC 的工作原理: http://www.cnblogs.com/zbf1214/p/5265117.html
(2) Spring框架和MVC原理: http://www.cnblogs.com/jingmoxukong/p/4506493.html
5.SpringMVC注解的意思.
SpringMVC常用的注解和含义: http://blog.csdn.net/dandandeshangni/article/details/47974461
6.Spring中beanFactory和ApplicationContext的联系和区别.
BeanFactory 和 ApplicationContext 的区别: http://www.cnblogs.com/lihuiyy/archive/2012/05/22/2512712.html
Spring中ApplicationContext和beanfactory区别: http://blog.csdn.net/hi_kevin/article/details/7325554
7.Spring注入的几种方式(循环注入).
Spring四种依赖注入方式: http://blessht.iteye.com/blog/1162131
(1)Set注入;
(2)构造器注入;
(3)静态工厂的方法注入;
(4)实例工厂的方法注入.
8.Spring如何实现事物管理的.
Spring事务管理: http://www.cnblogs.com/newsouls/p/3988216.html
9.SpringIOC.
谈谈对Spring IOC的理解: http://www.cnblogs.com/xdp-gacl/p/4249939.html
10.Spring AOP的原理.
(1) 代理类的生成与载入;
(2) 拦截链的理解与阐述.
Spring的AOP原理: https://my.oschina.net/elain/blog/382494
11.Hibernate中的1级和2级缓存的使用方式以及区别原理(Lazy-Load的理解).
Hibernate缓存:一级缓存和二级缓存: http://www.cnblogs.com/200911/archive/2012/10/09/2716873.html
1)延迟加载 : 当程序执行getter方法获取时,才发送sql语句加载数据.
延迟加载给程序带来好处,但是要避免session过早关闭问题.
(1)load()和get()两个方法区别:
load()采用延迟加载机制,返回的是一个proxy代理对象
get()没有采用延迟加载,返回的是一个对象实例
(2)Hibernate.initialize(user): 可以强制user对象实例化
(3)hbm映射描述文件中,<class>,<property>,<set>等元素, 都可以使用lazy属性,默认lazy="true",启用延迟加载.
2)缓存机制
Hibernate每次查询先去缓存中查找,没有才去数据库查询.
(1)一级缓存:
Session级别的缓存,缓存load,get出来的单个对象.默认开启.
使用同一个Session对象多次查询同一个User对象,只会发送一次SQL取数据库获取.
(2)二级缓存
SessionFactory级别的缓存.默认情况是关闭.
①首先在hibernate.cfg.xml中指定EhCache缓存策略.
②在src下添加ehcache.xml配置文件.
③在User.hbm.xml中添加<cache/>定义.
<cache usage="read-only"/>,如果涉及更新,使用read-write.
12.Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理。
参考答案: http://blog.csdn.net/martinmateng/article/details/50879436
Hibernate的工作原理和体系结构: http://hong0104.iteye.com/blog/760813
Hibernate事务管理: http://xmllong.iteye.com/blog/1436769
六.网络通信
1.Http是无状态通信,http的请求方式有哪些,可以自己定义新的请求方式么。
2.Socket通信,以及长连接,分包,连接异常断开的处理。
Socket通信原理简介: http://www.jianshu.com/p/90348ef3f41e
Socket通信原理探讨: http://www.cnblogs.com/fuchongjundream/p/3914696.html
3.Socket通信模型的使用,AIO和NIO。
也谈BIO | NIO | AIO: https://my.oschina.net/bluesky0leon/blog/132361
4.Socket框架netty的使用,以及NIO的实现原理,为什么是异步非阻塞。
Netty原理和使用: http://www.jdon.com/concurrent/netty.html
5.同步和异步,阻塞和非阻塞。
同步与异步的概念: http://blog.chinaunix.net/uid-21411227-id-1826898.html
Socket阻塞与非阻塞,同步与异步、I/O模型: http://blog.csdn.net/hguisu/article/details/7453390
6.OSI七层模型,包括TCP,IP的一些基本知识.
TCP IP基础知识的复习: http://www.cnblogs.com/rollenholt/archive/2012/04/25/2469592.html
7.Http中,get post的区别.
GET和POST有什么区别: http://www.cnblogs.com/nankezhishi/archive/2012/06/09/getandpost.html
8.说说http,tcp,udp之间关系和区别。
TCP、UDP和HTTP详解:http://blog.sina.com.cn/s/blog_bf9843bf0101j5w8.html
HTTP TCP UDP Socket关系的几个经典图: http://www.cnblogs.com/ghj1976/p/4295346.html
9.说说浏览器访问www.taobao.com,经历了怎样的过程。
首先是查找浏览器缓存,浏览器会保存一段时间你之前访问过的一些网址的DNS信息,不同浏览器保存的时常不等。
如果没有找到对应的记录,这个时候浏览器会尝试调用系统缓存来继续查找这个网址的对应DNS信息。
如果还是没找到对应的IP,那么接着会发送一个请求到路由器上,然后路由器在自己的路由器缓存上查找记录,路由器一般也存有DNS信息。
如果还是没有,这个请求就会被发送到ISP(注:Internet Service Provider,互联网服务提供商,就是那些拉网线到你家里的运营商,中国电信中国移动什么的),ISP也会有相应的ISP DNS服务器,一听中国电信就知道这个DNS服务器的规模肯定不会小,所以基本上都能在这里找得到。题外话:会跑到这里进行查询是因为你没有改动过"网络中心"的"ipv4"的DNS地址,万恶的电信联通可以改动了这个DNS服务器,换句话说他们可以让你的浏览器跳转到他们设定的页面上,这也就是人尽皆知的DNS和HTTP劫持,ISP们还美名曰“免费推送服务”。强烈鄙视这种霸王行为。我们也可以自行修改DNS服务器来防止DNS被ISP污染。
如果还是没有的话, 你的ISP的DNS服务器会将请求发向根域名服务器进行搜索。根域名服务器就是面向全球的*DNS服务器,共有13台逻辑上的服务器,从A到M命名,真正的实体服务器则有几百台,分布于全球各大洲。所以这些服务器有真正完整的DNS数据库。如果到了这里还是找不到域名的对应信息,那只能说明一个问题:这个域名本来就不存在,它没有在网上正式注册过。或者卖域名的把它回收掉了(通常是因为欠费)。
这也就是为什么打开一个新页面会有点慢,因为本地没什么缓存,要这样递归地查询下去。
多说一句,例如"mp3.baidu.com",域名先是解析出这是个.com的域名,然后跑到管理.com域名的服务器上进行进一步查询,然后是.baidu,最后是mp3,
所以域名结构为:三级域名.二级域名.一级域名。
浏览器终于得到了IP以后,浏览器接着给这个IP的服务器发送了一个http请求,方式为get,例如访问nbut.cn
这个get请求包含了主机(host)、用户代理(User-Agent),用户代理就是自己的浏览器,它是你的"代理人",Connection(连接属性)中的keep-alive表示浏览器告诉对方服务器在传输完现在请求的内容后不要断开连接,不断开的话下次继续连接速度就很快了。其他的顾名思义就行了。还有一个重点是Cookies,Cookies保存了用户的登陆信息,在每次向服务器发送请求的时候会重复发送给服务器。Corome上的F12与Firefox上的firebug(快捷键shift+F5)均可查看这些信息。
发送完请求接下来就是等待回应了,如下图:
当然了,服务器收到浏览器的请求以后(其实是WEB服务器接收到了这个请求,WEB服务器有iis、apache等),它会解析这个请求(读请求头),然后生成一个响应头和具体响应内容。接着服务器会传回来一个响应头和一个响应,响应头告诉了浏览器一些必要的信息,例如重要的Status Code,2开头如200表示一切正常,3开头表示重定向,4开头,如404,呵呵。响应就是具体的页面编码,就是那个<html>......</html>,浏览器先读了关于这个响应的说明书(响应头),然后开始解析这个响应并在页面上显示出来。在下一次CF的时候(不是穿越火线,是http://codeforces.com/),由于经常难以承受几千人的同时访问,所以CF页面经常会出现崩溃页面,到时候可以点开火狐的firebug或是Chrome的F12看看状态,不过这时候一般都急着看题和提交代码,似乎根本就没心情理会这个状态吧。
如果是个静态页面,那么基本上到这一步就没了,但是如今的网站几乎没有静态的了吧,基本全是动态的。所以这时候事情还没完,根据我们的经验,浏览器打开一个网址的时候会慢慢加载这个页面,一部分一部分的显示,直到完全显示,最后标签栏上的圈圈就不转了。
这是因为,主页(index)页面框架传送过来以后,浏览器还要继续向服务器发送请求,请求的内容是主页里面包含的一些资源,如图片,视频,css样式等等。这些"非静态"的东西要一点点地请求过来,所以标签栏转啊转,内容刷啊刷,最后全部请求并加载好了就终于好了。
需要说明的是,对于静态的页面内容,浏览器通常会进行缓存,而对于动态的内容,浏览器通常不会进行缓存。缓存的内容通常也不会保存很久,因为难保网站不会被改动。
10.HTTP协议、 HTTPS协议,SSL协议及完整交互过程.
HTTPS协议, SSL协议及完整交互过程: http://blog.csdn.net/dfsaggsd/article/details/50910999
HTTP协议详解:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html
11.Tcp的拥塞,快回传,ip的报文丢弃.
TCP的拥塞控制: http://blog.csdn.net/sicofield/article/details/9708383
IP报文头详解以及定义: http://www.cnblogs.com/xsiedu/articles/1741584.html
12.Https处理的一个过程,对称加密和非对称加密.
对称加密与非对称加密: http://www.cnblogs.com/jfzhu/p/4020928.html
SSH加密原理、RSA非对称加密算法学习与理解: https://my.oschina.net/realfighter/blog/388486
13.Head各个特点和区别.