集合类的由来:
对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。
就使用集合容器进行存储。
集合特点:
1,用于存储对象的容器。
2,集合的长度是可变的。
3,集合中不可以存储基本数据类型的值。
集合容器因为内部的数据结构不同,有多种具体容器。
不断的向上抽取,就形成了集合框架。
框架的顶层是Collection接口,定义了集合框架中共性的方法.
Collection的常见方法:
1,添加
boolean add(E e);
boolean addAll(Collection<? extends E> c)
2,删除
boolean remove(E e);
boolean removeAll(Collection<?> c) ;
void clear();
3,判断
boolean contains(Object o)
boolean containsAll(Collection<?> c)
boolean isEmply();
4,获取
int size();
Iterator<E> 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 get(index);
int indexOf(object);
int lastIndexOf(object);
Last subList(from,to);
4,修改
Object set(index,element);
ListIterator迭代器可实现对list集合进行增删改查。
List集合常用实现子类:
Vector:内部是数组数据结构。是同步的。(几乎不怎么用,但是比较特殊),可变数组,100%延长。
增删,查询都很慢。
ArrayList:内部是数组数据结构,是不同步的。替代了Vector。
如在多线程中,一般采用ArrayList加锁的形式实现。
可增长数组,50%延长。
查找元素的速度很快。
LinkedList:内部是链表数据结构,非同步的。增删元素的速度很快。
LinkedList新老方法对比:
addFirst();
addLast();
jdk1.6
offerFirst();
offerLast();
getFirst();//获取但不移除,如果链表为空,抛出NoSuchElementExcetion
getLast();
jdk1.6
peekFirst();//获取但不移除,如果链表为空,返回null
peekLast();
removeFirst();//获取并移除,如果链表为空,抛出NoSuchElementExcetion
removeLast();
jdk1.6
pollFirst(); 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
pollLast();
Set :元素不可以重复,是无序的。
Set接口中的方法和Collection中的一致。
常用子类:
HashSet:内部数据结构是哈希表,是不同步的,存储元素的时候,使用的是元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals方法来确定内容是否相同。
哈希表判定元素是否相同
1,判断的是两个元素的哈希值是否相同,如果相同,再判断两个对象的内容是否相同。
2,判断哈希值相同,其实判断的是对象的hashCode得方法,判断内容相同,用的是equals方法。
注意:如果哈希值不同,是不需要判断equals的。
LinkedHashSet:这个可以是有序的,与链表结合使用。
TreeSet:可以对Set集合中的元素进行排序,是不同步的。
判断元素唯一性的方式:就是比较方法的返回结果是否是0,是0就是相同的元素。compareTo方法比较。
TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,元素就需要实现Compareable方法覆盖compareTo方法。