理论知识辨析
1. 顺序存储结构和链式存储结构的特点、优缺点对比
顺序表:
特点:
在内存中分配连续的空间,只存储数据,不需要存储地址信息,逻辑上相邻的元素,物理位置上也相邻。
优点:
1,节省存储空间。因为分配给数据的存储单元全用来存放结点数据,结点之间扽逻辑关系没有占用额外的存储空间。
2,索引查询效率高。每个结点对应一个序号,由序号可以直接计算出结点的存储地址。
缺点:
1,插入和删除操作需要移动元素,效率较低。
2,必须提前分配好固定数量的空间,如果存储元素少。可能导致空闲浪费。
3,按照内容查询的效率低,因为需要逐个比较判断。
链式表:
特点:
数据元素的存储对应的是不连续的存储空间,每个存储结点对应一个需要存储的数据元素。每个结点是由数据域和指针域组成。元素之间的逻辑关系通过存储节点之间的链接关系反映出来。逻辑上相邻的节点物理上不必相邻。
优点:
1,插入、删除灵活(不需要移动节点,只需要节点的指针,但是首先需要定位到该元素上)
2,有元素才会分配结点空间,不会有闲置的结点。
缺点:
1,比顺序存储结构的存储密度小。(数据和指针域)
2,查找结点时链式存储要比顺序存储慢。(地址不连续,无规律,导致按照索引查询效率低下)
2. Iterator迭代器和for-each循环
问题一:哪些集合可以使用Iterator遍历
层次一:Collection、List、Set可以,Map不可以。
层次二:提供iterator()方法的就可以将元素交给Iterator。
层次三:实现Iterable接口的集合类都是可以使用迭代器遍历
问题二:for-each循环和Iterator的联系
联系:
for-each循环遍历集合时,底层使用的是Iterator。
凡是可以使用for-each循环,肯定也可以使用Iterator进行遍历。
区别:
使用for-each遍历集合时不能删除元素,会抛出异常ConcurrentModificationException。
使用Iterator遍历集合时能删除元素,使用Iterator内部自带删除方法。
为什么要把Iterator设置成一个接口?
不同的集合类,底层结构不同,迭代的方式不同,所以提供一个接口,让相应的实现类来实现。
2. ListIterator和Iterator的区别
使用范围不同:
Iterator可以应用于更多的集合,Set、List和这些集合的子类型.
ListIterator只能用于List及其子类型。
遍历循序不同:
Iterator只能循序向后遍历;
ListIterator还可以逆序向前遍历
性能机制;
Iterator只能在遍历的过程中使用remove();
ListIterator可以在遍历的过程中使用remove()、add()、set()
ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。
Iterator没有此功能。