java集合框架-Collection
Collection接口
Collection是存储单列数据的集合,主要有两个分支List、Set。
首先介绍一下Collection的常用抽象方法:
方法类型 | 方法名及说明 |
---|---|
boolean | add(E e)、 addAll(Collection<? extends E> c)添加指定元素或一组元素 |
boolean | contains(Object o) 、containsAll(Collection<?> c)如果此集合包含指定的元素,则返回 true。调用参数类型的equals()与集合中数据进行比较。 |
void | clear() 删除集合中所有元素。 |
boolean | equals(Object o)判断两个集合是否相等。 |
int | hashCode()返回集合的哈希值。 |
boolean | isEmpty()返回集合是否为空。 |
boolean | remove(Object o) 、removeAll(Collection<?> c) 从该集合中删除指定元素(如果存在)。若存在多个object,删除第一个。 |
boolean | retainAll(Collection<?> c) 仅保留两个集合的交集。 |
int | size()返回集合元素个数。 |
Object[] | toArray() 返回一个包含此集合中所有元素的数组。 |
Iterator< E > | iterator() 返回此集合中的元素的迭代器。 |
解释一下Iterator接口,主要用于遍历Collection的迭代器。
有三个常用方法next()(先下移再返回下移后集合上的元素,如果到最后一个元素依旧next(),则会报异常NoSuchElementException)、hasNext()(判断是否存在下一个与元素,存在返回true,不存在返回false)、remove()(删除当前迭代到的元素,如果连续两次调用remove就会报异常IllegalStateException);
List接口
List接口是Collection接口的一个子接口,存储的数据可以重复并且有顺序。有三个常用实现类ArrayList、LinkedList、Vector。
除了父接口的抽象方法外,List也有自己的一些抽象方法。
方法类型 | 方法名及说明 |
---|---|
void | add(int index, E element)、addAll(int index, Collection<? extends E> c) 将指定的元素或集合插入此列表中的指定位置。 |
E | get(int index) 返回此列表中指定位置的元素。 |
int | indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。 |
int | lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。 |
E | remove(int index) 删除该列表中指定位置的元素。 |
E | set(int index, E element) 用指定的元素替换此列表中指定位置的元素。 |
List< E > | subList(int fromIndex, int toIndex) 返回此列表中指定的 fromIndex (含)和 toIndex之间的视图。 |
ListIterator< E > | listIterator() 、 listIterator(int index) 返回列表中的列表迭代器(从头或者从指定位置开始)。 |
ArrayList实现类
底层是Object数组,线程不安全,增删慢,查询快。
JDK7之前:new时创建长度为10的数组,扩容默认为1.5倍(右移1位加上本身长度,同时复制到新数组中,为避免扩容带来的消耗,可new时使用带参的构造器)
JDK8之后:第一次添加数据时才会将数组创建,new时仅将数组初始化为{},后续的添加扩容不变。
LinkedList实现类
底层是双向链表,线程不安全,增删快,查询慢。
内部声明了Node类型的first、last变量,可以控制添加或删除数据到头部或者尾部等操作。
部分方法:
方法类型 | 方法名及说明 |
---|---|
void | addFirst(E e)、addLast(E e) 在该列表开头或尾部插入指定的元素。 |
E | getFirst() 、getLast() 返回列表的第一个或者最后一个元素。 |
… | … |
Vector实现类
底层是Object数组,线程安全(使用的是在方法上加synchronized),扩容为原来2倍,其他与ArrayList类似。JDK1.0时出现,不建议使用。
Set接口
Set接口是Collection接口的一个子接口,存储的数据不可以重复并且没有顺序。有三个常用实现类HashSet、LinkedHashSet、TreeSet。没有新增方法。
HashSet实现类
底层就是HashMap,值存储在map的key上,value是一个new Object()常量。
LinkedHashSet实现类
是HashSet的子类,底层是LinkedHashMap。对于频繁遍历操作,效率高于HashSet。
TreeSet:
底层是TreeMap,可以按照添加的对象的指定属性进行排序。有序,查询比List快。不能添加不同类的对象否则报ClassCastException。
排序规则:
1.无参构造器,会自动排序,可通过实现Comparable接口(如果compareTo()返回0会导致判断为重复数据)。
public TreeSet() {
this(new TreeMap<E,Object>());
}
public TreeMap() {
comparator = null;
}
2.创建一个Comparator对象传入TreeSet的带参构造器中进行排序。
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
public TreeMap(Comparator<? super K> comparator) {
this.comparator = comparator;
}
此文仅为学习记录之用,若有不足,欢迎指正,会随后续学习更改不足之处。