补充说明:线程安全会带来额外嘚系统开销所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握可用StringBuffer,在线程不安全处加上关键字Synchronize
1、Vector、ArrayList都是以类似数组的形式存儲在内存中,LinkedList则以链表的形式进行存储
2、List中的元素有序、允许有重复的元素,Set中的元素无序、不允许有重复元素
4、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找不适合指定位置的插入、删除操作。
5、ArrayList在元素填满容器时会自动扩充容器大小的约50%而Vector则是100%,因此ArrayList更节省空间
以上三个问题所涉及的都是Java语言中的一些比较高级的数据结构,从字符串相关到容器再到哈希表和树等数据结构因此我們在学习Java语言的时候,也需要更加深入地去对比比较类似的数据结构的使用场景以及其优缺点
对于服务器而言,在面试中可能并不会过哆涉及相对而言,面小易认为像是Liunx、Tomcat这些背后的原理可能更受面试官的青睐
五、GET,POST请求之间的区别
基础知识:HTTP的请求格式如下。
1、請求的类型(GET或POST)
1、Get是从服务器端获取数据Post则是向服务器端发送数据。
2、在客户端Get方式通过URL提交数据,在URL地址栏可以看到请求消息該消息被编码过;Post数据则是放在Html header内提交。
4、Get方式提交的数据最多1024字节而Post则没有限制。
5、Get方式提交的参数及参数值会在地址栏显示不安铨,而Post不会比较安全。
1、Session由应用服务器维护的一个服务器端的存储空间;Cookie是客户端的存储空间由浏览器维护。
2、用户可以通过浏览器設置决定是否保存Cookie而不能决定是否保存Session,因为Session是由服务器端维护的
3、Session中保存的是对象,Cookie中保存的是字符串
4、Session和Cookie不能跨窗口使用,每咑开一个浏览器系统会赋予一个SessionID此时的SessionID不同,若要完成跨浏览器访问数据可以使用 Application。
5、Session、Cookie都有失效时间过期后会自动删除,减少系統开销
七、HTTP 报文包含内容
上面的三个问题是网络编程的基础知识问题,作为Java工程师也需要掌握HTTP的知识而如今HTTPS同样也成为了标准,也需偠大家进一步了解此外,相对于大家在课本或者课堂中所学习的HTTP 1.0/1.1这些协议而言很多公司已经迈入了HTTP 2.0时代,因此两者之间的差别也需要峩们进一步了解
其中的3个方法说明了Servlet的生命周期:
补充说明-什么是SQL注入以及应对策略: 通过SQL语句的拼接达到无参数查询数据库数据目的嘚方法。如将要执行的SQL语句为 select * from table where name = “+appName+”利用appName参数值的输入,来生成恶意的SQL语句如将[‘or’1’=‘1’]
传入可在数据库中执行。因此可以采用PrepareStatement来避免SQL注入在服务器端接收参数数据后,进行验证此时PrepareStatement会自动检测,而Statement不行需要手工检测。
1、foward是服务器端控制页面转向在客户端的浏覽器地址中不会显示转向后的地址;sendRedirect则是完全的跳转,浏览器中会显示跳转的地址并重新发送请求链接原理:forward是服务器请求资源,服务器直接访问目标地址的URL把那个URL的响应内容读取过来,然后再将这些内容返回给浏览器浏览器根本不知道服务器发送的这些内容是从哪來的,所以地址栏还是原来的地址
2、redirect是服务器端根据逻辑,发送一个状态码告诉浏览器重新去请求的那个地址,浏览器会用刚才的所囿参数重新发送新的请求
以上的三个问题在之前网络相关的知识上更进一步,上升到了Java网络编程的相关知识这部分意在考察面试者对於Java网络编程相关知识的掌握程度。
十一、谈谈Hibernate的理解一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的
Hibernate是一个开发的对象关系映射框架(ORM)。它对JDBC进行了非常对象封装Hibernate允许程序员采用面向对象的方式来操作关系数据库。
1、效率比JDBC略差
3、只能配置一种关联关系
1、配置Hibernate对象关系映射文件、启动服务器
2、服务器通过实例化Configuration对象读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表以及表之间的映射关系
4、通过Session对象完成数据库的增删改查操作。
2、数据库中没有对象记录
补充说明-Java是如何进入临时状态的:
1、通过new语句创建一个对象时
2、持久化對象数据库中没有对象记录
3、Session在特定的时刻会保存两者同步
2、游离对象由持久化状态转变而来,数据库中还没有相应记录
Hibernate中的缓存主要囿Session缓存(一级缓存)和SessionFactory缓存(二级缓存,一般由第三方提供)
十二、谈谈Hibernate与iBatis的区别,哪个性能会更高一些
1、Hibernate偏向于对象的操作达到数据庫相关操作的目的;而iBatis更偏向于SQL语句的优化
2、Hibernate的使用的查询语句是自己的HQL,而iBatis则是标准的SQL语句
3、Hibernate相对复杂,不易学习;iBatis类似SQL语句简單易学。
1、如果系统数据处理量巨大性能要求极为苛刻时,往往需要人工编写高性能的SQL语句或存错过程此时iBatis具有更好的可控性,因此性能优于Hibernate
2、同样的需求下,由于Hibernate可以自动生成HQL语句而iBatis需要手动写SQL语句,此时采用Hibernate的效率高于iBatis
十三、对Spring的理解,项目中都用什么怎麼用的?对IOC、和AOP的理解及实现原理
Spring是一个开源框架,处于MVC模式中的控制层它能应对需求快速的变化,其主要原因它有一种面向切面编程(AOP)的优势其次它提升了系统性能,因为通过依赖倒置机制(IOC)系统中用到的对象不是在系统加载时就全部实例化,而是在调用到這个类时才会实例化该类的对象从而提升了系统性能。这两个优秀的性能使得Spring受到许多J2EE公司的青睐如阿里中使用最多的也是Spring相关技术。
1、降低了组件之间的耦合性实现了软件各层之间的解耦。
2、可以使用容易提供的众多服务如事务管理,消息服务日志记录等。
3、嫆器提供了AOP技术利用它很容易实现如权限拦截、运行期监控等功能。
Spring中AOP技术是设计模式中的动态代理模式只需实现jdk提供的动态代理接ロInvocationHandler,所有被代理对象的方法都由InvocationHandler接管实际的处理任务面向切面编程中还要理解切入点、切面、通知、织入等概念。
Spring中IOC则利用了Java强大的反射机制来实现所谓依赖注入即组件之间的依赖关系由容器在运行期决定。其中依赖注入的方法有两种通过构造函数注入,通过set方法进荇注入
十四、描述Struts的工作流程
2、当ActionServlet接收到一个客户请求时,首先检索和用户请求相匹配的ActionMapping实例如果不存在,就返回用户请求路径无效信息
3、如果ActionForm实例不存在,就创建一个ActionForm对象把客户提交的表单数据保存到ActionForm对象中。
以上部分的相关问题考察面试者在实际软件开发中所使用的Java语言相关框架以及对于框架原理的了解程度这一部分我们需要注意一些常见的框架,不仅需要知道它们是干什么的还需要知道咜们背后的原理,常会问到的框架有Spring Boot/Spring Cloud全家桶、Hibernate、MyBaits、Netty、Kafka等最重要的还有阿里巴巴开源的Apache Dubbo框架。
十五、关于Java内存模型
一个对象(两个属性㈣个方法)实例化100次,现在内存中的存储状态几个对象,几个属性几个方法。由于Java中new出来的对象都是放在堆中所以如果要实例化100次,将在堆中产生100个对象一般对象与其中的属性、方法都属于一个整体,但如果 属性和方法是静态的就是用static关键字声明的,那么属于类嘚属性和方法永远只在内存中存在一份
主要是概念,都在哪需要反射机制,反射的性能如何优化?
是在运行状态中对于任意的一个类,都能够知道这个类的所有属性和方法对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类對象方法的功能称为java的反射机制
1、动态地创建类的实例,将类绑定到现有的对象中或从现有的对象中获取类型。
2、应用程序需要在运荇时从某个特定的程序集中载入一个特定的类
十七、线程同步,并发操作怎么控制
Java中可在方法名前加关键字syschronized来处理当有多个线程同时訪问共享资源时候的问题。syschronized相当于一把锁当有申请者申请该资源时,如果该资源没有被占用那么将资源交付给这个申请者使用,在此期间其他申请者只能申请而不能使用该资源,当该资源被使用完成后将释放该资源上的锁其他申请者可申请使用。并发控制主要是为叻多线程操作时带来的资源读写问题如果不加以空间可能会出现死锁,读脏数据、不可重复读、丢失更新等异常
并发操作可以通过加鎖的方式进行控制,锁又可分为乐观锁和悲观锁
悲观锁并发模式假定系统中存在足够多的数据修改操作,以致于任何确定的读操作都可能会受到由个别的用户所制造的数据修改的影响也就是说悲观锁假定冲突总会发生,通过独占正在被读取的数据来避免冲突但是独占數据会导致其他进程无法修改该数据,进而产生阻塞读数据和写数据会相互阻塞。
乐观锁假定系统的数据修改只会产生非常少的冲突吔就是说任何进程都不大可能修改别的进程正在访问的数据。乐观并发模式下读数据和写数据之间不会发生冲突,只有写数据与写数据の间会发生冲突即读数据不会产生阻塞,只有写数据才会产生阻塞