集合框架
集合特点:
- 用于存储对象的容器
- 集合的长度是可变的
- 集合中不可以存储基本数据类型值
- 集合容器不断向上抽取,就形成了集合框架,框架的顶层为Collection接口
Collection的方法
- 添加:
- boolean add(Object obj);添加对象obj,添加成功返回true,反之返回false
- boolean addAll(Collection col);添加指定collection的所有元素
- 删除:
- boolean remove(Object obj)
- boolean removeAll(Collection col);移除两个集合中的相同元素
- void clear();清空
- 包含:
- boolean contains(obj)
- boolean containsAll(col)
- boolean isEmpty();是否有元素
- 获取:
- int size();获取长度
- Iterator iterator();取出元素,这是个接口
- boolean retainAll(col);取两个collection的交集,与removeAll()的功能相反
- Object[] toArray();将集合转换成数组
Iterator接口
- next();取元素
- boolean hasNext();
//
Collection coll = new ArrayList()
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
for(Iterator it = coll.iterator(); it.hasNext();){
System.out.println(it.next());
}
List接口
- 有序:存入和取出的顺序一致;
- 元素都有索引
- 元素可以重复
特有常见方法:
只有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(obj);
int lastIndexOf(obj);
List subList(from, to)
List有三个主要子类对象:
- Vector:内部是数组数据结构,是同步的,几乎不再使用
- ArrayList:内部是数组数据结构,不同步,查询速度快,替代了Vector,如果是多线程需要同步,也不会使用Vector,而是在里面添加锁保证同步
- LinkedList:内部是链表数据结构,不同步,增删速度快
LinkedList
LinkedList link = new LinkedList();
link.addFirst("abc1");
link.addFirst("abc2");//添加到头部
link.addFirst("abc3");
link.addLast("abc4");
link.getFirst();//获取第一个元素,如果链表为空,抛出异常
link.peekFirst();//获取第一个元素,链表为空则返回null
link.removeFirst();//获取并删除第一个元素
link.pollFirst();//链表为空返回
Set接口
- 元素不能重复
- 无序
- Set接口中的方法和Collection一致
两个主要子类对象:
- HashSet:内部数据结构是哈希表,不同步,存储的数据唯一
- TreeSet:可以对Set集合中的元素进行指定排序,不同步
哈希表
哈希表如何确定元素是否相同?
- 判断两个元素的哈希值是否相同,如果相同,再判断两个对象的内容是否相同。
- 判断哈希值是否相同,使用对象的hashCode()方法,判断内容是否相同,使用equals()方法。
HashSet hs = new HashSet();
hs.add("a");
hs.add("b");
hs.add("c");
hs.add("a");
Iterator it = hs.iterator();
while(it.hasNext()) {
System.out.println(it.next());//输出结果是无序的,且无重复元素
}
//往HashSet存储自定义对象
HashSet hs = new HashSet();
hs.add(new Person("list1",27));
hs.add(new Person("list8",14));
hs.add(new Person("list6",34));
hs.add(new Person("list3",21));
//需要在Person类中覆盖Object的hashCode方法和equals方法
Iterator it = hs.iterator();
while(it.hasNext()) {
Person p = (Person)it.next();
System.out.println(p.getName()+":"+p.getAge());
}
不论是ArrayList还是HashSet,判断是否有重复元素,以及remove(),contains()等方法,核心都是equals方法
- HashSet的子类LinkedHashSet实现了有序的功能
TreeSet
- TreeSet判断元素唯一性的方式:根据比较方法的返回结果是否为0,为0则表示是相同元素,不存储
两种排序方式:
- 让元素具备比较功能,实现comparable接口,覆盖compareTo()方法
- 让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare()方法,将该类对象作为参数传递给TreeSet集合的构造函数。
- 不想按照对象具备的自然顺序进行排序,或者对象不具备自然顺序时,选择构造比较器。