转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
原文:http://www.cnblogs.com/wang-meng/p/5898837.html
第一部分: Java基础(此部分面试题题目来自:http://www.hollischuang.com/archives/10 答案是搜集与互联网)
(为了方便,我把他们分了类,有一些是必看的,我用!标注,有一些进阶型的我用%标注,有一些需要了解的,我用?标注。)
一:继承、抽象类与接口区别、访问控制(private, public, protected,默认)、多态相关 !2、是否可以继承多个接口,是否可以继承多个抽象类 %3、Static Nested Class 和 Inner Class的不同 !4、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型? !5、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized
!7、构造器Constructor是否可被override? !8、作用域public,protected,private,以及不写时的区别?
!2、List、Set、Map是否都继承自Collection接口? !3、HashMap和Hashtable的区别 1.HashTable的方法是同步的,在方法的前面都有synchronized来同步,HashMap未经同步,所以在多线程场合要手动同步 1 int hash = hash(k); 2 int i = indexFor(hash, table.length); 3 static int hash(Object x) { 4 h ^= (h >>> 20) ^ (h >>> 12); 5 return h ^ (h >>> 7) ^ (h >>> 4); 6 } &&延展: public HashSet() { map = new HashMap<E,Object>(); }
private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; } B、HashMap 和 ConcurrentHashMap 的关系 %4、HashMap中是否任何对象都可以做为key,用户自定义对象做为key有没有什么要求? !5、Collection 和 Collections的区别 %6、其他的集合类:concurrenthashmap,treemap,treeset,linkedhashmap等。
!3、内存溢出和内存泄露 (a)对于内存的溢出可能发生的情况,大概有几种: (b)对于内存泄露可能发生的情况,大概有几种: 四:其他 2,是否多线程安全 !2、String s = “123”;这个语句有几个对象产生
1 public boolean equals(Object anObject) 2 { 3 //如果是同一个对象 4 if (this == anObject) 5 { 6 return true; 7 } 8 //如果传递进来的参数是String类的实例 9 if (anObject instanceof String) 10 { 11 String anotherString = (String)anObject; 12 int n = count;//字符串长度 13 if (n == anotherString.count) //如果长度相等就进行比较 14 { 15 char v1[] = value;//取每一个位置的字符 16 char v2[] = anotherString.value; 17 int i = offset; 18 int j = anotherString.offset; 19 while (n-- != 0) //对于每一位置逐一比较 20 { 21 if (v1[i++] != v2[j++]) 22 return false; 23 } 24 return true; 25 } 26 } 27 return false; 28 }
%9、了解过哪些JDK8的新特性,举例描述下相应的特性? !12、启动一个线程是用run()还是start()?
!15、多线程与死锁 %16、Java的四种引用 五:JAVA开发工具、环境的使用 |
第二部分: Java高级
一:多线程 public class RunThread implements Runnable{} public static void main(String[] args){ RunThread thread = new RunThread(); new Thread(thread).start(); new Thread(thread).start(); }
%4、如何停止一个线程? !5、解释是一下什么是线程安全?举例说明一个线程不安全的例子。解释Synchronized关键字的作用。 !6、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 二:内存结构,GC %2、Java中的内存溢出是如何造成的 第一种OutOfMemoryError: PermGen space %3、jvm gc如何判断对象是否需要回收,有哪几种方式? 2.不可达对象一定会被回收吗
三:CLASSLOADER 四:NIO 五:其他 |
第三部分: JavaEE
一:Servlet的掌握,包括新的异步Servlet %2、servlet中,如何定制session的过期时间? session.setMaxInactiveInterval(30*60); !3、Servlet中的session工作原理 (禁用cookie如何使用session)
服务器在执行jsp的时候,首先把jsp翻译成一个Servlet,所以我们访问jsp时,其实不是在访问jsp,而是在访问jsp翻译过后的那个Servlet ?6、JSP的动态include和静态include
三:http相关(内部重定向,外部重定向),http返回码 !5、在web开发中,用redirect与forward做跳转有什么区别?web应用服务器对用户请求通常返回一些状态码,请描述下分别以4和5开头的状态码 四:spring,ibatis,hibernate相关 五:jboss,tomcat等容器相关 六:web安全,SQL注入,XSS, CSRF等 七:AJAX相关 八:Web Service 九:JMS 十:其他 |
第四部分: 数据库相关
一:关系模型理论: 二:事务相关 三:并发控制 四:ORACLE或MYSQL题目 五:其他 |
第五部分: 设计模式
一:高内聚,低耦合方面的理解 二:设计模式方面 三:其他 |
第六部分: 其他清单 只有题目
J2SE基础 1. 九种基本数据类型的大小,以及他们的封装类。 (2)byte——1 byte——Byte (3)short——2 bytes——Short (4)int——4 bytes——Integer (5)long——8 bytes——Long (6)float——4 bytes——Float (7)double——8 bytes——Double (8)char——2 bytes——Character static Integer valueOf(int i) : 切记-127--+127范围, 使用cache 2. Switch能否用string做参数? 可以。在 Java 7之前,switch 只能支持 byte、short、char、int或者其对应的封装类以及 Enum 类型。 在 Java 7中,String支持被加上了。 3. equals与==的区别。 在java中的数据类型可以分为两类。 1,基本数据类型,他们之间的比较用==表示比较它们的值。 2,引用数据类型,当使用==进行比较时,比较的是它们内存中的存放地址是否相同。而equals内部也是直接引用的==。 但是equals是Object中的方法, 我们可以通过复写来改变equals的用法, 比如String中的equals只是比较两个变量的值是否相等: public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; } 4. Object有哪些公用方法? equals(), toString(), hashCode(), getClass(), notify(), notifyAll(), wait(), finalize(), clone() 5. Java的四种引用,强弱软虚,用到的场景。 6. Hashcode的作用。(这里来说明equals和hashCode的关联) 如果两个对象相等,那么他们一定有相同的哈希值(hash code)。 如果两个对象的哈希值相等,那么这两个对象有可能相等也有可能不相等。(需要再通过equals来判断) 1、equals方法用于比较对象的内容是否相等(覆盖以后) 2、hashcode方法只有在集合中用到 3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。 4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等, 如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等, 如果equals判断不相等,直接将该元素放入到集合中,否则不放入。 7. ArrayList、LinkedList、Vector的区别。 ArrayList: 内部采用数组存储元素,支持高效随机访问,支持动态调整大小 增删慢,查询快。 LinkedList: 内部采用链表来存储元素,支持快速插入/删除元素,但不支持高效地随机访问. 增删快,查询慢。 Vector: 可以看作线程安全版的ArrayList 8. String、StringBuffer与StringBuilder的区别。 这里插入知识点:String的intern 直接使用双引号声明出来的String对象会直接存储在常量池中。 如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若不存在就会将当前字符串放入常量池中 1. String类型是Java内的对象,是个不可变的对象,当每次对String进行改变时都需要生成一个新的String对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,而且对象多了,Java的垃圾自动回收机制会开始工作,所以效率很低,建议在不断更改String对象的地方不要使用String类型 2. StringBuffer 是个可变的对象,就是每次操作都是对对象本身进行操作,而不用生成新的对象,这样效率肯定就会有有很大的提高,在大部分情况下StringBuffer的效率要比String类型要高 3. StringBuilder 与StringBuffer一样是个可变的字符序列,提供与StringBuffer兼容的API,但是不能保证同步,用在字符串缓冲区被当个线程使用的情况,在单机非多线程的情况下使用StringBuilder会有比较好的效率,因为StringBuilder没有处理同步(Synchronized)问题。StringBuffer则会处理同步问题,如果StringBuilder会在多线程下被操作,则要改用StringBuffer,让对象自行管理同步问题。 9. Map、Set、List、Queue、Stack的特点与用法。 10. HashMap和HashTable的区别。 11. HashMap和ConcurrentHashMap的区别,HashMap的底层源码。 12. TreeMap、HashMap、LindedHashMap的区别。 13. Collection包结构,与Collections的区别。 14. try catch finally,try里有return,finally还执行么? 15. Excption与Error包结构。OOM你遇到过哪些情况,SOF你遇到过哪些情况。 16. Java面向对象的三个特征与含义。 17. Override和Overload的含义去区别。 18. Interface与abstract类的区别。 19. Static class 与non static class的区别。 20. java多态的实现原理。 21. 实现多线程的两种方法:Thread与Runable。 22. 线程同步的方法:sychronized、lock、reentrantLock等。 23. 锁的等级:方法锁、对象锁、类锁。 24. 写出生产者消费者模式。 25. ThreadLocal的设计理念与作用。 26. ThreadPool用法与优势。 27. Concurrent包里的其他东西:ArrayBlockingQueue、CountDownLatch等等。 28. wait()和sleep()的区别。 29. foreach与正常for循环效率对比。 30. Java IO与NIO。 31. 反射的作用于原理。 32. 泛型常用特点,List<String>能否转为List<Object>。 33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。 34. Java与C++对比。 35. Java1.7与1.8新特性。 36. 设计模式:单例、工厂、适配器、责任链、观察者等等。 37. JNI的使用。 JVM 1. 内存模型以及分区,需要详细到每个区放什么。 2. 堆里面的分区:Eden,survival from to,老年代,各自的特点。 3. 对象创建方法,对象的内存分配,对象的访问定位。 4. GC的两种判定方法:引用计数与引用链。 5. GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路? 6. GC收集器有哪些?CMS收集器与G1收集器的特点。 7. Minor GC与Full GC分别在什么时候发生? 8. 几种常用的内存调试工具:jmap、jstack、jconsole。 9. 类加载的五个过程:加载、验证、准备、解析、初始化。 10. 双亲委派模型:Bootstrap ClassLoader、Extension ClassLoader、ApplicationClassLoader。 11. 分派:静态分派与动态分派。 操作系统 1. 进程和线程的区别。 2. 死锁的必要条件,怎么处理死锁。 3. Window内存管理方式:段存储,页存储,段页存储。 4. 进程的几种状态。 5. IPC几种通信方式。 6. 什么是虚拟内存。 7. 虚拟地址、逻辑地址、线性地址、物理地址的区别 TCP/IP 1. OSI与TCP/IP各层的结构与功能,都有哪些协议。 2. TCP与UDP的区别。 3. TCP报文结构。 4. TCP的三次握手与四次挥手过程,各个状态名称与含义,TIMEWAIT的作用。 5. TCP拥塞控制。 6. TCP滑动窗口与回退N针协议。 7. Http的报文结构。 8. Http的状态码含义。 9. Http request的几种类型。 10. Http1.1和Http1.0的区别 11. Http怎么处理长连接。 12. Cookie与Session的作用于原理。 13. 电脑上访问一个网页,整个过程是怎么样的:DNS、HTTP、TCP、OSPF、IP、ARP。 14. Ping的整个过程。ICMP报文是什么。 15. C/S模式下使用socket通信,几个关键函数。 16. IP地址分类。 17. 路由器与交换机区别。 数据结构与算法 1. 链表与数组。 2. 队列和栈,出栈与入栈。 3. 链表的删除、插入、反向。 4. 字符串操作。 5. Hash表的hash函数,冲突解决方法有哪些。 6. 各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。 7. 快排的partition函数与归并的Merge函数。 8. 对冒泡与快排的改进。 9. 二分查找,与变种二分查找。 10. 二叉树、B+树、AVL树、红黑树、哈夫曼树。 11. 二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。 12. 图的BFS与DFS算法,最小生成树prim算法与最短路径Dijkstra算法。 13. KMP算法。 14. 排列组合问题。 15. 动态规划、贪心算法、分治算法。(一般不会问到) 16. 大数据处理:类似10亿条数据找出最大的1000个数.........等等
基础篇 JAVA基础 1、 JAVA基础 1) 抽象类和接口的区别? 补充问题:JAVA8中为什么要加入默认方法? 2) 静态内部类(static class)的作用? 3) 序列化和反序列化 4) 动态代理和静态代理的区别? 赠送问题:代理模式,什么是代理模式?如何实现?代理模式结构图是怎样的?代理模式应用在什么场景? 5) nio熟悉吗,nio和io的区别? 6) java8有哪些新特性? 2、 JAVA API 1) transient关键字的作用? 2) volatile关键字的作用? 3) abstract和final是否可同时使用? 4) ArrayList、LinkedList、vector的区别? 5) HashMap、LinkedHashMap,concurrentHashMap的区别,concurrentHashMap为什么特别好用,你看过源码吗? 6) collection的继承结构,你是否看过源码? 3、 JVM调优(性能) 1) 有哪些调优工具 2) 如何快速定位有问题代码 3) 内存溢出如何处理,如何调优 4) 垃圾回收机制,有哪些垃圾回收算法,如何配置垃圾回收策略 5) 新生代和老年代 4、 Tomcat tomcat可以稳定支持的最大并发用户数 Tomcat集群如何架设:Tomcat+Apache 集群时特别关注两个问题: 1:如何实现多应用服务器间的session共享:(一台服务器崩溃,另外一台服务器可以继续支持) 2:如何分发请求到各个应用服务器实现压力分解:(这里的解决方案是用apache做 web服务器) 算法问题 1、 生产者和消费者问题? 2、 查找算法有几种,写出实现代码? 3、 排序算法有几种,写出实现代码? 4、 遍历二叉树,分别按照前序、中序、后续? 5、 红黑树 程序题 1、 写出一个字符串,打印出字符串中字符的所有排序 2、 无序的有重复数据的list变成有序的无重复数据的list 框架篇 1、 Spring核心: 分别说说aop和IOC 事务配置的几种方式? spring有几种注入方式? spring依赖注入的四种装配方式? spring的几个重要注解@Component(不推荐使用)、@Repository、@Service、@Controller 2、 SpringMVC和Struts2:两者的区别 3、 Mybatis和Hibernate:两者的区别 mybatis如何实现多表关联查询 mybatis的resultMap mybatis的#和$ 4、 是否可以用maven搭建项目,maven如何构建web项目? 5、 git的使用 6、 当日志非常大时,如何查找需要的日志? 7、 SSH的局限有哪些 数据库篇 数据库基础 1、 MySQL和oracle的区别 2、 Oracle移植到mysql需要处理哪些 3、 存储过程 4、 mysql存储引擎innodb和myisam的区别 数据库优化 1、 sql优化 2、 索引 关于索引:联合索引A和B,当按照A、A和B、B查询时索引使用情况? 3、 数据库优化,使用过哪些优化工具:常用的SQLYOG、基准测试,expain、status等 具体问题: 如何找到并定位慢SQL? 如何确定表和查询是否是最优的? 枚举类型如何使用,枚举类型的误用带来的损失? 有没有什么工具可以监控数据库,快速查看有问题的sql?如果存在大批量有问题的sql,如何排查? 如何诊断响应差的(太多线程),僵尸进程(无响应或长时间运行),或者诊断连接问题? 如果在某段时间内用户反映服务器变慢,如何知道服务器性能差? 假设已经检查了所有常规信息——内存、磁盘等,而所有这些信息都在正常范围内,没有出现错误和异常,这时,你怎么知道系统是否运行变慢? 数据库进阶 1、 当数据库存储数据出现瓶颈,如何处理?——数据库水平拆分、垂直拆分 2、 说说水平拆分和垂直拆分,什么时候水平拆分,什么时候垂直拆分,分别解决了哪些问题,分别存在哪些不能解决的问题,如何结合使用? 3、 当水平拆分时,到不同的表和库中或不同的分布式服务器上时:不同的表可以联合查询(union)、不同的库可以加上库名进行联合查询;如果需要查询的数据分布在不同的服务器之间,如何查询?如何在存储数据时就将需要同时查询的数据放在同一服务器上(存储时取模或者按照时间分布数据,查询的时候取模或者按照时间查询) 4、 mysql读写分离 5、 数据库集群 升级篇 分布式 1、 有哪些分布式框架,对比其性能优劣? 同步调用:RSET(JAX-RS、Spring Boot)、RPC(Thrift、Dubbo、HSF) 异步调用:Kafka、Notify、MetaQ 同步和异步的区别,分别用于什么场景? 2、 dubbo + zookeeper 3、 nosql(redis、memcache、mongodb) 大并发的处理 1、 负载均衡 2、 分布式 3、 缓存 4、 数据库分库分表 5、 数据库集群 6、 图片服务器分离 7、 首页静态化 大数据问题: 假如每天产生5亿行日志文件,如何搜索到指定内容? 有一个100T大小的文件存放在磁盘中,不借助任何外部存储设备,如何统计指定字符串的个数? 同上,有一个文件,存放每天访问的URL,每天有100万条,如何统计URL的个数? 测试1000万条数据的查询 多线程 1、 有哪些多线程的应用场景 2、 你自己有写过多线程吗,在哪些场景 3、 线程池,java提供的线程池有哪几种? 4、 队列 5、 servlet是线程安全的吗,如何改进? 6、 实现同步的几种方式? 安全 关于安全方面做了哪些工作? 手机、支付如何保证信息安全? sql注入问题 如何保证访问URL安全:如何不暴露真实的URL地址;如何防止篡改URL地址;如何防止在URL中SQL注入? 设计模式 1、 你熟悉哪些设计模式 2、 框架中用到哪些设计模式 JAVA IO:装饰器模式(Decorator)、适配器模式(Adapt) Spring :访问者模式(Visitor)、代理模式(Proxy)、策略模式(Strategy) SpringMVC:模版模式(TempleteMethod) Mybatis: 简单工厂模式、工厂方法模式(FactoryMethod)、抽象工厂模式(Abstract Factory) Tomcat:门面模式、观察者模式(Observer)、命令模式(Command)、责任链模式(chainof responsible) Velocity :合成模式 3、 装饰模式和适配器模式的区别 4、 写一个单例模式 linux 1、会使用哪些命令 查看端口是否被占用 如何查看指定的日志 网络 1、 通信协议是否有了解,TCP/UDP等、HTTP 2、 http反向代理 业务篇 1、 订单:大并发问题 2、 订单或产品数据量变大之后如何优化 3、 交易付款如何操作 4、 与物流接口 5、 画出你负责的项目的架构图