原创

Java面试题p4

温馨提示:
本文最后更新于 2026年03月27日,已超过 78 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

克隆

克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时的值,所以需要一个新的对象来保存当前对象的“状态”就靠克隆了

实现对象克隆

实现Cloneable接口并重写Object类中的clone()方法

实现Serializable接口,通过对象的序列化和反序列化实现克隆,是真正的深度克隆

深拷贝和浅拷贝

    • 浅克隆:当对象被复制时,只复制它本身和其中包含的值的类型的成员变量,而引用类型的成员对象并没有复制
    • 深克隆:除了对象本身被复制外,对象所包含的所有成员变量也将复制

    JSP和Servlet区别

    JSP是servlet技术的扩展,本质是servlet的简易方式

    servlet和JSP不同点:

    • servlet的应用逻辑在Java文件中,并且完全从表示层中的html里分离开来;JSP是Java和html可以组合成一个扩展名为JSP的文件。
    • JSP侧重于视图,servlet侧重逻辑控制

    session和cookie的区别

    session    cookie
    存储位置服务器端浏览器端
    安全性
    一般,在浏览器端,可以被伪造和篡改
    容量和个数限制有容量限制,每个站点下有个数限制
    存储多样性Redis、数据库、应用程序中只在浏览器


    存储位置不同:session存储在服务器端;cookie存储在浏览器端

    安全性不同:cookie安全性一般,在浏览器存储,可以被伪造和修改

    容量和个数限制:cookie有容量限制,每个站点下的cookie也有个数限制

    存储的多样性:session可以存储在Redis、数据库、应用程序中;cookie只能存储在浏览器中

    session的工作原理

    session的工作原理是客户端登录完成之后,服务器会创建对应的session,session创建完后,会把session的id发给客户端,客户端再存储到浏览器中,这样客户端每次访问服务器时,都会带着sessionid。服务器拿到sessionid后,在内存中找到与之对应的session,这样就可以正常工作了

    客户端禁止cookie,session还可用吗

    可以用,session只是依赖cookie存储sessionid,若cookie被禁用了,可以使用url中添加sessionid的方式保证session正常使用

    spring mvc和strus区别

    拦截级别:struts2是类级别的拦截;spring mvc是方法级别的拦截

    数据独立性:spring mvc 的方法之间基本上是独立的,独享request和response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量;

    struts2虽然方法之间也是独立的,但其所有action变量是共享的,这不会影响程序运行。会给编程和读程序带来麻烦

    拦截机制:struts2有自己inceptor机制,spring mvc 用的是独立的aop方式。stuts2的配置文件的量比spring mvc大

    对 ajax的支持:spring mvc 集成了ajax,使用方便,@ResponseBody实现;struts2一般安装插件或者自己写代码实现

    避免SQL注入

    1. 使用预处理PreparedStatement
    2. 使用正则表达式过滤字符中的特殊字符

    xss攻击,如何避免

    XSS攻击:即->跨站脚本攻击,它是Web中常见的漏洞。原理是攻击者往Web页面插入恶意的脚本代码(css代码、Javascript代码等),当用户浏览该页面时,嵌入其中的脚本代码就会执行,从而达到恶意攻击用户的目的。如:盗取用户cookie、破坏页面结构、重定向到其他网站等

    CSRF攻击,如何避免

    CSRF跨站请求伪造:攻击者盗用了你的身份,以你的名义发送恶意请求。如:以你的名义发送邮件、发送消息、购买商品、虚拟货币等

    防御手段:

    • 验证请求来源地址
    • 关键操作添加验证码
    • 在请求地址添加token验证

    throw和throws区别

    throw:真实抛出一个异常

    throws:声明可能会抛出一个异常

    final、finally、finalize区别

    final:是修饰符,如果修饰类,此类不能被继承;修饰方法和变量,则表示此方法和变量不能再被改变,只能使用

    finally:是try{} catch{} finally{} 最后的一部分,表示无论发生什么情况都会执行,finally部分可以省略,但如果finally部分存在,则一定会执行finally里面的代码

    finalize:是Object类的一个方法,用于在对象被垃圾回收器回收之前执行一些清理工作

    try{} catch{} finally{},catch中return了,finally是否执行

    finally一定会执行,即使catch中return了,catch中的return会等finally中的代码执行完后才执行

    常见的异常类

    NullPointerException 空指针异常

    ClassNotFoundException 指定类不存在

    NumberFormartException   字符串转换为数字异常

    IndexOutBoundsException 数组下标越界异常

    ClassCastException 数据类型转换异常

    FileNotFoundException 文件未找到异常

    NoSucnMethodException 方法不存在异常

    IOException IO异常

    SocketException Socket异常

    http301、302响应码

    301:永久重定向

    302:暂时重定向

    forward和redirect区别

    forwardredirect
    地址栏URL显示不会改变    会改变
    数据共享共享request中的数据不共享
    效率

    地址栏url显示forward url会发生改变redirect url会发生改变

    数据共享:forward可以共享request里的数据,redirect不能

    效率:forward比redirect高

    正文到此结束