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. CSP-J游记

    祝大家 CSP-J/CSP-S 稳过第一轮 ~(- ∨ -)~ ~~ 建议扩大110%食用 ~~ 中秋快乐鸭(希望大家不会收到损友送的砖头月饼 : − ) :-) :−)) 咳咳,昨天是我们可爱初赛来 ...

  2. 移动云使用 JuiceFS 支持 Apache HBase 增效降本的探索

    作者简介: 陈海峰,移动云数据库 Apache HBase 开发人员,对 Apache HBase.RBF.Apache Spark 有浓厚兴趣. 背景 Apache HBase 是 Apache H ...

  3. ElasticSearch7.3学习(三十)----ES7.X SQL新特性解析及使用Java api实现sql功能

    一.ES7 sql新特性 1.1 数据准备 创建索引及映射 建立价格.颜色.品牌.售卖日期 四个字段 PUT /tvs PUT /tvs/_mapping { "properties&quo ...

  4. 3. Docker应用

  5. wappalyzer 上各种开源框架功能

    Underscore.js  官网地址:https://underscorejs.org/     一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScrip ...

  6. React + Typescript领域初学者的常见问题和技巧

    React + Typescript领域初学者的常见问题和技巧 创建一个联合类型的常量 Key const NAME = { HOGE: "hoge", FUGA: "f ...

  7. iNeuOS工业互联网操作系统,增加搜索应用、多数据源绑定、视图背景设置颜色、多级别文件夹、组合及拆分图元

    目       录 1.      概述... 2 2.      搜索应用... 2 3.      多数据源绑定... 3 4.      视图背景设置颜色... 4 5.      多级别文件夹 ...

  8. tomcat JDK环境变量配置及tomcat多项目的配置

    1.解压JDK tar xzf jdk-8u171-linux-i586.tar.gz -C /usr/local -->mv /usr/local/jdk1.8.0_171 /usr/loca ...

  9. CompletableFuture的入门

    runAsync 和 supplyAsync runAsync接受一个Runable的实现,无返回值 CompletableFuture.runAsync(()->System.out.prin ...

  10. docker compose 部署 minio

    1.docker-compose.yaml 文件如下: version: '3' services: minio: image: minio/minio:latest # 原镜像`minio/mini ...