java集合,ArrayList、LinkedList和Vector,多线程场景下如何使用 ArrayList

文章目录

  • Java集合
    • 1.2 流程图关系
    • 1.3 底层实现
    • 1.4 集合与数组的区别
      • 1.4.1 元素类型
      • 1.4.2 元素个数
    • 1.5 集合的好处
    • 1.6 List集合我们以ArrayList集合为例
    • 1.7 迭代器的常用方法
    • 1.8 ArrayList、LinkedList和Vector的区别
      • 1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性
      • 1.8.2 多线程场景下如何使用 ArrayList?
      • 1.8.3 为什么 ArrayList 的 elementData 加上 transient 修饰?
    • 1.9 Set集合的特点:
      • 1.9.1 说一下 HashSet 的实现原理?
      • 1.9.2 HashSet如何检查重复?HashSet是如何保证数据不可重复的?
    • 1.10 TreeSet对元素进行排序的方式:
    • 1.11 List,Set,Map集合的特点 & 区别
    • 1.12 HashMap和Hashtable的区别
    • 1.3 HashSet 与 HashMap的区别

Java集合

1.2 流程图关系

在这里插入图片描述

1.3 底层实现

ArrayList:底层是数组 ,默认长度为0,调用add以后看情况,不指定长度默认长度为10

ArrayList的扩容机制_arraylist扩容-CSDN博客

LinkedList:底层是链表

Vector:底层是数组

HashSet:底层是哈希表

TreeSet:红黑树

HashMap:数组+链表

Hashtable:数组+链表

LinkedHashMap:数组+链表+红黑树

1.4 集合与数组的区别

1.4.1 元素类型

集合:引用类型(存储基本类型是自动装箱)

数组:基本类型、引用类型

1.4.2 元素个数

集合:不固定、可任意扩展

数组:固定,不能改变容量

1.5 集合的好处

不受容器大小限制,可以随时添加、删除元素,提供了大量操作元素的方法(判断、获取等)

List集合

List集合的特点:

可重复性(可以添加相同的元素)、有序(存取顺序相同)

List的主要方法有:

add、get、remove、set、iterator、contains、addAll、removeAll、indexOf、toArray、clear、isEmpty

1.6 List集合我们以ArrayList集合为例

ArrayList集合

java.util.ArrayList是大小可变的数组的实现,存储在内的数据称为元素。此类提供一些方法来操作内部存储的元素。ArrayList中可以不断添加元素,其大小也自动增长。

java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList集合是最常用的集合。

泛型:即泛指任意类型,幼教参数化类型,对具体类型的使用起到辅助作用,类似于方法的参数

1.7 迭代器的常用方法

next():返回迭代的下一个元素

hasNext():如果仍有元素可以迭代,则返回true

注意:列表迭代器是List体系独有的遍历方式,可以在对集合遍历的同时进行添加、删除等操作

但是必须通过调用列表迭代器的方法来实现

1.8 ArrayList、LinkedList和Vector的区别

  1. 线程同步,Vector线程安全,ArrayList线程不安全,因为Vector的实现有synchronized锁

  2. 效率问题,Vector效率低,ArrayList效率高

  3. 增长数量,Vector以2倍增长,ArrayList以1.5倍增长

1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性

(1) ArrayList和Vector使用数组存储元素;LinkedList使用链表存储元素

(2) ArrayList和Vector插入删除数据时,需要搬运数据,效率较差;LinkedList使用链表,不需要搬运数据,效率高。

(3) ArrayList和Vectory查询时,按数组下标查询,不需要遍历,效率高;LinkedList需要遍历,查询效率底。

1.8.2 多线程场景下如何使用 ArrayList?

ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 CollectionssynchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样:

List<String> synchronizedList = Collections.synchronizedList(list);
synchronizedList.add("aaa");
synchronizedList.add("bbb");
for (int i = 0; i < synchronizedList.size(); i++) {System.out.println(synchronizedList.get(i));
}

1.8.3 为什么 ArrayList 的 elementData 加上 transient 修饰?

ArrayList 中的数组定义如下:

private transient Object[] elementData;
public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable

