多态
多态中的成员访问特点
成员变量:编译看左边,执行看左边
成员方法:编译看左边,执行看右
成员方法有重写,而成员变量没有
多态的好处和弊端
好处: 提高了程序的扩展性
具体体现: 定义方法时,使用父类作为参数,将来在使用的使用,使用具体子类型参与操作
弊端: 不能使用子类的特有功能 (若要使用需要向下转型)
多态中的转型
- 向上转型:从子到父,父类引用指向子类对象
- 向下转型: 从父到子,父类引用转为子类对象
String,Stringbuffer,StringBuilder的区别
String:字符串常量
StringBuffer:字符串变量,效率低,线程安全的
StringBuilder:字符串变量,效率高,线程非安全的
三者执行速度比较:StringBuilder > StringBuffer > String
String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
数组和链表数据结构描述,各自的时间复杂度。
数组和链表的区别:
- 从逻辑结构角度来看: 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
- 数组元素在栈区,链表元素在堆区;
- 从内存存储角度来看: (静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。 链表从堆中分配空间, 自由度大但申请管理比较麻烦。
- 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
- 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。
ArrayList和LinkedList有什么区别
简单的区别:
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
深度的区别:
- 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
- 在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
- LinkedList不支持高效的随机元素访问。
- ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
讲讲类的实例化顺序
类加载器实例化时进行的操作步骤(加载–>连接->初始化)。
父类静态变量、 父类静态代码块、 子类静态变量、 子类静态代码块、 父类非静态变量(父类实例成员变量)、 父类构造函数、 子类非静态变量(子类实例成员变量)、 子类构造函数。