Java集合02

6.ArrayList

ArrayList的注意事项:

  1. Permits all element , including null ,ArrayList 可以加入null ,并且可以加入多个
  2. ArrayList是由数组来实现数据存储的
  3. ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高)而Vector是线程安全的。在多线程情况下,不建议使用ArrayList

例子1:ArrayList 可以加入null ,且可以加入多个null

package li.collections.list.arraylist;

import java.util.ArrayList;

public class ArrayListDetail {
@SuppressWarnings("all")
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add(null);
arrayList.add("jack");
arrayList.add(null);
System.out.println(arrayList);//[null, jack, null]
} }

6.1ArrayList源码分析

ArrayList构造器:

  1. ArrayList中维护了一个Object类型的数组elementData
transient Object[] elementData; // transient 表示瞬间,短暂的,表示该属性不会被序列化
  1. 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加,则elementData扩容为10,再次扩容则扩成elementData当前容量的1.5倍

  2. 如果使用的是在指定大小的构造器,则初始elementData的容量为指定大小,再次扩容则同样扩成elementData当前容量的1.5倍

例子:使用无参构造器

package li.collections.list.arraylist;

import java.util.ArrayList;

public class ArrayListSource {
@SuppressWarnings("all")
public static void main(String[] args) {
//使用无参构造器创建ArrayList对象
ArrayList list = new ArrayList(); //使用for循环给list集合添加1-10数据
for (int i = 1; i < 10; i++) {
list.add(i);
} //使用for循环给list集合添加11-15数据
for (int i = 11; i <= 15; i++) {
list.add(i);
} list.add(100);
list.add(200);
list.add(null); }
}

过程如下:

例子2:使用指定大小的构造器

如果是有参函数的构造器,扩容机制:

(1)第一次扩容,就按照elementData的1.5倍扩容

(2)整个执行的流程还是和前面讲的一样

7.Vector

vector的基本介绍:

1)Vector类的定义说明

2)Vector底层也是一个对象数组,protected Object[] elementData;

  1. Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized

4)在研发中,需要线程同步安全时,考虑使用Vector

7.1Vector源码分析

例子:

package li.collections.list.vector;

import java.util.Vector;

public class VectorTest {
@SuppressWarnings("all")
public static void main(String[] args) {
Vector vector = new Vector();
for (int i = 0; i < 10; i++) {
vector.add(i);
}
}
}

  1. 点击this,光标跳转到有参的构造器中,可以看出传入的initialCapacity是10 ,即调用无参构造器,默认初始容量就是10

  1. vector.add()方法

    ​ 2.1下面这个方法添加数据到vector集合

    ​ 2.2 确定是否需要扩容 条件:minCapacity - elementData.length >0

​ 2.3 如果需要的数组大小不够用,就扩容,扩容的算法:

newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);

Vector底层结构和ArrayList的比较

底层结构 版本 线程安全(同步)效率 扩容倍数
ArrayList 可变数组 jdk1.2 不安全,效率高 如果有参构造则为1.5倍;如果无参第一次为10,第二次及以后则按1.5倍
Vector 可变数组 jdk1.0 安全,效率不高 如果是无参,默认10,满后就按两倍扩容;如果指定大小,则每次按两倍扩

day19--Java集合02的更多相关文章

  1. Java集合02——三分钟了解你必须掌握的两个Set

    上一篇文章我们说到了 List ,本章开始,我们将继续讲解Set相关的知识.关注公众号「Java面典」了解更多 Java 知识点. Set 是一个无重复对象的集合类.值的重复与否是根据对象的 hash ...

  2. Java集合04——fail-fast&fail-safe 详解

    在前几个回合中,我们已经详细了解过了 Java 集合中的List.Set 和 Map,对这部分内容感兴趣的朋友可以关注我的公众号「Java面典」了解.今天我们将为各位介绍集合的失败机制--fail-f ...

  3. Java集合03——你不得不了解的Map

    Map 在面试中永远是一个绕不开的点,本文将详细讲解Map的相关内容.关注公众号「Java面典」了解更多 Java 知识点. Map Map 是一个键值对(key-value)映射接口: 映射中不能包 ...

  4. Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

    概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...

  5. Java 集合系列 02 Collection架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. 20180826(02)-Java集合框架

    Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用 ...

  7. Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)

    概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例 ...

  8. Java 集合系列目录(Category)

    下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录. 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系 ...

  9. Java集合源码分析(三)LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...

随机推荐

  1. Redis 全局通用命令整理

    转载请注明出处: 1.查看所有键 keys * 该命令会存在线程阻塞问题,keys 命令也可以通过正则匹配获取存在的缓存数据 2.查看键总数 dbsize dbsize命令会返回当前数据库中键的总数. ...

  2. SQL语言DDL

    MySQL数据库基本操作-DDL -- ctrl+/和# :注释 -- SQL语言不区分大小写: DDL:数据定义语言: 对数据库的常用操作: -- 查看所有的数据库: show databases; ...

  3. Vue出现Component template should ...

    当运行vue出现错误Component template should contain exactly one root element. If you ...的时候,我们只需要将<templa ...

  4. 用STM32玩OLED(显示文字、图片、动图gif等)

    目录 用STM32玩OLED(显示文字.图片.动图gif等) 1. 显示字符串 2. 显示中文 3. 显示图片 4. 显示动图 5. 总结测试 用STM32玩OLED(显示文字.图片.动图gif等) ...

  5. Linux系统下运行.sh文件

    在Linux系统下运行.sh文件有两种方法,比如我在root目录下有个vip666.sh文件 #chmod +x *.sh的文件名 #./*.sh的文件名 第一种(这种办法需要用chmod使得文件具备 ...

  6. Docker-配置华为云加速

    到网址点击立即使用 https://www.huaweicloud.com/intl/zh-cn/product/swr.html 登录后进入镜像服务 按要求操作即可 相关命令 vi /etc/doc ...

  7. go-zero微服务实战系列(七、请求量这么高该如何优化)

    前两篇文章我们介绍了缓存使用的各种最佳实践,首先介绍了缓存使用的基本姿势,分别是如何利用go-zero自动生成的缓存和逻辑代码中缓存代码如何写,接着讲解了在面对缓存的穿透.击穿.雪崩等常见问题时的解决 ...

  8. jieba分词的功能和性能分析

    jieba分词问题导引 用户词典大小最大可以有多大 用户词典大小对速度的影响 有相同前缀和后缀的词汇如何区分 对比百度分词的API 问题一:词典大小 从源码大小分析,整个jieba分词的源码总容量为8 ...

  9. python:**也不过如此嘛,这不也被我采集下来啦~

    前言 嗨喽!大家好呀,这里是小熊猫 知识点: 基本流程 fiddler抓包 开发环境: python 3.8 运行代码 pycharm 2021.2 辅助敲代码 requests 第三方模块 如果安装 ...

  10. sql server 跨IP库更新表字段(OPENDATASOURCE 、update)

    --跨ip库更新表字段 update uat set goodsType=dev.goodsType from OPENDATASOURCE('SQLOLEDB','Data Source=127.0 ...