今日学习内容总结如下:
概述Collection、List和Set接口
Collection接口是List接口与Set接口的父类接口,而各个集合的又是List接口与Set接口的实现类。
Collection接口 无序 允许重复
public interface Collection<E> extends Iterable<E>
常见方法:
int size();获取集合中的元素个数
boolean contains(Object o) 判断集合中是否有指定的对象,有true没有false。
元素相等是依赖于equals方法实现的
Object[] toArray();将集合转换为Object类型的数组
<T> T[] toArray(T[] a);
String[] arrs=cols.toArray(new String[] {});
boolean add(E e);向集合中新增元素,成功true否则false
boolean remove(Object o);删除指定的元素o,相等判断使用equals
void clear(); 清空集合中的所有元素
List接口 有序【有下标序号】 允许重复
public interface List<E> extends Collection<E>
特殊的方法就是引入序号
E get(int index);按照索引序号获取指定位置上的元素,需要不能越界
E set(int index, E element);修改指定位置上的元素,覆盖
void add(int index, E element);向指定位置上添加元素,原始数据后移
E remove(int index);删除指定位置上的元素,并返回被删除的元素,原始位置上的元素前移
有可能产生二义性的用法
List<Integer> list=...;
list.remove(3); 调用的是remove(int)方法,不是指定元素删除,而是指定位置删除
list.remove(Integer.valueOf(3)); 删除指定元素,不是序号
int indexOf(Object o);从前向后查找第一次出现o的下标位置,如果查不到则返-1
int lastIndexOf(Object o);从后向前查找
List接口与Collection接口相比,比其增加了一个get()、set()方法,可以通过指定的索引值取得
修改、内容。要想取得接口的实例化对象则其必须有子类,在List接口下有三个常用子类:
ArrayList、LinkedList、Vector
Set接口 无序【没有下标序号】 不允许重复
HashSet的特点:无序且不可重复
1.存储时顺序和取出的顺序不同
2.不可重复
3.放到hashSet集合的元素实际上是放到HashMap集合的key部分了。
TreeSet集合存储元素的特点
无序不可重复的,但是存储的元素可以自动按照大小顺序排序,称为可排序集合
概述ArrayList、LinkedList和Vector的区别
相同点:都实现了list接口
ArrayList和Vector底层都使用Object[] elementDate存储
不同点:ArrayList底层的实现是数组,而LinkedList是双向链表。
ArrayList进行随机访问所消耗的时间是固定的,因此随机访问时效率比较高。
LinkedList是不支持快速的随机访问的,但是在插入删除时效率比较高。
Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;
两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会
扩充为原来的1.5倍,Vector会扩充为原来空间的2倍)
Vector可以设置增长因子,而ArrayList不可以。
ArrayList有三个构造方法,
public ArrayList(int initialCapacity) { 参数是初始化容积值
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA; 空数组
} else {
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
}
}
public ArrayList() { 使用的是延迟初始化数组的策略,这里给elementData数组赋值为空数组,当第一次添加元素时才进行数组的初始化操作
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> c) { 用于集合类型数据的转换
elementData = c.toArray();
if ((size = elementData.length) != 0) {
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}
Vector有四个构造方法。
public Vector(int initialCapacity, int capacityIncrement) { 可以设置初始化容积和扩容步长值
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) { 只有一个初始化容积值,则默认的扩容步长值为0
this(initialCapacity, 0);
}
public Vector() {
this(10); Vetor默认立即初始化操作,ArrayList默认采用的是延迟初始化数组的方式。这里可以看到默认的初始化容积值为10
}
public Vector(Collection<? extends E> c) { 可以将Collection转换为Vector类型
elementData = c.toArray();
elementCount = elementData.length;
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class); 参数1是原来的数组,参数2是新长度,参数三为目标类型
}
如何选用:ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
Vector:数组实现,重量级 (线程安全、使用少)