- 1、 *斜体样式*类 ExampleA 继承 Exception, 类 ExampleB 继承 Example A。
- 2、List、Set、Map 是否继承自 Collection 接口?
- 3、阐述 ArrayList、Vector、LinkedList 的存储性能和特性
- 4、Collection 和Collections 的区别?
- 5、List、Map、Set 三个接口存取元素时,各有什么特点?
1、 斜体样式类 ExampleA 继承 Exception, 类 ExampleB 继承 Example A。
@Test void test1(){ try { throw new ExampleB("b"); }catch (ExampleA e){ System.out.println("ExampleA"); }catch (Exception e){ System.out.println("Exception"); } }
请问执行此段代码的输出是什么?
答:
输出:ExampleA。(根据[里氏代换原则](里氏代换原则_百度百科 (baidu.com))[能使用父类型的地方一定能使用子类型],抓取 ExampleA 类型异常的 catch 块能够抓住 try 块中抛出的 ExampleB 类型的异常)
面试题-说出下面代码的运行结果。(此题的出处是《java 编程思想》一书)
class Annoyance extends Exception{ } class Sneeze extends Annoyance{ } public class Human { public static void main(String[] args) throws Exception{ try { try { throw new Sneeze(); }catch (Annoyance a){ System.out.println("Caught Annoyance"); throw a; } }catch (Sneeze s){ System.out.println("Caught Sneeze"); return; }finally { System.out.println("Hello World!"); } } }
2、List、Set、Map 是否继承自 Collection 接口?
List、Set 是, Map 不是。Map 是键值对映射容器,与 List 和 Set 有明显的区别,而 Set 存储的零散且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于数值索引访问元素的情形。
3、阐述 ArrayList、Vector、LinkedList 的存储性能和特性
ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据块而插入数据慢,Vector 中 的方法由于添加了 synchronized 修饰,因此 Vector 是线程安全的容器,但性能上较 ArrayList 差,因此已经是 Java 中的遗留容器。LinkedList 使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种 链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 Vector 属于遗留容器(Java 早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties 都是遗留容器),已经不推荐使用,但是由于 ArrayList 和 LinkedListed 都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类 Collections 中的 synchronizedList 方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。
补充
遗留容器中 的Properties类和Stack 类在设计上有严重的问题,Properties 是一个键和值都是字符串的特殊的键值对映射,在设计上应该是关联一个 Hashtable 并将其两个泛型参数设置为 String类型,但是 Java API 中的 Properties 直接继承了 Hashtable,这很明显是对继承的滥用。这里复用代码的方式应该是 Has-A 关系而不是 Is-A关系,另外一方面容器都属于工具类,继承工具类本身就是一个错误的做法,使用工具类最好的方式是 Has-A 关系(关联)或Use-A关系(依赖)。同理,Stack 类继承 Vector 也是不正确的。 Sun 公司的工程师们也会犯这种低级错误,让人唏嘘不已。
4、Collection 和Collections 的区别?
Collection 是一个接口,它是 Set、List 等容器的父接口;Collections 是一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
5、List、Map、Set 三个接口存取元素时,各有什么特点?
List 以特定索引来存取元素,可以有重复元素。Set 不能存放重复元素(用对象的 equals() 方法来区分元素是否重复)。Map 保存键值对(key-value pair) 映射,映射关系可以是一对一或多对一。Set 和 Map 容器都有基于 哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。
源链接-掘金