单列集合Collection、list、set

2023-11-06

目录

一、collection

二、list集合

1、ArrayList集合底层原理

2、LinkedList集合

三、set系列集合

1、Set集合的实现类

2、HashSet底层原理

3、LinkedHashSet底层原理

4、TreeSet的特点

5、如何使用好集合


一、collection

collection是单列集合的顶层接口,他的功能是全部单列集合都可以继承使用的。

collection常用方法

方法名 说明
public boolean add(E e) 把给定的对象添加到当前集合中
public void clear() 清空集合中所有的元素
public boolean remove(E e) 把给定的对象在当前集合中删除
public boolean contains(object obj) 判断当前集合中是否包含给定的对象
public boolean isEmpty() 判断当前集合是否为空
public int size() 返回集合中元素的个数/集合的长度

 

二、list集合

特点:

1、有序:存和取的元素顺序一致有索引

2、可以通过索引操作元素可重复

3、存储的元素可以重复

List集合的特有方法

collection的方法List都继承了

List集合因为有索引,所以多了很多索引操作的方法。

方法名 说明
void add(int index,E element) 在此集合中的指定位置插入指定的元素
E remove(int index) 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素

1、ArrayList集合底层原理

1、利用空参创建的集合,在底层创建一个默认长度为10的数组

2、添加第一个元素时,底层会创建一个新的长度为10的数组,存满时会扩容1.5倍

3、如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准

2、LinkedList集合

底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。

特有方法 说明
public void addFirst(E e) 在该列表开头插入指定的元素
public void addLast(E e) 将指定的元素追加到此列表的末尾
public E getFirst() 返回此列表中的第一个元素
public E getLast() 返回此列表中的最后一个元素
public E removeFirst() 从此列表中删除并返回第一个元素
public E removeLast() 从此列表中删除并返回最后一个元素

三、set系列集合

特点:

1、无序:存取顺序不一致

2、不重复:可以去除重复

3、无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素

1、Set集合的实现类

HashSet :无序、不重复、无索引

LinkedHashSet:有序、不重复、无索引

TreeSet:可排序、不重复、无索引

Set接口中的方法上基本上与collection的API一致。

2、HashSet底层原理

HashSet集合底层采取哈希表存储数据

哈希表是一种对于增删改查数据性能都较好的结构

JDK8以后,当链表长度超过8,而且数组长度大于等于64时,自动转换为红黑树

如果集合中存储的是自定义对象,必须要重写hashCode和equals方法

JDK8以前:新元素存入数组,老元素挂在新元素下面

JDK8以后:新元素直接挂在老元素下面

哈希表组成

JDK8之前:数组+链表

JDK8开始:数组+链表+红黑树

哈希值

根据hashCode方法算出来的int类型的整数

该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算

一般情况下,会重写hashcode方法,利用对象内部的属性值计算哈希值

对象的哈希值特点

如果没有重写hashCode方法,不同对象计算出的哈希值是不同的

如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的

在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)

3、LinkedHashSet底层原理

有序、不重复、无索引。

这里的有序指的是保证存储和取出的元素顺序一致

原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺

序。

1. LinkedHashSet集合的特点和原理是怎么样的?

有序、不重复、无索引

底层基于哈希表,使用双链表记录添加顺序

2.在以后如果要数据去重,我们使用哪个?

默认使用HashSet

如果要求去重且存取有序,才使用LinkedHashSet

4、TreeSet的特点

不重复、无索引、可排序

可排序:按照元素的默认规则(有小到大)排序。

TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。

TreeSet集合默认的规则

对于数值类型:Integer , Double,默认按照从小到大的顺序进行排序。

对于字符、字符串类型:按照字符在ASCII码表中的数字升序进行排序。

TreeSet的两种比较方式

方式一:默认排序/自然排序:Javabean类实现Comparable接口指定比较规则

方式二:比较器排序:创建TreeSet对象时候,传递比较器Comparator指定规则

使用原则:默认使用第一种,如果第一种不能满足当前需求,就使用第二种

方法返回值的特点

负数:表示当前要添加的元素是小的,存左边

正数:表示当前要添加的元素是大的,存右边

0:表示当前要添加的元素已经存在,舍弃

5、如何使用好集合

1.如果想要集合中的元素可重复

用ArrayList集合,基于数组的。(用的最多)

2.如果想要集合中的元素可重复,而且当前的增删操作明显多于查询

用LinkedList集合,基于链表的。

3.如果想对集合中的元素去重

用HashSet集合,基于哈希表的。(用的最多)

4.如果想对集合中的元素去重,而且保证存取顺序

用LinkedHashSet集合,基于哈希表和双链表,效率低于HashSet。

5.如果想对集合中的元素进行排序

用Treeset集合,基于红黑树。后续也可以用List集合实现排序。


注:总结来自于哔哩哔哩java视频、从入门到起飞尼古拉斯阿玮老师


 


 


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单列集合Collection、list、set 的相关文章

