1、final关键字的作用?
-
final修饰成员变量时,必须赋值,一旦赋值不能被更改
-
final修饰局部变量时可以不赋值,但是赋值后就不能更改
-
final修饰成员方法时,子类不能重写
-
final修饰类不能被继承
接口中的变量都是默认 public static final 修饰的!!!
2、抽象类和接口的区别?
-
接口的方法都是抽象的,抽象类可以有抽象方法也可以有非抽象方法
-
类可以有多个接口,但是只能继承一个抽象类
-
类如果要实现一个接口必须实现他的所有抽象类,但是类继承抽象类可以重写抽象方法,非抽象方法不强制重写
-
抽象类去实现接口,接口的方法在抽象类中不强制重写
-
java 8以上的版本可以写默认的方法,这个方法带有方法体
3、简单说一下ArrayList和LinkedList
-
Arraylist和LinkedList都是List的接口的实现类
-
ArrayList底层是数组,查找增删慢
因为数组名字加索引计算会当成地址,直接查询号这个地址就可以把数据取出来(相当于读书时,通过目录查找),增删慢,是因为牵扯到数组的扩容,增删数据的时候,后续的元素需要前移或者后移
-
LinkedList底层是双向链表,查找慢增删快
-
查找慢:是因为底层使用的是二分法查找的一种算法,比较慢
增删快,直接找到要被插入数据或者删除数据的前置节点或者是后置节点直接插入,其他元素保持不变
(LinkedList是双向链表,没有下标,所以直接插入,不会引起数据的移动)
4、Java集合类:list、set、map的特点和用法?
Map
Map是键值对,键key是唯一不重复的,一个键对应一个值,值可以重复
TreeMap可以保证顺序,HashMap不保证顺序,Map中可以将Key和value单独抽取出来,其中KeySet()方法可以将所有的Keys抽取成一个Set,而Values()方法可以将map中所有的values抽取成一个集合。
Set
不包含重复元素的集合,set中最多包含一个null元素,只能用Iterator实现单项遍历,set中没有同步方法
List
有序可重复的集合,可以在任意位置增删元素,用Iterator实现单项遍历,也可以使用ListIterator实现双向遍历
5、String 、StringBuilder、StringBuffer区别?
String | 字符串常量 | 不可变 | 安全性 | 使用字符拼接时是不同的两个空间 |
---|---|---|---|---|
StringBuffer | 字符串常量 | 可变 | 线程安全 | 字符串拼接直接在字符串后面追加 |
StringBuilder | 字符串常量 | 可变 | 非线程安全 | 字符串拼接直接在字符串后追加 |
StringBuilder执行效率高于StringBuffer 高于String
String是一个常量,是不可变得,所以每次赋值都会创建一个新的对象,StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append方法在原来的基础上进行追加,所以性能比String要高,又因为StringBuffer是线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率高于StringBuffer