做Java开发,应该有什么样的新精英职业规划怎么样

60人已关注
东北大学(中国)
就是喜欢表情包~╭(╯^╰)╮下面是我自己收集整理的Java岗位经常遇到的面试题,发出来就当为自己offer攒人品了,有需要的各位可以用它来好好准备面试。(保佑我拿到offer~)一、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.&抽象类和接口的区别18. java的基础类型和字节大小。19. Hashtable,HashMap,ConcurrentHashMap&底层实现原理与线程安全问题(建议熟悉&jdk&源码,才能从容应答)20. 如果不让你用Java&Jdk提供的工具,你自己实现一个Map,你怎么做。说了好久,说了HashMap源代码,如果我做,就会借鉴HashMap的原理,说了一通HashMap实现21. Hash冲突怎么办?哪些解决散列冲突的方法?22. HashMap冲突很厉害,最差性能,你会怎么解决?从O(n)提升到log(n)咯,用二叉排序树的思路说了一通23. rehash24. hashCode()&与&equals()&生成算法、方法怎么重写二、Java IO1. 讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。2. 讲讲NIO。3. String&编码UTF-8&和GBK的区别?4. 什么时候使用字节流、什么时候使用字符流?5.&递归读取文件夹下的文件,代码怎么实现三、Java Web1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。2. servlet的一些相关问题3. webservice相关问题4. jdbc连接,forname方式的步骤,怎么声明使用一个事务。举例并具体代码5. 无框架下配置web.xml的主要配置内容6. jsp和servlet的区别四、JVM1. Java的内存模型以及GC算法2. jvm性能调优都做了什么3. 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明4. 介绍GC 和GC Root不正常引用。5. 自己从classload&加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。反正就是各种扩展6. jvm&如何分配直接内存,&new&对象如何不分配在堆而是栈上,常量池解析7.&数组多大放在&JVM&老年代(不只是设置&PretenureSizeThreshold&,问通常多大,没做过一问便知)8.&老年代中数组的访问方式9. GC&算法,永久代对象如何&GC&,&GC&有环怎么处理10.&谁会被&GC&,什么时候&GC11.&如果想不被&GC&怎么办12.&如果想在&GC&中生存&1&次怎么办五、开源框架1. hibernate和ibatis的区别2. 讲讲mybatis的连接池。3. spring框架中需要引用哪些jar包,以及这些jar包的用途4. springMVC的原理5. springMVC注解的意思6. spring中beanFactory和ApplicationContext的联系和区别7. spring注入的几种方式(循环注入)8. spring如何实现事物管理的9. springIOC10. spring AOP的原理11. hibernate中的1级和2级缓存的使用方式以及区别原理(Lazy-Load的理解)12. Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理。六、多线程1. Java创建线程之后,直接调用start()方法和run()的区别2. 常用的线程池模式以及不同线程池的使用场景3. newFixedThreadPool此种线程池如果线程数达到最大值后会怎么办,底层原理。4. 多线程之间通信的同步问题,synchronized锁的是对象,衍伸出和synchronized相关很多的具体问题,例如同一个类不同方法都有synchronized锁,一个对象是否可以同时访问。或者一个类的static构造方法加上synchronized之后的锁的影响。5. 了解可重入锁的含义,以及ReentrantLock 和synchronized的区别6. 同步的数据结构,例如concurrentHashMap的源码理解以及内部实现原理,为什么他是同步的且效率高7. atomicinteger和等线程安全操作的关键字的理解和使用8. 线程间通信,wait和notify9. 定时线程的使用10. 场景:在一个主线程中,要求有大量(很多很多)子线程执行完之后,主线程才执行完成。多种方式,考虑效率。11. 进程和线程的区别12. 什么叫线程安全?举例说明13. 线程的几种状态14. 并发、同步的接口或方法15. HashMap&是否线程安全,为何不安全。&ConcurrentHashMap,线程安全,为何安全。底层实现是怎么样的。16. J.U.C下的常见类的使用。&ThreadPool的深入考察;&BlockingQueue的使用。(take,poll的区别,put,offer的区别);原子类的实现。17. 简单介绍下多线程的情况,从建立一个线程开始。然后怎么控制同步过程,多线程常用的方法和结构18. volatile的理解19. 实现多线程有几种方式,多线程同步怎么做,说说几个线程里常用的方法七、网络通信1. http是无状态通信,http的请求方式有哪些,可以自己定义新的请求方式么。2. socket通信,以及长连接,分包,连接异常断开的处理。3. socket通信模型的使用,AIO和NIO。4. socket框架netty的使用,以及NIO的实现原理,为什么是异步非阻塞。5. 同步和异步,阻塞和非阻塞。6. OSI七层模型,包括TCP,IP的一些基本知识7. http中,get&post的区别8. 说说http,tcp,udp之间关系和区别。9. 说说浏览器访问,经历了怎样的过程。10. HTTP协议、& HTTPS协议,SSL协议及完整交互过程;11. tcp的拥塞,快回传,ip的报文丢弃12. https处理的一个过程,对称加密和非对称加密13. head各个特点和区别14. 说说浏览器访问,经历了怎样的过程。八、数据库MySql1. MySql的存储引擎的不同2. 单个索引、联合索引、主键索引3. Mysql怎么分表,以及分表后如果想按条件分页查询怎么办(如果不是按分表字段来查询的话,几乎效率低下,无解)4. 分表之后想让一个id多个表是自增的,效率实现5. MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离6. 写SQL语句。。。7. 索引的数据结构,B+树8. 事务的四个特性,以及各自的特点(原子、隔离)等等,项目怎么解决这些问题9. 数据库的锁:行锁,表锁;乐观锁,悲观锁10. 数据库事务的几种粒度;11.&关系型和非关系型数据库区别九、设计模式1. 单例模式:饱汉、饿汉。以及饿汉中的延迟加载,双重检查2. 工厂模式、装饰者模式、观察者模式。3.&工厂方法模式的优点(低耦合、高内聚,开放封闭原则)十、算法1. 使用随机算法产生一个数,要求把1-1000W之间这些数全部生成。(考察高效率,解决产生冲突的问题)2. 两个有序数组的合并排序3. 一个数组的倒序4. 计算一个正整数的正平方根5. 说白了就是常见的那些查找、排序算法以及各自的时间复杂度6. 二叉树的遍历算法7. DFS,BFS算法9. 比较重要的数据结构,如链表,队列,栈的基本理解及大致实现。10.&排序算法与时空复杂度(快排为什么不稳定,为什么你的项目还在用)11. 逆波兰计算器12. Hoffman&编码13.&查找树与红黑树十一、并发与性能调优1. 有个每秒钟5k个请求,查询手机号所属地的笔试题(记得不完整,没列出),如何设计算法?请求再多,比如5w,如何设计整个系统?2. 高并发情况下,我们系统是如何支撑大量的请求的3. 集群如何同步会话状态4.&的原理5 .如果有一个特别大的访问量,到数据库上,怎么做优化(DB设计,DBIO,SQL优化,Java优化)6. 如果出现大面积并发,在不增加服务器的基础上,如何解决服务器响应不及时问题“。7. 假如你的项目出现性能瓶颈了,你觉得可能会是哪些方面,怎么解决问题。8. 如何查找&造成&性能瓶颈出现的位置,是哪个位置照成性能瓶颈。9.&你的项目中使用过缓存机制吗?有没用用户非本地缓存十二、其他1.常用的linux下的命令下面是我自己收集整理的Java岗位经常遇到的面试题,发出来就当为自己offer攒人品了,有需要的各位可以用它来好好准备面试。(保佑我拿到offer~)一、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.&抽象类和接口的区别18. java的基础类型和字节大小。19. Hashtable,HashMap,ConcurrentHashMap&底层实现原理与线程安全问题(建议熟悉&jdk&源码,才能从容应答)20. 如果不让你用Java&Jdk提供的工具,你自己实现一个Map,你怎么做。说了好久,说了HashMap源代码,如果我做,就会借鉴HashMap的原理,说了一通HashMap实现21. Hash冲突怎么办?哪些解决散列冲突的方法?22. HashMap冲突很厉害,最差性能,你会怎么解决?从O(n)提升到log(n)咯,用二叉排序树的思路说了一通23. rehash24. hashCode()&与&equals()&生成算法、方法怎么重写二、Java IO1. 讲讲IO里面的常见类,字节流、字符流、接口、实现类、方法阻塞。2. 讲讲NIO。3. String&编码UTF-8&和GBK的区别?4. 什么时候使用字节流、什么时候使用字符流?5.&递归读取文件夹下的文件,代码怎么实现三、Java Web1. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。2. servlet的一些相关问题3. webservice相关问题4. jdbc连接,forname方式的步骤,怎么声明使用一个事务。举例并具体代码5. 无框架下配置web.xml的主要配置内容6. jsp和servlet的区别四、JVM1. Java的内存模型以及GC算法2. jvm性能调优都做了什么3. 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明4. 介绍GC 和GC Root不正常引用。5. 自己从classload&加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。反正就是各种扩展6. jvm&如何分配直接内存,&new&对象如何不分配在堆而是栈上,常量池解析7.&数组多大放在&JVM&老年代(不只是设置&PretenureSizeThreshold&,问通常多大,没做过一问便知)8.&老年代中数组的访问方式9. GC&算法,永久代对象如何&GC&,&GC&有环怎么处理10.&谁会被&GC&,什么时候&GC11.&如果想不被&GC&怎么办12.&如果想在&GC&中生存&1&次怎么办五、开源框架1. hibernate和ibatis的区别2. 讲讲mybatis的连接池。3. spring框架中需要引用哪些jar包,以及这些jar包的用途4. springMVC的原理5. springMVC注解的意思6. spring中beanFactory和ApplicationContext的联系和区别7. spring注入的几种方式(循环注入)8. spring如何实现事物管理的9. springIOC10. spring AOP的原理11. hibernate中的1级和2级缓存的使用方式以及区别原理(Lazy-Load的理解)12. Hibernate的原理体系架构,五大核心接口,Hibernate对象的三种状态转换,事务管理。六、多线程1. Java创建线程之后,直接调用start()方法和run()的区别2. 常用的线程池模式以及不同线程池的使用场景3. newFixedThreadPool此种线程池如果线程数达到最大值后会怎么办,底层原理。4. 多线程之间通信的同步问题,synchronized锁的是对象,衍伸出和synchronized相关很多的具体问题,例如同一个类不同方法都有synchronized锁,一个对象是否可以同时访问。或者一个类的static构造方法加上synchronized之后的锁的影响。5. 了解可重入锁的含义,以及ReentrantLock 和synchronized的区别6. 同步的数据结构,例如concurrentHashMap的源码理解以及内部实现原理,为什么他是同步的且效率高7. atomicinteger和等线程安全操作的关键字的理解和使用8. 线程间通信,wait和notify9. 定时线程的使用10. 场景:在一个主线程中,要求有大量(很多很多)子线程执行完之后,主线程才执行完成。多种方式,考虑效率。11. 进程和线程的区别12. 什么叫线程安全?举例说明13. 线程的几种状态14. 并发、同步的接口或方法15. HashMap&是否线程安全,为何不安全。&ConcurrentHashMap,线程安全,为何安全。底层实现是怎么样的。16. J.U.C下的常见类的使用。&ThreadPool的深入考察;&BlockingQueue的使用。(take,poll的区别,put,offer的区别);原子类的实现。17. 简单介绍下多线程的情况,从建立一个线程开始。然后怎么控制同步过程,多线程常用的方法和结构18. volatile的理解19. 实现多线程有几种方式,多线程同步怎么做,说说几个线程里常用的方法七、网络通信1. http是无状态通信,http的请求方式有哪些,可以自己定义新的请求方式么。2. socket通信,以及长连接,分包,连接异常断开的处理。3. socket通信模型的使用,AIO和NIO。4. socket框架netty的使用,以及NIO的实现原理,为什么是异步非阻塞。5. 同步和异步,阻塞和非阻塞。6. OSI七层模型,包括TCP,IP的一些基本知识7. http中,get&post的区别8. 说说http,tcp,udp之间关系和区别。9. 说说浏览器访问,经历了怎样的过程。10. HTTP协议、& HTTPS协议,SSL协议及完整交互过程;11. tcp的拥塞,快回传,ip的报文丢弃12. https处理的一个过程,对称加密和非对称加密13. head各个特点和区别14. 说说浏览器访问,经历了怎样的过程。八、数据库MySql1. MySql的存储引擎的不同2. 单个索引、联合索引、主键索引3. Mysql怎么分表,以及分表后如果想按条件分页查询怎么办(如果不是按分表字段来查询的话,几乎效率低下,无解)4. 分表之后想让一个id多个表是自增的,效率实现5. MySql的主从实时备份同步的配置,以及原理(从库读主库的binlog),读写分离6. 写SQL语句。。。7. 索引的数据结构,B+树8. 事务的四个特性,以及各自的特点(原子、隔离)等等,项目怎么解决这些问题9. 数据库的锁:行锁,表锁;乐观锁,悲观锁10. 数据库事务的几种粒度;11.&关系型和非关系型数据库区别九、设计模式1. 单例模式:饱汉、饿汉。以及饿汉中的延迟加载,双重检查2. 工厂模式、装饰者模式、观察者模式。3.&工厂方法模式的优点(低耦合、高内聚,开放封闭原则)十、算法1. 使用随机算法产生一个数,要求把1-1000W之间这些数全部生成。(考察高效率,解决产生冲突的问题)2. 两个有序数组的合并排序3. 一个数组的倒序4. 计算一个正整数的正平方根5. 说白了就是常见的那些查找、排序算法以及各自的时间复杂度6. 二叉树的遍历算法7. DFS,BFS算法9. 比较重要的数据结构,如链表,队列,栈的基本理解及大致实现。10.&排序算法与时空复杂度(快排为什么不稳定,为什么你的项目还在用)11. 逆波兰计算器12. Hoffman&编码13.&查找树与红黑树十一、并发与性能调优1. 有个每秒钟5k个请求,查询手机号所属地的笔试题(记得不完整,没列出),如何设计算法?请求再多,比如5w,如何设计整个系统?2. 高并发情况下,我们系统是如何支撑大量的请求的3. 集群如何同步会话状态4.&的原理5 .如果有一个特别大的访问量,到数据库上,怎么做优化(DB设计,DBIO,SQL优化,Java优化)6. 如果出现大面积并发,在不增加服务器的基础上,如何解决服务器响应不及时问题“。7. 假如你的项目出现性能瓶颈了,你觉得可能会是哪些方面,怎么解决问题。8. 如何查找&造成&性能瓶颈出现的位置,是哪个位置照成性能瓶颈。9.&你的项目中使用过缓存机制吗?有没用用户非本地缓存十二、其他1.常用的linux下的命令在网上看到一篇还算比较齐全的总结吧,分享给题主,面试加油!!!目录面向对象编程(OOP)Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点:代码开发模块化,更易维护和修改。代码复用。增强代码的可靠性和灵活性。增加代码的可理解性。面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。下面的章节我们会逐个分析这些特性。封装封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。下面列出了使用封装的一些好处:通过隐藏对象的属性来保护对象内部的状态。提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。禁止对象之间的不良交互提高模块化。参考获取更多关于封装的细节和示例。多态多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。继承继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。抽象抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。抽象和封装的不同点抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。常见的Java问题1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。2.JDK和JRE的区别是什么?Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。3.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。4.是否可以在static环境中访问非static变量?static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。5.Java支持的数据类型有哪些?什么是自动拆装箱?Java语言支持的8中基本数据类型是:byteshortintlongfloatdoublebooleanchar自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。6.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。7.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。8.Java支持多继承么?不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。9.接口和抽象类的区别是什么?Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类可以在不提供接口方法实现的情况下实现接口。Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。也可以参考10.什么是值传递和引用传递?对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。Java线程11.进程和线程的区别是什么?进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。12.创建线程有几种不同的方式?你喜欢哪一种?为什么?有三种方式可以用来创建线程:继承Thread类实现Runnable接口应用程序可以使用Executor框架来创建线程池实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。13.概括的解释下线程的几种可用状态。线程在执行过程中,可以处于下面几种状态:就绪(Runnable):线程准备运行,不一定立马就能开始执行。运行中(Running):进程正在执行线程的代码。等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。睡眠中(Sleeping):线程被强制睡眠。I/O阻塞(Blocked on I/O):等待I/O操作完成。同步阻塞(Blocked on Synchronization):等待获取锁。死亡(Dead):线程完成了执行。14.同步方法和同步代码块的区别是什么?在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。15.在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。16.什么是死锁(deadlock)?两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。17.如何确保N个线程可以访问N个资源同时又不导致死锁?使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。Java集合类18.Java集合类框架的基本接口有哪些?Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:Collection:代表一组对象,每一个对象都是它的子元素。Set:不包含重复元素的Collection。List:有顺序的collection,并且可以包含重复元素。Map:可以把键(key)映射到值(value)的对象,键不能重复。19.为什么集合类没有实现Cloneable和Serializable接口?集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。20.什么是迭代器(Iterator)?Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。21.Iterator和ListIterator的区别是什么?下面列出了他们的区别:Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。22.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。23.Java中的HashMap的工作原理是什么?Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。24.hashCode()和equals()方法的重要性体现在什么地方?Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。25.HashMap和Hashtable有什么区别?HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:HashMap允许键和值是null,而Hashtable不允许键或者值是null。Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。一般认为Hashtable是一个遗留的类。26.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?下面列出了Array和ArrayList的不同点:Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。Array大小是固定的,ArrayList的大小是动态变化的。ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。27.ArrayList和LinkedList有什么区别?ArrayList和LinkedList都实现了List接口,他们有以下的不同点:ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。也可以参考。<parable和Comparator接口是干什么的?列出它们的区别。Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。29.什么是Java优先级队列(Priority Queue)?PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。30.你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。31.如何权衡是使用无序的数组还是有序的数组?有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。32.Java集合类框架的最佳实践有哪些?根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。编程的时候接口优于实现。底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。33.Enumeration接口和Iterator接口的区别有哪些?Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。34.HashSet和TreeSet有什么区别?HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。垃圾收集器(Garbage Collectors)35.Java中垃圾回收有什么目的?什么时候进行垃圾回收?垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。36.System.gc()和Runtime.gc()会做什么事情?这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。37.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法。一般建议在该方法中释放对象持有的资源。38.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?不会,在下一个垃圾回收周期中,这个对象将是可被回收的。39.Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。40.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。41.在Java中,对象什么时候可以被垃圾回收?当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。42.JVM的永久代中会发生垃圾回收么?垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下在网上看到一篇还算比较齐全的总结吧,分享给题主,面试加油!!!目录面向对象编程(OOP)Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点:代码开发模块化,更易维护和修改。代码复用。增强代码的可靠性和灵活性。增加代码的可理解性。面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。下面的章节我们会逐个分析这些特性。封装封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。下面列出了使用封装的一些好处:通过隐藏对象的属性来保护对象内部的状态。提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。禁止对象之间的不良交互提高模块化。参考获取更多关于封装的细节和示例。多态多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。继承继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。抽象抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。抽象和封装的不同点抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。常见的Java问题1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。2.JDK和JRE的区别是什么?Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。3.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。4.是否可以在static环境中访问非static变量?static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。5.Java支持的数据类型有哪些?什么是自动拆装箱?Java语言支持的8中基本数据类型是:byteshortintlongfloatdoublebooleanchar自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成double,等等。反之就是自动拆箱。6.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。7.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。8.Java支持多继承么?不支持,Java不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。9.接口和抽象类的区别是什么?Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类可以在不提供接口方法实现的情况下实现接口。Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。也可以参考10.什么是值传递和引用传递?对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。Java线程11.进程和线程的区别是什么?进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。12.创建线程有几种不同的方式?你喜欢哪一种?为什么?有三种方式可以用来创建线程:继承Thread类实现Runnable接口应用程序可以使用Executor框架来创建线程池实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。13.概括的解释下线程的几种可用状态。线程在执行过程中,可以处于下面几种状态:就绪(Runnable):线程准备运行,不一定立马就能开始执行。运行中(Running):进程正在执行线程的代码。等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。睡眠中(Sleeping):线程被强制睡眠。I/O阻塞(Blocked on I/O):等待I/O操作完成。同步阻塞(Blocked on Synchronization):等待获取锁。死亡(Dead):线程完成了执行。14.同步方法和同步代码块的区别是什么?在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。15.在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。16.什么是死锁(deadlock)?两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。17.如何确保N个线程可以访问N个资源同时又不导致死锁?使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。Java集合类18.Java集合类框架的基本接口有哪些?Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:Collection:代表一组对象,每一个对象都是它的子元素。Set:不包含重复元素的Collection。List:有顺序的collection,并且可以包含重复元素。Map:可以把键(key)映射到值(value)的对象,键不能重复。19.为什么集合类没有实现Cloneable和Serializable接口?集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。20.什么是迭代器(Iterator)?Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素。克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。21.Iterator和ListIterator的区别是什么?下面列出了他们的区别:Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。22.快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的所有的集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。23.Java中的HashMap的工作原理是什么?Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。24.hashCode()和equals()方法的重要性体现在什么地方?Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。25.HashMap和Hashtable有什么区别?HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:HashMap允许键和值是null,而Hashtable不允许键或者值是null。Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。一般认为Hashtable是一个遗留的类。26.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?下面列出了Array和ArrayList的不同点:Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。Array大小是固定的,ArrayList的大小是动态变化的。ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。27.ArrayList和LinkedList有什么区别?ArrayList和LinkedList都实现了List接口,他们有以下的不同点:ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。也可以参考。<parable和Comparator接口是干什么的?列出它们的区别。Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。29.什么是Java优先级队列(Priority Queue)?PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。30.你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。31.如何权衡是使用无序的数组还是有序的数组?有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。32.Java集合类框架的最佳实践有哪些?根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。编程的时候接口优于实现。底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。33.Enumeration接口和Iterator接口的区别有哪些?Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。34.HashSet和TreeSet有什么区别?HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。垃圾收集器(Garbage Collectors)35.Java中垃圾回收有什么目的?什么时候进行垃圾回收?垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。36.System.gc()和Runtime.gc()会做什么事情?这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。37.finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法。一般建议在该方法中释放对象持有的资源。38.如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?不会,在下一个垃圾回收周期中,这个对象将是可被回收的。39.Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。40.串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了。41.在Java中,对象什么时候可以被垃圾回收?当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。42.JVM的永久代中会发生垃圾回收么?垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full GC是非常重要的原因。请参考下建议上网去查一下Java软件开发工程师面试题宝典,这里面的东西个人觉得还是非常不错的,值得一看建议上网去查一下Java软件开发工程师面试题宝典,这里面的东西个人觉得还是非常不错的,值得一看结合个人经验和谈一下吧,我经历了两轮面试:一面:主要是谈技术,问你做过些什么项目,根据你说的项目,HR会选一个他觉得比较有代表性的问有什么功能,一般会挑比较难,还会问哪些模块,你负责该项目的什么模块,用了什么技术,如何设计的数据库和模块,用了哪些表,都有什么字段之类的。二面:这个就不侧重于专业方面了,和人力资源的聊天,比如:为什么选我们公司,你有什么优势,你有什么缺点之类的。只是简单说了下,祝题主面试成功~结合个人经验和谈一下吧,我经历了两轮面试:一面:主要是谈技术,问你做过些什么项目,根据你说的项目,HR会选一个他觉得比较有代表性的问有什么功能,一般会挑比较难,还会问哪些模块,你负责该项目的什么模块,用了什么技术,如何设计的数据库和模块,用了哪些表,都有什么字段之类的。二面:这个就不侧重于专业方面了,和人力资源的聊天,比如:为什么选我们公司,你有什么优势,你有什么缺点之类的。只是简单说了下,祝题主面试成功~
后可以回答该问题
相关标签:
相关标签:
关注我们咨询服务合作法律法规京ICP备号
下载申请方APP
即刻拥有你的学业规划助手

我要回帖

更多关于 怎么样职业规划 的文章

 

随机推荐