随机推荐

  • Java实现一个简单的图书管理系统(内有源码)

    简介 哈喽哈喽大家好啊 之前作者也是讲了Java不少的知识点了 为了巩固之前的知识点再为了让我们深入Java面向对象这一基本特性 就让我们完成一个图书管理系统的小项目吧 项目简介 通过管理员和普通用户的两种操作界面 利用其中的方法以及对象之
  • 光流法介绍

    光流场法的基本思想 在空间中 运动可以用运动场描述 而在一个图像平面上 物体的运动往往是通过图像序列中不同图像灰度分布的不同体现的 从而 空间中的运动场转移到图像上就表示为光流场 Optical Flow Field 光流场反映了图像上每一
  • 华为OD机试 - 字符串加密(Java)

    题目描述 给你一串未加密的字符串str 通过对字符串的每一个字母进行改变来实现加密 加密方式是在每一个字母str i 偏移特定数组元素a i 的量 数组a前三位已经赋值 a 0 1 a 1 2 a 2 4 当i gt 3时 数组元素a i
  • 关于问题【Run-Time Check Failure #2 - Stack around the variable 'data' was corrupted.】

    今天在用VS调代码的时候 会出现这个问题 经过查找以及DEBUG 最终发现是由于建立的数组下标溢出造成的 溢出的下标对应的数组的内容会出现乱码 分析 Run Time Check Failure 2 一般是栈被破坏 你的代码可能有缓冲区溢出
  • 靜下心来--重温正则表达式(二)

    在 靜下心来 重温正则表达式 一 这篇文章中 我们重点介绍了正则表达式的一些基础概念 以及在 String RegExp 的原型上涉及到正则表达式常用 4 个的方法 repalce match test exec 最后介绍了正则表达式的两种
  • 23个机器学习最佳入门项目(附源代码)

    导读 本文为你介绍23种机器学习项目创意 以获取有关该增长技术的真实经验 我们都知道 教科书上所学与实际操作还是有出入的 那关于机器学习有什么好的项目可以实操吗 我们为你推荐这篇文章 在本教程中 涵盖面向初学者 中级专家和专家的23种机器学
  • 个位移传感器数据的实时采集与处理(Matlab)

    个位移传感器数据的实时采集与处理 Matlab 概述 本文介绍如何使用Matlab对个位移传感器数据进行实时采集和处理 个位移传感器是一种常用的传感器 用于测量物体的微小位移 通过实时采集和处理传感器数据 我们可以获得有关物体运动和变形的有
  • Spring源码分析(十)依赖注入源码解析3:DefaultListableBeanFactory#doResolveDependency 真正开始解析依赖项

    4 2 真正开始解析依赖项 最核心方法 org springframework beans factory support DefaultListableBeanFactory doResolveDependency public Obje
  • filter()方法筛选出数组中满足条件的元素

    在开发中遇到对复杂数组中筛选出满足条件的数组元素 进行一下总结 语法 array filter function currentValue index arr thisValue 定义和用法 filter 方法创建一个新的数组 新数组中的元
  • 谷歌浏览器静态资源http请求被转为https请求

    加载图片这些静态资源的时候被转成https的 可能是浏览器的设置原因 谷歌浏览器左上角叹号 网站设置 不安全内改为允许
  • 综合架构备份服务

    备份服务器完成rsync守护进程模式搭建 rsync服务端配置步骤 第一个历程 下载安装软件 检查rsync软件是否安装 rpm qa grep rsync 这个是3 1 2 4版本的 可以重新下载一下 yum install rsync
  • TypeError: login() got an unexpected keyword argument 'userid'

    最近在做一个Django项目的时 采用了url伪静态的方式进行路由传参 由于学习资料中使用的Django的旧版本 而我使用的是Django2 然后找到Django2中路由参数传递的方式 urlpatterns path user
  • android刷机教程 华为,华为手机刷机教程(华为手机强制刷机步骤图文教程)

    刷机有风险 操作需谨慎 华为手机刷机升级前的准备工作 1 进行刷机升级之前 请备份您的用户数据 升级时确保电量超过50 2 因为是直接使用的官方recovery刷官方固件 所以不需要把手机解锁 3 此升级会清除用户数据请做好备份 以防数据丢
  • QT基础2--常用控件

    代码1 mainwindow h ifndef MAINWINDOW H define MAINWINDOW H include
  • yolov5训练结果解析

    yolov5训练结果的文件解析 1 weights训练好的模型 一般使用best pt去进行推理 2 confusion matrix png 混淆矩阵以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总 其中矩
  • centos中awk传递变量的几种方式

    第一种方式 echo awk END print var1 var2 var1 1 var2 2 缺点 命令行参数的限制是他们在BEGIN过程中是不可用的 直到首行输入完成以后它们才可用 BEGIN是在首行输入前执行 如下 echo awk
  • debug调到循环最后_调试陷入死循环程序的方法

    概述 应用程序陷入死循环后 界面可能不会有任何输出 所有的业务也不通 不易定位 陷入死循环的程序占用的cpu使用率较高 通常可以通过使用top命令看出来 对于多线程的程序 需要耐心调试 本文给出笔者近期使用的方法 调试步骤 测试程序 编写一
  • 下载图片的方法

    下载图片的私有方法 private static void downloadPicture String urlList String path URL url null try url new URL urlList DataInputS
  • 科技感ui界面 html,技术实现丨如何增强UI页面的科技感

    在界面中要想体现出更强的科技感 或者说让人眼前一亮 那么首先要知道 大众理解的科技感的东西或者说大众觉得很棒的科技感大概是什么 人的审美一直在跟随着主流的媒体而变化 从1985年的电影 回到未来 到现在的 漫威全家桶 科技的发展跨越了几十个
  • 单列集合Collection、list、set

    目录 一 collection 二 list集合 1 ArrayList集合底层原理 2 LinkedList集合 三 set系列集合 1 Set集合的实现类 2 HashSet底层原理 3 LinkedHashSet底层原理 4 Tree