Javase自学笔记-->集合Collection框架

集合Collection

集合,数组-->对多个数据的存储,简称Java容器

大体分为:Collection接口,Map接口两大体系

 

1.Collection接口通用功能

add,size,addAll,isEmpty,contains,containsAll之流

hashcode,toArrays:集合-->数组,asList:数组-->集合==注意,new int[]这种会认为是一个元素-->写成new Interger

2.迭代器Iterator接口

用于遍历

next,previous理解:在元素之间,next()-->跨过前面这个元素,并返回该元素,previous同理

remove:

 

3.List接口-->“动态”数组

有序,可重复

3.1ArrayList

线程不安全,效率高,底层Object[]

  • 源码分析

//用无参构造器创建
//创建了一个空的elementData
ArrayList arrayList = new ArrayList();
//执行add先ensureCapacityInternal确定是否要扩容
//可以的话给elementData
//minCapacity先确定一个最小容量,第一次为10;
//modCount++记录集合被修改的次数
//elementData容量不够的话,调用grow()方法

初始化

jdk8在创建时先不默认来10个,而是空,在add等操作时候再让其变成10-->懒汉式(线程不安全的原因)

那么我们也知道jdk7就是饿汉式,默认先来10个

扩容grow

提供一个之后期望的值minCapacity-->扩容成为原来1.5 or minCapacity 中间的最大值(新造数组,然后copy)

    /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     * @throws OutOfMemoryError if minCapacity is less than zero
     */
    private Object[] grow(int minCapacity) {
        int oldCapacity = elementData.length;
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
    }

    private Object[] grow() {
        return grow(size + 1);
    }

3.2LinkedList

底层双向链表,对于频繁的插入,删除效率高

  • 源码分析

底层放在一个个Node中,看一下add-->linkedlast==在最后加一个Node

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

3.Vector

古老,线程安全,效率低,底层Object[]

基本不用了,默认扩2倍,默认先来10个

3.4List常用方法

4.Set接口

无序,不可重复

以HashSet为例

无序:并非随机,根据数据的哈希值排序

不可重复:用equals判断

4.0对于实体类的hashcode重写

4.1HashSet

主要实现类,线程不安全,可以存储null值,底层是HashMap

  • 添加元素过程

懒汉,16,保证无序,不可重复:hashcode()即可!equals重写比较的是hashcode()!

hashcode重写-->尽量一致,保证内容相同的对象hashcode相同

添加-->计算这玩意的hashcode-->看看这个位置有没有人,没有就添加进去-->同时保证无序+不可重复

4.2LikkedHahSet

遍历:可以按添加的顺序遍历,每个添加的附加了链表

4.3TreeSet

可以按照添加对象的指定属性进行排序,底层:树

1.添加的数据要由同一个类提供

2.自然排序:实现Comparable接口的,不然就去重写-->比较两个是否相同是通过compareTo方法

3.定制排序:实现Comparator接口的,compare方法

5.Map接口

key-value-->key相当于用set存储:无序,不可重复

5.1HashMap

线程不安全,效率高,可以存储null

※底层实现,源码分析

 

 

jdk7:

jdk8:-->懒汉式-->Node[]-->一个索引位置数据大于8,数组长度大于64,改为红黑树存储

源码:

 

无参构造器-->还没创建,只是定义加载因子0.75

put-->putVal-->第一次?resize-->这个时候16创建-->像上面那样的底层逻辑

5.2HashTable

古老,线程安全,效率低,不可以存储null

5.3TreeMap

可以按照添加的key-value排序(key),底层红黑树

类似-->自然排序+定制排序

6.Collections工具类

###

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值