1.单列集合框架结构
- Collection接口:单列集合,用来存储一个一个的对象
- List接口:存储有序的、可重复的数据。 -->“动态”数组
- ArrayList、LinkedList、Vector
- Set接口:存储无序的、不可重复的数据
- HashSet、LinkedHashSet、TreeSet
2.Collection集合常用方法
- boolean add(E e) 向集合中添加一个元素,添加成功则返回true
- boolean addAll(Collection c) 将给定集合中的所有元素添加到当前集合中,当方法调用后当前集合元素发生了变化则返回true
- int size() 返回当前集合的元素个数
- boolean isEmpty() 判断当前集合是否为空集,当且仅当size为0时,返回值为true
- void clear() 清空集合
- boolean contains(Object o) 是否包含指定元素o,判断依据时该元素是否与集合现有元素存在equals比较为true的,如果存在则认为包含。
- boolean containsAll(Collection c) 判断当前集合是否包含指定集合(全包含)
- boolean remove(Object o) 删除指定元素o,remove方法删除元素时也是删除与集合元素equals比较为true的元素,如果元素本身没有重写 equals则比较的是地址值。注意:对于List集合而言,重复元素仅会删除一次。
- boolean retainAll(Collection c) 取交集,仅保留当前集合中与给定集合的共有元素到当前集合中
- boolean removeAll(Collection c) 删除当前元素与给定元素的共有元素(删交集)
- Iterator iterator() 返回此集合的迭代器,用于遍历集合
3.集合转数组
集合 —>数组:toArray()
传入的数组类型应当与集合元素类型一致。而数组长度没有要求。
toArray的原则是传入的数组能用(length>=size)时就直接使用该数组
否则自行创建一个与集合size一样长,类型与传入的数组类型一致的数组并返回
<T> T[] toArray(T[] a)
//示例:集合c的size=5
// String[] array = c.toArray(new String[c.size()]);array.length = 5
// String[] array = c.toArray(new String[10]);array.length = 10
String[] array = c.toArray(new String[0]);//array.length = 5
4. 数组转集合
数组 —>集合:调用Arrays类的静态方法asList(T … t)
只能转换为List集合
在转为List集合后,对集合的操作就是对原数组的操作(对原数组操作也会改变集合),由于数组是定长的,只能使用集合的set方法,不能使用增(add)删(remove)操作,使用增删操作会抛出:java.lang.UnsupportedOperationException异常
public static <T> List<T> asList(T... a)
5.Collections集合工具类
- public static void reverse(List<?> list) 反转List集合
- public static <T extends Comparable<? super T>> void sort(List list) 对List集合进行自然排序
6.Iterator迭代器
主要作用:遍历集合
- boolean hasNext() 判断是否有下一个元素,从第一个元素之前开始判断,有下一个元素则返回true
- E next() 返回迭代的下一个元素,只要调用此方法,指针就会向后移动,一般配合hasNext方法使用。
- void remove() 从集合中删除迭代器当前位置对应的元素,即next方法获取的元素。(可选)
使用实例:
public class IteratorDemo2 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("1");
c.add("#");
c.add("2");
c.add("#");
System.out.println(c);//[1,#,2,#]
Iterator<String> iterator = c.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if ("#".equals(next)){
//迭代器采取快速失败原则,要求:使用迭代器遍历集合的过程中不能通过集合
//的方法增删元素,否则会抛出异常:java.util.ConcurrentModificationException
//c.remove(next);
iterator.remove();
}
}
System.out.println(c);//[1,2]
}
}
7.List集合
由于List存储的特点是有序的、可重复的,因此可以利用角标进行相关操作。
除开父类Collection集合提供的方法外,List集合还有以下方法:
- E set(int index , E e) 将给定元素e设置到指定下标index处。返回值为集合index处被替换的元素。实际上就是做替换元素操作
- void add(int index,E e) 在指定位置index处插入一个元素e
- E remove(int index) 移除指定角标上的元素,返回被移除的元素
- List subList(int fromIndex, int toIndex) 获取该List集合的子集,含前 不含后,对子集的任何操作,就是对原集合对应元素的操作,会影响原集合
对List集合的排序 Collections.sort()
方式一:sort方法在排序List集合时,要求集合元素必须实现Comparable接口,但是这种方式会对我们的代码造成侵入性
方式二:定义匿名内部类Comparator,重写compare()方法,在该方法内定义比较的方式,然后将该比较器传给(重载的方法)Collections.sort(集合,比较器)