6.集合

集合(从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再探

底层数据结构为数组!

  1. 增加元素

    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,如果容量不足,则会动态地扩容

  2. 删除元素

    public E remove(int index);// 删除索引处的元素

    删除后剩下的元素会往左移,但数组的容量不会变,如果想把容量更新,需要使用trimToSize方法

  3. 查找元素

    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的索引值

  4. 修改元素

    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;
    }
    
  5. 求长度

    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又被称为映射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值