对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就使用集合容器进行存储。
集合特点:
1、用于存储对象的容器
2、集合的长度是可变的
3、集合中不可以存储基本数据类型
collection接口
集合容器应为内部的数据结构不同,有多种具体容器。不断的向上抽取,形成了集合框架
框架的顶层collection接口:
E --- object
1、添加
boolean add(E e)
boolean addAll(Conection coll)
boolean remove(Object obj) 会改变集合长度。
boolean removeAll(Collection coll) 将两个集合中的相同元素删除
void clear();
3、判断
boolean contains(Object obj)
boolean containsAll(Collection coll)
boolean isEmpty(); 集合是否有元素;
4、获取个数、长度
int size();
Iterator iterator();取出集合中的元素,返回迭代器对
实例:
for(Iterator it = Collection.iterator; it.next()){
System.out.println(it.next());
}
该对象必须依赖于具体的容器,因为每个容器的数据结构都不同所以该迭代器对象在容器进行内部实现对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator对象。
Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
通过内部类实现迭代器的。就是实现了Iterator接口的内部类对象
5、其他
boolean retainAll(Collection coll) ; 取交集
object toArray();将集合转换为数组
-------------------------------------------------
Collection
|--List:有序(存入和取出的顺序一致),元素都有索引,元素可以重复。|--Set: 元素不能重复,无序。
List:特有的常见方法:有一个共性的特点:都可以操纵角标
1、添加void add(index,element);指定角标位置添加元素
void add(index,collection);指定角标位置添加集合元素
2、删除
Object remove(index); 返回被修改的元素
3、修改
Object set(index,element); 返回被修改的元素
4、获取
Object get(index);
int indexOf(Object); 返回元素对应的角标
int lastIndexOf(object); 返回元素的反向角标
List subList(from,to); 返回包含角标from到to的元素,不包含角标to的元素
5、列表迭代器
ListIterator(); 可以实现在迭代过程中对元素的增删改查,只有List集合具备该接口。
ListIterator(index); 迭代器从指定的角标开始
6、逆向遍历
HasPrevious();是否有前一个元素
在迭代器过程中,不要使用集合操作元素,容易出现异常
可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行跟多的操作。
List:
|--Vector: JDK1.0出现 类可以实现可增长的数组。内部是数组数据结构,是同步的。几乎不用了。增删查询都很慢。数组可增长的原理(创建新的数组将原先数组中的内容复制到新的数组中) 100%延长,查询速度快。
|--ArrayList: JDK1.2出现 内部是数组数据结构,是不同步的。替代了Vector。(如果进程同步则需要加锁)50%延长
|--LinkedList: 内部是链表数据结构,是不同步的。链表增删元素的速度非常快。
LinkedList:
addFirst();addLast();
JDK1.6
offerFirst();
offerLast();
getFirst(); //获取单不移除,如果链表为空,抛出NoSuchElementExeption异常。
getLast();
JDK1.6
peerFirst(); //获取单不移除,如果链表为空,返回NULL
peerLast();
removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementExeption异常。
removeLast();
JDK1.6
pollFirst(); //获取并移除,如果链表为空,返回NULL
pollList();
//基本数据类型值赋值给引用的时候装箱,基本数据类型与引用作用算的时候拆箱
ArrayList:
内部默认创建十个元素位置数组。集合里装的都是引用,不是对象本身。
next()方法取出元素之后记得强转。
---------------------
set集合:
元素不可重复、无序。确保元素的唯一性。
Set接口中的方法与Collection一致。|--HashSet:内部数据结构是哈希表,是不同步的,
|--LinkedHashSet: 有序的存储且元素唯一
|--TreeSet:
哈希表:
哈希算法:通过对元素的一系列运算,计算得到其的存储序号。下次查找则再次计算其序号,获得。常见算法 取余哈希表确定两个元素是否相同:
1、判读两个元素的哈希值是否相同。
如果相同,再判断对象的内容是否相同
2、判断哈希值相同,其实判断的是对象的hashCode的方法,判断内容相同,用的是equals方法。
注意:如果哈希值相同,是不需要判断equals的。
|--TreeSer:
可以对Ser集合中的元素进行排序,是不同步的
判断元素唯一性的方式:就是根据比较方法的返回结果是否为0,是0,就是相同元素,不存该元素TreeSer对元素进行排序的方式之一:
让元素自身具备比较的功能,就需要实现Comparable接口,覆盖compareTo()方法.