1.JDK 和 JRE 有什么区别
JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
区别:
具体来说 JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。简单来说:如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK。
2.字符串都有哪些类?它们之间有什么区别?
1.String
2.StringBuffer
3.StringBuilder
1.String 和 StringBuffer、StringBuilder 的区别
String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
2.StringBuffer和StringBuilder 的区别
StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
3.HashMap 的实现原理
HashMap是用来存储Key-Value键值对的一种集合,这个键值对也叫做Entry,而每个Entry都是存储在数组当中,因此这个数组就是HashMap的主干。HashMap数组中的每- -个元素的初始值都是NULL
1.Put方法的实现原理
当我们调用put()方法时,比如hashMap.put("Java" ,0),此时要插入一个Key值为“Java”的元素,这时首先需要一个Hash函数来确定这个Entry的插入位置,设为index,即index =hash("Java"),假设求出的index值为2,那么这个Entry就会插入到数组索引为2的位但是HaspMap的长度肯定是有限的,当插入的Entry越来越多时,不同的Key值通过哈希函数算出来的index值肯定会有冲突,此时就可以利用链表来解决。其实HaspMap数组的每-个元素不止是-个Entry对象,也是一个链表的头节点, 每-个Entry对象通过Next指针指向下一个Entry对象,这样,当新的Entry的hash值与之前的存在冲突时,只需要插入到对应点链表即可。
2.Get 的实现原理
get()方法用来根据Key值来查找对应点Value,当调用get()方法时,比如hashMap.get("apple"),这时同样要对Key值做一次Hash映射,算出其对应的index值,即index = hash("apple")。前面说到的可能存在Hash冲突,同一个位置可能存在多个Entry,这时就要从对应链表的头节点开始,一个个向下查找,直到找到对应的Key值,这样就获得到了所要查找的键值对。
例如假设我们要找的Key值是' apple":第一步,算出Key值“apple”的hash值,假设为2。第二步,在数组中查找索引为2的位置,此时找到头节点为Entry6,Entry6的Key值是banana,不是我们要找的值。第三步,查找Entry6的Next节点,这里为Entry1,它的Key值为apple, 是我们要查找的值,这样就找到了对应的键值对,结束。
4.JSP 的 4 种作用域
page作用域
page对象的作用范围仅限于用户请求的当前页面request和page的生命周期都是短暂的,它们之间的区别:一个request可以包含多个page页(include,forward及filter)。
request作用域
request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了
session作用域
如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。
application作用域
它的有效范围是整个应用。整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。