String, Stringbuffer,StringBuiler 的区别
- String 是不可变的,如果尝试修改,会生成一个新的字符串,StringBuffer 和 StringBuiler是可变的
- StringBuilder 的底层没有锁
StringBuffer的底层都加了同步锁,所以StringBuffer的线程是安全的
重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和方法修饰符可以不同
重写:发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符大于等于父类,如果父类方法访问修饰符为private 则子类就不能重写该方法
接口和抽象类的区别
- 抽象类可以存在普通成员函数,而接口中只能存在public abstract 方法
- 抽象类的成员变量可以是各种类型的,而接口中的成员方法只能是public static final
- 抽象类只能继承一个,接口可以实现多个
接口的设计目的:是一种对类的行为进行约束,也就是一种机制,可以强制要求不同的类具有相同的行为。它可以强制要求不同的类具有相同的行为,它只是约束了行为的有无,但对如何实现不做限制
抽象类的设计目的:是为了代码复用,当不同的类具有某些相同的行为的时候。将子类的共性抽成一个父类。抽象类不允许被实例化,否则抽象方法里面没有代码无法执行
抽象类的功能是远高于接口的,但是定义抽象类的代价高,因为抽象类只能继承一个,
List 和 Set
List: 有序,按对象进入的顺序保存对象,可重复,允许多个null元素对象,可以使用iterator取出所有元素,再逐一遍历,还可以使用get(int index)获取指定下标元素
Set: 无序,不可重复,最多允许有一个null元素存在,取元素的时候只能用iterator接口取所有元素再逐一遍历
ArrayList 和 LinkedList
ArrayList 底层实现的是数组,它的add方法可以向指定位置插入数据,但是底层会进行数组下表的移动,速度较慢,System.arrayCopy
LinkedList 底层是链表,实现的是DeQueue接口,是一种双头数组,它进行add插入的时候,因为是链表的结构,每次都需要取遍历,所以不适合插入操作。