day19--Java集合02
Java集合02
6.ArrayList
ArrayList的注意事项:
- Permits all element , including null ,ArrayList 可以加入null ,并且可以加入多个
- ArrayList是由数组来实现数据存储的
- 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构造器:

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

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

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的更多相关文章
- Java集合02——三分钟了解你必须掌握的两个Set
上一篇文章我们说到了 List ,本章开始,我们将继续讲解Set相关的知识.关注公众号「Java面典」了解更多 Java 知识点. Set 是一个无重复对象的集合类.值的重复与否是根据对象的 hash ...
- Java集合04——fail-fast&fail-safe 详解
在前几个回合中,我们已经详细了解过了 Java 集合中的List.Set 和 Map,对这部分内容感兴趣的朋友可以关注我的公众号「Java面典」了解.今天我们将为各位介绍集合的失败机制--fail-f ...
- Java集合03——你不得不了解的Map
Map 在面试中永远是一个绕不开的点,本文将详细讲解Map的相关内容.关注公众号「Java面典」了解更多 Java 知识点. Map Map 是一个键值对(key-value)映射接口: 映射中不能包 ...
- Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList
概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析, ...
- Java 集合系列 02 Collection架构
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- 20180826(02)-Java集合框架
Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用 ...
- Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内容包括::1 fail-fast简介2 fail-fast示例 ...
- Java 集合系列目录(Category)
下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录. 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系 ...
- Java集合源码分析(三)LinkedList
LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...
随机推荐
- vue上传图片的3种方式
https://blog.csdn.net/q3254421/article/details/88250968?utm_medium=distribute.pc_relevant.none-task- ...
- vs 快速定位文件
在进行web开发时,我们经常需要在文件之间进行切换,每次在VS的解决方案中找文件然后打开 非常浪费时间,有没有比较快捷点的方法呢? 1.使用 ReSharper 插件 ReSharper 插件可以在 ...
- 基于.NetCore开发博客项目 StarBlog - (9) 图片批量导入
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 【原创】快速理解Unicode和utf-8的本质
字符串编码 基本概念 在代码中处理,为了字节统一,都统一使用Unicode 核心:在pyhton中s.encode("utf-8")中的变量实例s必须是已经是Unicode格式,否 ...
- PyTorch DataSet Normalization torchvision.transforms.Normalize()
特征缩放, 在这种情况下,我们不仅仅考虑是一个值的数据集,我们考虑的是具有多个特征和相关的值的样本或元素的数据集. 假如正在处理一个人的数据集, 归一化数据集有许多不同的 ...
- JMeter - 生成随机数/随机字符串/随机变量/随机日期
1. Random - 随机数 1.1 作用 1.2 声明 1.3 例子 2. __RandomDate - 随机日期 2.1 作用 2.2 声明参数 2.3 例子 3. RandomString - ...
- BI与SaaS碰撞,让数据处理更加轻松(下)
背景 在上篇内容中,我们从SaaS各种功能的角度为大家介绍了在数据处理中SaaS的巨大价值,而本次我们将用实例将为大家展示SaaS与BI间的碰撞又会产生怎样的火花. BI与SaaS集成示例 通常BI分 ...
- 下载安装myslq-----win
在百度上搜索MySQL官网,进入下载页面-->选择社区版(Community)-->选择MySQL Community Server后,点击DOWNLOAD按钮-->Generall ...
- sql-DCL用户及权限管理及其他常用命令-oracle
DCL 用户管理 创建用户 create user 用户名 identified by 密码; 在oracle中要创建一个新的用户使用create user语句,一般是具有dba(数据库管理员)的权限 ...
- python——进行年龄和性别检测
年龄和性别检测 使用Python编程语言带你完成使用机器学习进行年龄和性别检测的任务. 首先需要编写用于检测人脸的代码,因为如果没有人脸检测,我们将无法进一步完成年龄和性别预测的任务. 下一步是预测图 ...