Collection 接口
- 子接口list 和 Set
Collection<> c=new ArrayList<>()
- 常用方法:
c.size //
c.isEmpty //判断是否为空
c.add("xxx");//添加元素
System.out.println(c);// [xxx]
c.remove("xxx");//移除对象
c.toArray();//转成Object数组
c.contains("xxx");//是否包含xxx元素
iterator()
containsAll(Collection c);
addAll(Collection c);
removeAll(Collection c)//移除本容器和c容器中都包含的元素
retainAll(Collection c) //保留本容器和C容器都包含的元素 其他元素删除
List:有序、可重复的容器 满足e1.equals(e2)的元素重复加入容器
常用的实现类:
ArrayList、 LinkedList、 Vector
-
ArrayList 底层是数组 查询效率高 增删效率低 线程不安全
-
LinkedList 底层链表 查询慢 增删快
-
Vector底层也是数组 但是线程安全
List方法
List list=new ArrayList()
list.add(1,"B");//指定索引添加元素
list.remove(1);//删除指定索引位置的元素
list.set(1,“B”);//修改指定索引位置的元素
list.get(1);获取指定索引位置的元素
list.indexOf(“A”)返回指定元素第一次出现的索引位置 如果不存在返回-1
list.lastIndexOf("A")返回指定元素最后一次出现的索引位置 如果不存在返回-1
List底层是数组 长度是10 当元素超过10 开始扩容 从新定义一个1.5倍原容量大小的数组 将原先数组中的元素拷贝到新数组中 新的元素依次往后添加
private static final int DEFAULT_CAPACITY = 10;
......
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //10+10/2
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
删除元素
指定索引位置后的元素全部往前移动 需要移动很多元素所以删除慢
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
Vector
线程安全的
大部分方法都使用了synchronized修饰
public synchronized int indexOf(Object o, int index) {
if (o == null) {
for (int i = index ; i < elementCount ; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = index ; i < elementCount ; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}