JAVA-容器二{容器-单例集合-Vector}JAVA从基础开始 --6

概况

容器:管理和储存数据的 叫容器
java的容器是在内存层面的(临时存储)

1.变量 int i
2.数组 int[] i

线性,可快速访问元素
只有length 没有其他方法 不方便使用

结构

单例集合

List接口

有序 :存入数据与取出顺序是一致的 有对应的索引标记
可重复:List通常满足 e1.equals(e2)

常用方法 (多了些索引的方法)

◆void add (int index, Object element) – 在指定位括入元崇,以前元全部后移一位–同javascript中的 splice(n,m,Object)
◆Object set (int index,Object elemen – 像改指定位的元素
◆Object get (int index) – 返回指定位而的元东
◆Object remove(int index) – 删除指定位v的元素。后面元素全部移位–同javascript中的 splice(n,1)
◆int indexof (Object o) – 返回第个匹配元素的索引,如果没有该元素,返回-1
◆int lastindexof (Object o) – 返回最后一个匹配元素的索引,如果没有该元素,返回 -1

Vector容器类 – 多线程安全的模式

Vector底层是用数组实现的,相关的方法都添加了同步检查,因此“线程安全,效率低”比如,indexOf增加了synchronized同步标记。

Vector的使用方法和ArrayList是相同的,因为他们都实现了List接口。,对List接口中抽象方法做了具体实现

package top.baokeaia;

import java.util.List;
import java.util.Vector;

public class VectorTest {

    //    封装循环数组
    static void fo(List list, String msg) {
        System.out.println("------------------------");
        int listLength = list.size();
        //自带方法判断容器是否是空
        if (list.isEmpty()) {
            System.out.println("list.isEmpty()值  =  " + list.isEmpty());
            System.out.println("isEmpty方法判断,容器数组是否为空");
            return;
        }
        if (listLength <= 0) {
            System.out.println("容器数组被清空或者数组出现异常");
            return;
        }
        for (int i = 0; i < listLength; i++) {
            System.out.println(list.get(i) + "-----" + msg);
        }
    }


    public static void main(String[] args) {
        //实例化Vector
        List<String> v = new Vector<>();
        v.add("a");
        v.add("b");
        v.add("c");
        VectorTest.fo(v, "正常循环数组,通过Vecor实现");


    }
}
Vector源码分析

当我们Ctrl点击new 的Vector后
得到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;
    }

    /**
     * Constructs an empty vector with the specified initial capacity and
     * with its capacity increment equal to zero.
     *
     * @param   initialCapacity   the initial capacity of the vector
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */
    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }

    /**
     * Constructs an empty vector so that its internal data array
     * has size {@code 10} and its standard capacity increment is
     * zero.
     */
    public Vector() {
        this(10);
    }

可以看到,当调用无参构造后,执行了有参构造
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
再执行了
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
若是传入的initialCapacity 小于0,抛出异常
反之,创建一个size是10的Object数组,
再把计数器capacityIncrement 赋值数组的第一位的下标,也就是0

和ArrayList相比,Vector再new阶段已经创建了一个容量为10的Object数组。

add方法使用ArrayList中一样顺序进入并找到

 public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }
 private void ensureCapacityHelper(int minCapacity) {
 //扩容条件
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
private void grow(int minCapacity) {
//扩容
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

可以看到前面加了个synchronized ,线程同步-祥见线程章节,可以使使用这个方法的多线程对象,排队使用这个方法,解决线程安全问题
扩容一次超出容量到20,2次40,以原数组以2倍容量进行扩容

双例集合

结构是 Key – Value

Map接口 :数学中的函数概念 自变量x只能对应一个y

HashMap类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻动琴弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值