- 集合的由来:对象用于封装特有的数据,对象多了需要存储,如果对象的个数不确定,及使用集合容器来存储。
- 集合的特点:用于存储对象的容器,集合的长度是可变的,集合中不可以存储基本数据类型
- Collection的常见方法:
1 .add(Object ob)添加。
2.addAll(Collection coll)添加所有。
3 .remove(Object ob)删除。
4 .removeAll(Collection<> coll )清除多个。
5 .clear()清空所有
6 .contains(Object obj)判断是否包含
7.containsAll(Collection<> coll)判断是否包含一堆
8.isEmpty()判断是否为空
9.size()获取集合的长度
10.iterator()迭代器,取出元素的方法,返回值为Iterator
11.returnAll(Collection<> coll)返回两个集合的交集
12.toArarry()讲集合变换成数组 - 集合的遍历方法,第一种迭代器的一种方式:
Iterator it = coll.iterator()
while(it.hasNext()){
it.next();
}
迭代器遍历的另外一种方式:
for(Iterator it = coll.iterator();it.hasNext();){
it.next();
}
- 通过对源码的分析得出,迭代器其实就是实现了Iterator接口的每一个容器的内部对象。该对象必须依赖于具体容器,因为每个容器的数据结构都不同,所以该迭代器对象是在容器中进行内部实现。
- List特点:有序,存入和取出的顺序是一致的,元素都有索引(角标),元素可以重复。Set的特点:元素不能重复,无序。
- 在迭代的过程中不要使用集合操作元素容易出现异常 (ConcurrentModificationException)如:
Iterator it = coll.iterator()
while(it.hasNext()){
coll.add("d");//
}
- 解决上述问题可以使用Iterator的子接口ListIterator来完成:
ListIterator it=coll.listIterator()
while(it.hasNext()){
it.add("d");
}
List:
Vector:内部是数组数据结构,是同步的
ArrayList:内部是数据数据结构,不同步的。替代了Vector查询速度快
LinkedList:内部是链表数据结构,是不同步。增删快。关于Vector的的使用:
Vector v = new Vector();
v.addElement("abc1");
v.addElement("abc2");
Enumeration en = v.elements();
while(en.hasMoreElements()){
en.nextElement();//可以使用迭代器进行替换操作
}
- 关于LinkedList:
LinkedList link = new LinkedList();
link.addFirst("abc1");
- ArrayList:
集合里添加对象其实是存的该对象的引用,在1.5版本以后可以直接al.add(5),自动装箱
13.Set接口中分方法和Collection一致
|— HashSet 内部数据结构是哈希表,取出方式只有迭代器,无序不重复,不同步,在存储元素的时候,使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同,它的之类LinkedHashSet,可以保证唯一的情况下有序
| TreeSet 可以对set集合中的元素进行指定顺序的排序,不同步
哈希表确定元素是否相同
1,判断的是两个元素的哈希值是否相同,如果相同,在判断两个对象的内容是否相同。
2,判断哈希值相同,其实判断的是对象的hashCode方法。判断内容相同,用的是equals方法
3如果哈希值相同,内容不同,那么对象在哈希表的位置可以顺延或者挂在该位置上(该几率比较小)
注意:如果哈希值不同,是不需要判断equals的