Java接口间的HAS-A关系如何运作?以集合框架为例求解
关于Java集合框架中Iterator/ListIterator与集合接口的HAS-A关系解释
首先澄清你的一个小误解:ListIterator 并非仅提供反向遍历特性,它作为 Iterator 的子接口,除了支持反向遍历,还保留了父接口的正向遍历能力,同时额外支持在遍历过程中修改元素、获取当前元素的索引等功能,这些是普通 Iterator 不具备的。
接下来解释所谓的HAS-A关系:
这里的HAS-A关系不是指接口与接口之间直接存在持有关系,而是指:
- 所有实现
Collection接口的类(比如ArrayList、HashSet等),都需要实现iterator()方法,这个方法会返回一个实现了Iterator接口的实例。换句话说,集合对象持有一个Iterator的实例(或者说能生成Iterator实例),通过这个实例来完成集合的正向遍历,这就是所谓的HAS-A(拥有)关系。 - 同理,所有实现
List接口的类(比如ArrayList、LinkedList),额外提供了listIterator()方法,返回一个ListIterator接口的实例。List类的对象拥有ListIterator实例,借助它完成更灵活的遍历(正向+反向),这就是List与ListIterator的HAS-A关系。
举个简单的代码例子:
// Collection与Iterator的HAS-A体现 Collection<String> coll = new ArrayList<>(); coll.add("a"); coll.add("b"); // 集合对象通过iterator()方法获取Iterator实例,完成遍历 Iterator<String> it = coll.iterator(); while(it.hasNext()) { System.out.println(it.next()); } // List与ListIterator的HAS-A体现 List<String> list = new ArrayList<>(); list.add("x"); list.add("y"); // List对象获取ListIterator实例,支持反向遍历 ListIterator<String> lit = list.listIterator(list.size()); while(lit.hasPrevious()) { System.out.println(lit.previous()); }
总结一下:
- 接口之间本身不存在HAS-A关系,HAS-A是指集合实现类对象与迭代器实例之间的拥有关系,是通过集合接口定义的获取迭代器的方法来约定的。
ListIterator的能力不止反向遍历,它是增强版的Iterator,专为List集合设计。
内容的提问来源于stack exchange,提问作者Ujjal Nandi
相关产品推荐
相关产品推荐

