集合(2)
2. 具体的集合
集合框架中的类从上图中可以看出,除了Map结尾的类都实现了collection接口
从下图中可以看出java库具体的集合
java集合2.1 链表
我们知道数组和ArrayList有一个重大缺陷。这个缺陷就从数组的中间位置删除一个元素需要付出重大的代价,因为从数组中间删除一个元素,元素中间的位置都需要向前移动
所以我们可以利用一个大家非常熟悉的数据结构——链表来解决这个问题
数组在连续的位置上存放着对象的引用,但链表将每个对象存放在独立的节点中。每个结点存放着下个结点的引用
集合类库中提供了子接口ListIterator,其中包含add方法:
interface ListIterator <E> extends Interator<E> {
void add(E element);
E pervious();
boolean hasPervious();
}
与Collection.add不同,这个方法不返回boolean类型的值。
与next方法一样,previous总是返回被越过的值
不能利用一个interator对象删除一个数组的同时,利用第二个interator再读取这个链表
链表的set方法不会对造成结构性损害
collection 接口中声明了许多用于对链表进行操作的方法,其中大部分都是在LinkList的超类中AbstractCollection中实现的,可以利用contains来检测链表是否含有某一个元素
下面我们简单的写个LinkedList (如果您知道输出请在评论区发表,就当一次测验)
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class LinkedlistTest {
public static void main(String[] args){
List a = new LinkedList<>();
a.add("Amy"); a.add("Carl");
a.add("Eciri"); List b= new LinkedList<>();
b.add("x"); b.add("xx"); b.add("xxx");
b.add("xxxx");
// merge b into a ListIterator
aIter = a.listIterator();
Iterator bIter = b.iterator();
while (bIter.hasNext()){
if (aIter.hasNext()){
String d = aIter.next();
System.out.println(d);
}
aIter.add(bIter.next()); }
// remove every second word from b
bIter = b.iterator();
while (bIter.hasNext()){
bIter.next();
if (bIter.hasNext()){
bIter.next();
bIter.remove();
}
}
System.out.println(a);
System.out.println(b);
a.removeAll(b) ;
System.out.println(a) ;
}
}
介绍一下List接口常用的方法
ListIterator<E> lisIterator() //访问列表迭代器,以便访问列表中的元素
ListIterator<E> listIterator(int index) // 访问列表迭代器,从索引位置开始访问。
void add(int i, E element) //在给定位置添加一个元素。
void addAll(int i, Col1ection elements) //将某个集合中的所有元素添加到给定位置。
2.2 数组列表
常见的就是ArrayList也实现了List接口,这个接口封装了一个动态可分的数组
2.3 散列表
在不在乎顺序的情况下,可以高效的读取数据
如果自定类需要实现自己的散列码,就是实现自己的hashCode。equals相等hashCode必定相等
散列表左边每个列表称之为桶,要想查出表中对象的位置,就要先计算他的散列码,然后与桶的总数取余,所得到的就是这个元素在这个桶的索引。