List集合特有的迭代器,listIterator 是iterator的子接口。
在迭代时不可以通过集合对象的方法操作集合中的元素,因为会发生并发性异常
所以,在迭代器时,只能用迭代器来操作元素,可是iterator方法是有限的,如果想要其他的操作如添加,修改等,就要使用其子接口listIterator
该接口只能通过list的listIterator 方法获取
List的常见子类对象
List
|---ArrayList:底层的数据结构使用的是数组结构 特点:查询速度很快,但是增删很慢,线程不同步
|---LinkedList:底层使用的是链表数据结构 特点:增删速度很快,查询稍慢
|---Vector:底层是数组数据结构 线程同步,被arrayList替代了
Enumeration 枚举
枚举就是vector特有取出方式。
枚举和迭代时一样的,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了,枚举就郁郁而终了。
LinkedList 链接列表
linkedList特有方法:
getFirst()
getLast()
获取元素 但是不删除元素
removeFirst()
removeLast()
获取元素 而且删除元素,如果集合中没有元素,会出现NoSuchElementException
在jdk1.6出现了替代方法
offerFirst()
peekFirst()
pollFirst()
练习:使用linkedList模拟一个堆栈或者队列数据结构
public class LinkedTest {
/**
* @param args
*/
public static void main(String[] args) {
Duizhan dl = new Duizhan();
dl.myAdd("java001");
dl.myAdd("java002");
dl.myAdd("java003");
dl.myAdd("java004");
while (!dl.nonull()) {
System.out.println(dl.myGet());
}
}
class Duizhan
{
private LinkedList link;
Duizhan()
{
link = new LinkedList();
}
public void myAdd(Object obj)
{
link.addFirst(obj);
}
public Object myGet()
{
return link.removeLast();
}
public boolean nonull()
{
return link.isEmpty();
}
}
}
Set元素是无序的,元素不可以重复
无序指的是存入和取出的顺序不一定一致
有序指的是怎么存入进去的怎么取出来
Set
|---HashSet:底层数据结构是哈希表
hashSet是如何保证元素唯一性的呢?
是通过两个方法hashcode()和equals()来完成的
如果元素的hashcode()值相同,才会判断equals是否为true
如果元素的hashcode()不同,不会调用equals
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
Set:无序,不可以重复
|--HashSet:数据结构式哈希表。线程非同步
保证元素唯一性的原理:判断元素的hashcode值是否相同
如果相同,还会继续元素的equals方法,是否为true
|---TreeSet:可以对set集合中的元素进行排序。
底层数据结构式二叉树,保证元素唯一性的依据是compareTo方法是return 0
TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序 也叫元素的默认排序。
TreeSet的第二种排序方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合一初始化时就有了比较方式(参与构造函数)。
当元素自身不具备比较性,或者具备的比较性不是所需要的,这时就需要让容器自身具备比较性。定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数
当两种排序都存在的时候 以比较器为主。
定义比较器的方式:
定义一个类,实现comparator接口,覆盖compare方法。
泛型:jdk1.5版本以后出现的新特性,用于解决安全问题 是一个安全机制。
好处一:将运行时期出现的问题classCastException方便于程序员解决问题。让运行时的问题少,安全。
好处二:避免强制转换的麻烦。
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见,只要见到<>就要定义泛型。其实<>就是用来接收类型的。当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。