• 面试题(一)


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

    答: 1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。

      2、String不可变是因为在JDK中String类被声明为一个final类。

      3、StringBuffer是线程安全的,而StringBuilder是非线程安全的。

      ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。

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

    答:   1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以双向链表的形式进行存储。所以,Vector和ArrayList都具有数组的优缺点,而LinkedList拥有链表的优缺点。

         2、Vector是线程同步的,而ArrayList和LinkedList是线程不同步的。

    三、HashTable, HashMap,TreeMap区别?

    答:   1、HashTable、HashMap使用散列表的方式存储数据,获得、修改数据都是O(1)的操作。HashTable是线程安全的,不允许null值,HashMap不是线程安全的,允许null。HashTable中hash数组的大小默认是11,增加方式是old*2+1,HashMap中hash数组的默认大小是16,增长方式一定是2的指数倍。

       2、TreeMap能够把记录根据键值排序,默认是升序排列。

       3、Properties 继承于Hashtable,,所以它是线程安全的.

    四、get和post的区别

    答:都是http协议里定义的方法。post的内容,添加在http协议的body里面,而get添加在url的后面。所以,1.post发送的内容大,理论上无限制;get内容小,1M 2. post相对安全 3. get的速度快。

    五、session和cookie的区别

    答:首先session是服务器维护的一个服务器端的存储空间,而cookie是客户端的,主要由浏览器维护。最初cookie是为了解决http的无状态问题的,可以记录前后两次的状态。但是浏览器、js等是可以设置cookie的,一旦禁用,就不能记录了。seesion是在服务器端产生的,用于记录前后两次的状态,如果发起的请求包含sessionid,则访问过,如果没有则新建。seesion是通过cookie实现的,存储在浏览器端用户的sessionid,一旦cookie禁用,也就需要使用重写url和提交隐藏表单的方式进行。浏览器关闭就失效的cookie是会话cookie,保存在内存中。

    六、Servlet的生命周期

      servlet生命周期分为4部分~类加载、初始化、服务、销毁。与生命周期有关的方法:init、service和destory。

      tomcat包括Container容器,Container容器里面有servlet容器,在servlet容器里面对应有context容器,每一个web应用对应于一个context,增加一个web应用也就会增加一个context。

      客户端发送http请求,服务器接受http请求后,解析到tomcat。tomcat在相应的web应用下新开一个线程处理这个请求。servlet的httprequest获得这个请求,转给service方法进行处理,最后将处理的结果使用httpresponse返回http请求,返回给客户端。

    七、HTTP 报文包含内容

      主要包括:报文请求(方法字段、URL字段和HTTP协议版本)、报文头部(客户端请求的信息:User-Agent、Accept、Host)、空行和请求主体;

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

      PreparedStatement的预编译机制,使其与Statement有着显著的区别:1.PreparedStatement是预编译的,会保存下来,下次调用的时候可直接调用,更快;2.由于有预编译的存在,不会出现字段和sql语句的内容匹配,所以可防止sql注入等安全问题。 2. PreparedStatement可以很好的解决本地化的问题。 3. PreparedStatement不容易调试sql语句。

    九、sendRedirect, foward区别

      sendRedirect是发送二次请求,浏览器端会看见请求url的变化,而forward是服务器再发送一个请求,浏览器并看不见这个请求的发生,只是接受了请求的最后结果。所以,forward更高效。但是有时候请求的是别的服务器的资源,就必须使用sendRedirect的方法。

    十、谈谈Hibernate的理解,一级和二级缓存的作用,在项目中Hibernate都是怎么使用缓存的。

      hibernate是一个ORM关系映射文件框架。对关系数据量进行了类的封装,使程序员可以像使用类一样操作数据库。

      hibernate的工作原理:1. 配置关系映射文件; 2. 通过configuration的实例化,读取hibernate.cfg.xml文件,建立表与表之间的映射; 3. 通过configuration的实例化,建立sessionFactory,通过sessionFactory建立session对象; 4. 通过session对象进行数据表的增删改查;

      hibernate中的状态:临时状态、持久化状态、琉璃状态;变化图如下:

      

      一级二级缓存

      [cpu速度快,内存速度慢,缓存是为了解决这两个的速度不一致而设计的。静态RAM和动态RAM:静态RAM速度快,但是体积大;所以一级缓存往往采用静态ram,二级缓存往往采用动态ram]

      Hibernate中的缓存主要有Session缓存(一级缓存)和SessionFactory缓存(二级缓存,一般由第三方提供)。

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

      反射就是知道了类,通过方法获得这个类里面的方法、属性等等信息。

      反射的作用:在运行的时判定任意一个对象所属的类;运行时,构造任意一个类的对象;运行时,判定一个类所属的成员变量和方法;在运行时调用任意的一个方法;生成动态代理;

    十二、对Spring的理解,项目中都用什么?怎么用的?对IOC、和AOP的理解及实现原理

    十三、java如何实现多线程,和线程同步,并发操作怎么控制?

      java实现多线程的方法有两种:1.继承Thread类,重写run方法。2. 实现runable接口,实现run方法。都采用start开启线程。区别:由于java是单继承的,实现runable接口了还可以实现别的接口和继承别的方法,较好;runable实现的线程可以共享一份资源,可以将cpu、代码和数据分开;但是编程更复杂。Thread编程更简单。

      并发控制:java使用synchronized处理多线程并发操作,synchronized相当于一把锁,定义了锁资源以后,可以使用wait()和yield()方法控制资源。如果不加以空间可能会出现死锁,读脏数据、不可重复读、丢失更新等异常。

    十四、描述struts的工作流程

       struts是工作在web层的框架,

    十五、sql的优化问题

    十六、JVM垃圾回收实现原理。垃圾回收的线程优先级。

    十七、jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。

  • 相关阅读:
    js一次性删除一个数组中多个元素
    js防抖,节流
    js 生成一个永不重复的ID
    mavon-editor 使用方法以及回显
    导出---后台返回二进制流文件数据,前端转换格式进行下载
    vue 监控enter键触发
    上传视频到阿里云
    前端图片压缩
    向后台传输表情时,手机自带输入法emoji表情的输入,提交及显示——前端解决方案
    vue 之this.$router.push、replace、go的区别
  • 原文地址:https://www.cnblogs.com/lxq0309/p/3662694.html
Copyright © 2020-2023  润新知