记录我的面试:
1.linklist(链表)和arraylist,vector:
linklist是一条(动态的)链性结构,是一种双向的链表,他的存删(即保存,删除)性能比arraylist要好(注意:arraylist在末尾添加和删除数据是比linklist快的),但是在查询和修改数据的时候性能就不如arraylist了(原因:linklist查找数据每次都是从第一个数据向下便利,而arraylist是由下标的,能够根据下标直接找到数据),linklist的查询速度的三种方式和速度 ( foreach>迭代器>for语句),这里遗留一个问题(linklist会记录他的first和last位置,在这个位置上插入数据和arraylist相比那个更快)
arraylist是一个(动态的)线性表结构,他的初始默认长度是10,最大长度是 Integer.MaxValue-8,每次扩容是是当前容量的1.5倍。
vector大部分与arraylist相似,但vector的构造函数多了一个(可以指定初始值和扩容的长度),而且默认的扩容是当前容量的2倍,并且vector是线程安全的(因为vector的增加删除方法添加了synchronize关键字)相比之下 arraylist就不是啦
2.hashmap
hashmap是map的实现类,线程不安全,他是一种线表和链表结合的模式,先取得key的hashcode,看map中是否有这个code,如果没有,直接把key和value放入线表中,若果有,则把key和value放入对应code的链表中(注意:如果链表的长度大于8,则将链表的结构变成红黑树结构(防止二叉树结构的在一条线上存,变相的又变成链表结构))
结构图:
红黑树:
防止hashmap形成链表的方法:使用final相识类的key 例如String(hashcode方法已重写)(code值不相同)
3.抽象类和接口
抽象类是被abstract关键字修饰的类,意味着他的方法是可以没有实体的,普通类则不行,此外抽象类不能new。除此之外 抽象类与普通类并无太多区别,他们都可以有main方法可以执行,都可以有构造函数,都可以有public protect等修饰的方法和变量。
抽象类和接口的区别:
(1)抽象类可有有实体的方法(可被public private等修饰),接口不行(抽象方法都只能是public)
注意:抽象类实体方法可以不重写,但是抽象类和接口的抽象方法都必须全部重写
(2)抽象类可继承抽象类并且实现其他接口,但接口只能实现接口
(3)因为抽象的方法都必须重写,因为如果是只需要写一次的方法,最好使用抽象类可继承,而不是接口(其子实现都需要重写)
(4)抽象类的变量是可以修改的,而接口中只能是常量(即被 final修饰 不允许修改)
(5)设计层面上的区别:
a.抽象类是抽象一个类别,即一个类别的行为,属性。例如 抽象出来一个人类的抽象类 里面包含了他的行为(吃穿住行)和属性(大概样子) , 而接口一般抽象一种或者多种行为 即 吃喝(动物都有)
b.java继承和实现的区别要求 因为继承只能够单继承,而实现是多实现,而且抽象类可以有实体方法,因此,如果一种行为不需要改动,则抽象类比接口合适。