Java基础
-
-
- 1.== 和 equals 的区别是什么
- 2.字符串操作String、StringBuilder、StringBuffer的区别
- 3.String 类的常用方法都有那些
- 4.ArrayList和LinkedList的区别
- 5.final、finally、finalize 有什么区别
- 6.Collection 和 Collections 有什么区别
- 7.Session、Cookie和Token的主要区别
- 8.forward转发和redirect重定向的区别
- 9.Servlet生命周期
- 10.Servlet是线程安全的吗
- 11.Servlet执行流程
- 12.HashMap底层原理
- 13.HashMap是怎么解决哈希冲突的
- 14.HashMap和HashTable有什么区别
- 15.HashSet去重原理
- 16.创建线程的三种方式
- 17.线程的 run()和 start()有什么区别?为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法
- 18.线程同步以及线程调度相关的方法
- 19.sleep()、wait()和yield()有什么区别
- 20.Java中怎样唤醒一个阻塞的线程
- 21.synchronized的作用
- 22. synchronized的底层实现原理
- 23.
-
1.== 和 equals 的区别是什么
对于不同的数据类型来说,== 和 equals比较的是不一样的。对于基本数据类型来说,== 比较的是值,而对于引用数据类型,== 比较的是对象的地址。equals本质上来说也是 ==,因为java中大部分类都重写了equals方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 重写的equals方法比较的是值是否相等。
另外重写了equals方法的也一定要重写hashCode方法,简单来说是为了hashMap key去重 和hashSet 的去重功能不失效。因为java中规定只要是两个对象经过equals比较返回为true,那么他们的hashCode也一定相等。但hashCode相等,equals方法不一定为true,因为在散列表中,hashCode相等即两个键值对的哈希值相等(key-value),然而哈希值相等,并不一定能得出键值对相等。
2.字符串操作String、StringBuilder、StringBuffer的区别
String、StringBuilder和StringBuffer都是用来存储和操作字符串的。他们存储字符串都是基于char数组实现的,不过在JDK1.9之后使用的是byte数组,因为往往我们存储都是短字符串,使用byte[]这样更节约空间。由于String底层的char数组是被final修饰的,一旦创建它的长度和值就不能更改,因此在做字符串拼接时,每一次拼接都需要重新创建String对象。而StringBuilder和StringBuffer都继承自AbstractStringBuilder类,数组则是可以修改的,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuilder在做字符串拼接时是线程不安全的,而StringBuffer是线程安全的。但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer,在字符串内容不经常发生变化的业务场景优先使用String类,例如常量声明、少量的字符串拼接操作等。
3.String 类的常用方法都有那些
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符。
- concat():拼接字符串。
- substring():截取字符串。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():分割字符串,返回一个分割后的字符串数组。
- getBytes():返回字符串的 byte 类型数组。
- length():返回字符串长度。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- equals():字符串比较。
4.ArrayList和LinkedList的区别
ArrayList和LinkedList都是List类型的实现类。ArrayList底层基于数组是动态数组的数据结构实现,而LinkedList底层是基于链表是双向链表的数据结构实现。由于数组数据结构和链表数据结构类型的不同,两者在存值取值和修改值时具有不同的优势。
ArrayList相对于LinkedList来说查询和修改效率更高,而删除和新增的效率很低,因为会涉及到数组的创建和重新赋值。数组在存储数据时是按顺序存储的,存储数据的内存也是连续的,查询修改时ArrayList可以通过索引把想要位置的数据取出来,而LinkedList需要一个一个遍历才能找到下一个节点。
对于删除和插入非结尾数据来说LinkedList的效率比ArrayList的效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。ArrayList删除一个元素之后,改元素之后的数据索引位置都需要移位,就会涉及到数组的创建及拷贝,而LinkedList只需要改变一个节点指向下一个节点的地址即可。ArrayList的容量有限制达到上限后扩容还会涉及到新数组创建及数组拷贝较消耗性能,而LinkedList的容量没限制。
综合来说,在查询使用较多的场合使用ArrayList效率更高,在添加删除较多的场合使用LinkedList效率更高。由于ArrayList 和 LinkedList 都是线程不安全,如果想保证线程安全可以使用Vector。
5.final、finally、finalize 有什么区别
final是一个修饰符关键字,可以修饰类、方法、变量。修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
finally是一个异常处理的关键字,一般作用在try-catch-finally代码块中,在处理异常的时候,通常我们将一定要执行的代码放在finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
finalize是属于Object类的一个方法,每一个对象都有这么一个方法。该方法一般由垃圾回收器来调用,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在JDK 9被标记为 deprecated。
6.Collection 和 Collections 有什么区别
Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List、Set 等。
Collections 是一个包装类,包含了很多静态方法,不能被实例化,就像一个工具类,比如提供的排序方法: Collections. sort(list)。
7.Session、Cookie和Token的主要区别
HTTP协议本身是无状态的,即服务器无法判断用户身份。cookie和sessio