可以看到 ArrayList 实现了 Serializable 接口,这意味着 ArrayList 支持序列化。transient 的作用是说不希望 elementData 数组被序列化,重写了 writeObject 实现:

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{*// Write out element count, and any hidden stuff*int expectedModCount = modCount;s.defaultWriteObject();*// Write out array length*s.writeInt(elementData.length);*// Write out all elements in the proper order.*for (int i=0; i<size; i++)s.writeObject(elementData[i]);if (modCount != expectedModCount) {throw new ConcurrentModificationException();
}

每次序列化时,先调用 defaultWriteObject() 方法序列化 ArrayList 中的非 transient 元素,然后遍历 elementData,只序列化已存入的元素,这样既加快了序列化的速度,又减小了序列化之后的文件大小。

1.9 Set集合的特点:

不可重复(元素具有唯一性)、无序(元素的存取顺序是不固定的)

Set的主要方法有:

add、remove、iterator、contains、addAll、removeAll、toArray、clear、isEmpty

HashSet:内部的数据结构是哈希表,是线程不安全的。

HashSet中保证集合中元素是唯一的方法:通过对象的hashCode和equals方法来完成对象唯一性的判断。

如果对象的hashCode值不同,则不用判断equals方法,就直接存到HashSet中。

如果对象的hashCode值相同,需要用equals方法进行比较,如果结果为true,则视为相同元素,不存,如果结果为false,视为不同元素,进行存储。

注意:如果元素要存储到HashCode中,必须覆盖hashCode方法和equals方法。

TreeSet:可以对Set集合中的元素进行排序,是线程不安全的。

**TreeSet:**中判断元素唯一性的方法是:根据比较方法的返回结果是否为0,如果是0,则是相同元素,不存,如果不是0,则是不同元素,存储。

1.9.1 说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMapkey上,HashMapvalue统一为PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

1.9.2 HashSet如何检查重复?HashSet是如何保证数据不可重复的?

HashSetadd ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles 方法比较。
HashSet 中的add ()方法会使用HashMap 的put()方法。

HashMapkey 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。所以不会重复( HashMap 比较key是否相等是先比较hashcode 再比较equals )。

以下是HashSet 部分源码:

private static final Object PRESENT = new Object();
private transient HashMap<E,Object> map;
public HashSet() {map = new HashMap<>();
}
public boolean add(E e) {// 调用HashMap的put方法,PRESENT是一个至始至终都相同的虚值return map.put(e, PRESENT)==null;
}

1.10 TreeSet对元素进行排序的方式:

元素自身具备比较功能,即自然排序,需要实现Comparable接口,并覆盖其compareTo方法。

元素自身不具备比较功能,则需要实现Comparator接口,并覆盖其compare方法。

注意:LinkedHashSet是一种有序的Set集合,即其元素的存入和输出的顺序是相同的。

1.11 List,Set,Map集合的特点 & 区别

List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各有什么特点?

Java 容器分为 CollectionMap 两大类,Collection集合的子接口有Set、List、Queue三种子接口。我们比较常用的是Set、List,Map接口不是collection的子接口。

Collection集合主要有ListSet两大接口

List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector
Set:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet
Map是一个键值对集合,存储键、值和之间的映射。 Key无序,唯一;value 不要求有序,允许重复。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键KEY对象,就会返回对应的值对象。

Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap

关系图如下:

在这里插入图片描述

1.12 HashMap和Hashtable的区别

  1. 线程同步,Hashtable线程安全,HashMap线程不安全

  2. 效率问题,Hashtable效率低,HashMap效率高

  3. HashMap可以使用null作为keyHashtable不可以使用null为key

  4. HashMap使用的是新实现,继承AbstractMap,而Hashtable是继承Dictionary类,实现比较老

  5. Hash算法不同,HashMaphash算法比Hashtablehash算法效率高

  6. HashMapHashtablecontains方法去掉了,改成containsValuecontainsKey。因为contains方法容易让人引起误解。

  7. 取值不同,HashMap用的是Iterator接口,而Hashtable中还有使用Enumeration接口

1.3 HashSet 与 HashMap的区别

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/217871.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1、Mysql架构与历史

Mysql逻辑架构 最上层是服务并不是Mysql所独有的&#xff0c;大多数基于网络的客户端/服务器的工具或者服务都有类似的架构&#xff0c;比如连接处理&#xff0c;授权认证&#xff0c;安全等。 第二层是Mysql比较有意思的部分。大多数Mysql的核心服务都在这一层&#xff0c;…

