目录

java 中操作字符串都有哪些类?它们之间有什么区别?

String str="i"与 String str=new String("i")一样吗?

Java内存分配

java 容器都有哪些?

List、Set、Map 之间的区别是什么?

HashMap 的实现原理? 

说一下 HashSet 的实现原理?

说一下 synchronized 底层实现原理?

什么是反射?

什么是 java 序列化?什么情况下需要序列化?

动态代理是什么?有哪些应用?

 怎么实现动态代理?

说一下 session 的工作原理?

如何避免 sql 注入?

HTTP响应码

OSI 的七层模型都有哪些?


java 中操作字符串都有哪些类?它们之间有什么区别?

         操作字符串的类有:String、StringBuffer、StringBuilder

         String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

        StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

String str="i"与 String str=new String("i")一样吗?

         不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。

Java内存分配

  • 寄存器:我们在程序中无法控制
  • 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象)
  • 堆:存放用new产生的数据
  • 静态域:存放在对象中用static定义的静态成员
  • 常量池:存放常量
  • 非RAM存储:硬盘等永久存储空间

java 容器都有哪些?

java 对日 面试 java面试汇总_Java

List、Set、Map 之间的区别是什么?

java 对日 面试 java面试汇总_java_02

HashMap 的实现原理? 

       HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 

        HashMap的数据结构:在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

        当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

       需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)

说一下 HashSet 的实现原理?

  • HashSet底层由HashMap实现
  • HashSet的值存放于HashMap的key上
  • HashMap的value统一为PRESENT

说一下 synchronized 底层实现原理?

        synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性。

        Java中每一个对象都可以作为锁,这是synchronized实现同步的基础

  • 普通同步方法,锁是当前实例对象
  • 静态同步方法,锁是当前类的class对象
  • 同步方法块,锁是括号里面的对象

什么是反射?

       在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法

Java反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类。
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法。

什么是 java 序列化?什么情况下需要序列化?

       序列化的定义是:将一个对象编码成一个字节流(I/O);而与之相反的操作被称为反序列化。

       简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

什么情况下需要序列化:

  • 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
  • 当你想用套接字在网络上传送对象的时候;
  • 当你想通过RMI传输对象的时候;

动态代理是什么?有哪些应用?

       当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理的应用:

  • Spring的AOP
  • 加事务
  • 加权限
  • 加日志

 怎么实现动态代理?

        首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。

说一下 session 的工作原理?

        其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了

如何避免 sql 注入?

  • PreparedStatement(简单又有效的方法)
  • 使用正则表达式过滤传入的参数
  • 字符串过滤
  • JSP中调用该函数检查是否包函非法字符
  • JSP页面判断代码

HTTP响应码

  • 1开头 消息响应 
  • 2开头 成功响应
  • 3开头 重定向
  • 4开头 客户端错误
  • 5开头 服务器端错误

OSI 的七层模型都有哪些?

  1. 应用层:网络服务与最终用户的一个接口。
  2. 表示层:数据的表示、安全、压缩。
  3. 会话层:建立、管理、终止会话。
  4. 传输层:定义传输数据的协议端口号,以及流控和差错校验。
  5. 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
  6. 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
  7. 物理层:建立、维护、断开物理连接。