1.equals与==的区别
(1) ==是一个运算符, 如果是基本数据类型,比较的是值是否相同,如果是引用数据类型,比较的是其对应的堆内存地址是否相同。
(2) equals是一个方法,如果没有重写equals方法,那么使用的就是Object类中的equals方法,其本质是使用的 == 进行的比较,如果重写了,例如String中的equals方法就是判断两个字符串的值是否相同。
2. 如果理解String的不可变性
String的赋值存在两种方式,一种是字面量直接赋值的方式,一种是通过new的方式赋值。不可变性指的是字符串常量存在于常量池中
String s1 = "123"; 一个String对象使用final Char [] 存放了一个123值的字符数组且一经定义不可改变(不可变性)
s1 = "345"; 新生成了一个Stirng对象,final char[] 存放了一个345,指向s1
3.String、StringBuffer、StringBuilder的区别?
1.String是不可变的,底层使用的是final char[] 一经定值不可更改
2.StringBuffer是可变的字符序列,默认是16个长度的字符数组,加了同步锁,所以是线程安全的,效率低下。
3.StringBuilder是可变的字符系列,默认也是16个长度的字符数组,使线程不安全的,效率高。
对于频繁的字符串的修改,推荐使用StringBuffer或者StringBuilder
4.ArrayList、LinkedList、Vetor的异同之处?
1.存储的都是可重复的,有序的数据集合
2.ArrayList适用于进行元素的查找,LiskedList适用于元素的频繁的删除和插入
3.ArrayList存储元素时,初始化10长度的元素数组,每次扩容为原来的1.5倍
4.LinkedList底层采用的是 双向链表的数据结构存储数据,存在一个Node结点,存储元素和指向这个元素的上一个结点和下一个结点。
5.Vetor存储的是初始化的10长度的数组,每次扩容为原来的2倍,是一个线程安全的容器,
ListedList和ArrayList是线程不安全的。
对于集合中存储的类对象,都必须重写equals方法
5.redis为什么那么快?
(1)redis是基于内存的操作,数据都存放在内存中,比硬盘上IO操作速度肯定要快。
(2)redis是一种单线程模式,避免了线程切换,锁资源争夺等不必要的花销。