2024北京理工大学计算机考研分析

24计算机考研|上岸指南 北京理工大学 计算机学院始建于1958年&#xff0c;是全国最早设立计算机专业的高校之一。2018年4月&#xff0c;计算机学院、软件学院、网络科学与技术研究院合并成立新的计算机学院。学院累计为国家培养各类人才15000余名。计算机科学学科ESI排名进入全…

AD9528学习笔记

前言 AD9528是ADI的一款时钟芯片&#xff0c;由2-stage PLL组成&#xff0c;并且集成JESD204B/JESD204C SYSREF信号发生器&#xff0c;SYSREF发生器输出单次、N次或连续信号&#xff0c;并与PLL1和PLL2输出同步&#xff0c;从而可以实现多器件之间的同步。 AD9528总共有14路输…

QT visual stdio加载动态库报错126问题

报错126是找不到指定的模块 QT 查看构建目录&#xff0c;将依赖的动态库放到该目录下即可成功 visual stdio将依赖的动态库放到运行目录 在vs中使用导出类的动态库时&#xff0c;不但需要将对应的.dll放到对应的目录下&#xff0c;还需要将该动态库对应的.lib添加到如下配置才…

强化学习,快速入门与基于python实现一个简单例子(可直接运行)

文章目录 一、什么是“强化学习”二、强化学习包括的组成部分二、Q-Learning算法三、迷宫-强化学习-Q-Learning算法的实现全部代码&#xff08;复制可用&#xff09;可用状态空间检查是否超出边界epsilon 的含义更新方程 总结 一、什么是“强化学习” 本文要记录的大概内容&am…

Windows窗体学这一篇就够了(C#控件讲解)

目录 一、Form窗体 1.1窗体的创建和删除 1、添加窗体 2、删除窗体 3、多窗体的使用 1.2、窗体属性 1.2.1更换窗体图标 1.2.2隐藏窗体的标题栏(FormBorderStyle属性) 1.2.3控制窗体的显示位置(StartPosition属性) 1.2.4窗体背景图片的设置 1.2.5窗体的显示与隐藏 1.…

“不得了·放飞杯” 2023年四川省健身健美锦标赛启动在成都隆重召开

“不得了放飞杯” 2023年四川省健身健美锦标赛启动在成都隆重召开 为了更好地推动四川省健身健美运动的普及和发展&#xff0c;结合《四川全民健身实施计划》的现状&#xff0c;适应新时代健身私教服务产业的发展需求&#xff0c;由中国健美协会指导&#xff0c;四川省健美健美…

ethernet II 的故事

以太帧有很多种类型。不同类型的帧具有不同的格式和MTU值。但在同种物理媒体上都可同时存在。 以太网第二版或者称之为Ethernet II 帧&#xff0c;DIX帧&#xff0c;是最常见的帧类型。并通常直接被IP协议使用。 格式 当数据帧到达网卡时&#xff0c;网卡要先去掉前导码&#…

Linux基本指令(前篇)

目录 1.ls指令 2.pwd指令 3.cd 指令 4.touch指令 5.mkdir指令&#xff08;重要&#xff09; 6.rmdir指令 && rm 指令&#xff08;重要&#xff09; 7.man指令&#xff08;重要&#xff09; 1.ls指令 ls 选项 目录或文件 对于目录&#xff0c;该命令列出该目录下的所…

Linux加强篇002-部署Linux系统

目录 前言 1. shell语言 2. 执行命令的必备知识 3. 常用系统工作命令 4. 系统状态检测命令 5. 查找定位文件命令 6. 文本文件编辑命令 7. 文件目录管理命令 前言 悟已往之不谏&#xff0c;知来者之可追。实迷途其未远&#xff0c;觉今是而昨非。舟遥遥以轻飏&#xff…

续新的SSL证书

一、重新申请证书并下载证书&#xff1a; https://www.ename.net/ 二、IIS中在【服务器证书】中删除旧的证书&#xff0c;导入新的证书&#xff1b; 三、在站点的绑定选择新证书&#xff1b;

WGCLOUD 中文繁体版本 下载

wgcloud 繁体版下载 下載繁體版安裝包 - WGCLOUD