集合(从Java源码里面去学习,笔记略去了泛型程序设计的写法)
Collection
Map
Collection
// 迭代器
Iterator<E> iterator();
// 增加
boolean add(E e);
// 删除
void clear(); // 移除所有元素
boolean remove(Object o);// 移除一个元素
// 判断
boolean contains(Object o);//元素o是否在集合中
// 求交集
boolean retainAll(Collection c)// 移除Collection c中为包含指定Collection的元素,将结果保存在指定Collection
Iterator接口
查看Java源码可以发现Iterable接口中封装了一个返回Iterator接口实例的方法:
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();
}
由上图可知道这些实现了Collection接口的类ArrayList等等)都可以使用Iterator接口(因为Collection继承的是Iterable接口。。。。)
boolean hasNext();// 如果还有元素,则返回true
E next();// 返回下一个元素
default void remove();// 删除迭代器返回的最后一个元素
List
ArrayList再探
底层数据结构为数组!
-
增加元素
public void add(E e);// 直接在尾部增加元素
public boolean add(E e) { modCount++; add(e, elementData, size); return true; }
public void add(int index, E element);// 在索引为index的位置插入E类型的元素element,如果容量不足,则会动态地扩容
-
删除元素
public E remove(int index);// 删除索引处的元素
删除后剩下的元素会往左移,但数组的容量不会变,如果想把容量更新,需要使用trimToSize方法
-
查找元素
public E get(int index);// 获取索引处的元素
如果index > size,那么会抛出一个IndexOutOfBoundsException异常
// 检查⻆标 private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } // 返回元素 E elementData(int index) { return (E) elementData[index]; }
public int indexOf(Object o);// 获取对象o的索引值
-
修改元素
public E set(int index, E element);// 将索引处的元素值替换为element的值,并且返回旧值
public E set(int index, E element) { Objects.checkIndex(index, size);// 检查角标 E oldValue = elementData(index); elementData[index] = element; return oldValue; }
-
求长度
public int size();
LinkedList
在Java实际开发中用的不多,在算法分析中应用广泛
底层数据结构为双向链表!
看一下get方法:
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}
Node<E> node(int index) {
// assert isElementIndex(index);
// 小优化:如果下标小于长度的一半,那么从头遍历;否则从尾部遍历
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
Set
没有重复元素的集合
哈希表(hash table)
在Java中,哈希表是由链表加数组实现的,每个列表被称为桶。当桶太满时(装填因子大于0.75),就需要对哈希表进行再散列,创建一个桶数更多的哈希表
- 在JDK8中,桶满时数据结构会从链表变为红黑树
红黑树
二叉查找树
Map
able)
在Java中,哈希表是由链表加数组实现的,每个列表被称为桶。当桶太满时(装填因子大于0.75),就需要对哈希表进行再散列,创建一个桶数更多的哈希表
- 在JDK8中,桶满时数据结构会从链表变为红黑树
红黑树
二叉查找树
Map
Map又被称为映射