集合

单列集合 以及双列集合 二十六.集合框架 概念:集合是一个容器,数组也是一个容器,但是呢数组的大小是固定的、类型是唯一的因此在某些需求上有限制 集合特点: 1、容器大小可变 2、可以存储多种数据类型的值【只能是引用数据类型,对基本数据类型而言存储的是其包装类】 3.根据集合的存储方式不同,将集合划分两大类:一类是单列集合,另一类是双列集合 关键词:Collection(单列集合)、Map(双列集合) 一.Collection 单列集合 List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问 阅读详情

 

集合:属于容器类,存放的都是引用类型。集合的产生是由于数组的长度是定长的,一旦创建长度就会固定,但是集合的长度是不固定的,可以动态的插入删除。

数组相当于string,集合相当于StringBuilder/StringBuffer。

集合之间的继承关系

 

 

 


List子接口下面有三个类分别是ArrayList、LinkedList、Vector

 

List是collection的子接口,ArrayList是类,继承了List的接口。

Collection collection = new ArrayList();  //向上转型

Object obj = list.get(0);   //向上转型

常用功能:

    .add()   添加

    .size()  统计集合中的对象数

    .remove() 移除

    .isEmpty()  判断是否为空

    .contains()  判断是否包含某一个对象。

    .clear()   清空集合中的所有对象内容

 

List list = new ArrayList();      //List中有index 而Collection没有

通过索引值操作的一些功能:

       .add()   通过索引值添加

       .set()    通过索引值设置

       .get()    通过索引值获得对象内容

       .size()  统计集合中的对象数

       .indexOf()  返回对象的索引值

       .remove()  通过索引值或者对象进行删除

       .isEmpty()  判断是否为空

       .contains()  判断是否包含某一个对象

       .clear()   清空集合中的所有对象内容

有了索引值即可进行遍历,Collection里面有的方法List继承过来,List都有。

从jdk1.7之后的写法

List<String> string = new ArrayList<>();    //标准写法

总结:List 添加的对象   可以重复,并且有序

(面试)ArrayList和LinkedList的区别:

  1. 都实现list接口
  2. ArrayList是针对数组的封装,实现了数组的动态扩容。 LinkedList是针对链表的封装
  3. LinkedList插入和增加的操作效率比ArrayList高,但是查询的操作ArrayList较高。从使用上来讲,如果以 查询为主,选择ArrayList,如果频繁的插入,优先选 择LinkedList。

(面试)ArrayList和vector的区别:

  1. 都继承于同一个类Abstractlist
  2. ArrayList JDK1.2 非线程安全(单线程推荐使用)性能更 高。支持输出
  3. Vector JDK1.0 线程安全,性能相对较低。支持输出: foreach,listIterator,Enumeration.内部

 

问题: 其他集合中存放phone对象是否需要实现compara接口?

在linkedlist和Arraylist集合中,不需要实现compara接口,并且按添加对象的先后排序。


Set:不可重复

Set接口存放的数据是无序的(相对于添加顺序),不可以重复的。和数学中的“集合”概念相对应。

Set接口常用实现类:

      1. HashSet   不可重复,无序

      2.TreeSet  不可重复,有序,但是不一定按照ASCII值排序

      3. LinkedHashSet

HashSet存取原理:

存入元素:

  • 先比较对象的哈希码值 (调用hashCode())
  • 如果没有该哈希值存在,直接存入
  • 如果已经存在,则要加入的新对象跟已经存在于列表中的所有对象依次比较(调用equals()),不相等则加入,否则舍弃。

取出对象:

  • 根据对象的哈希码值计算出它的存储索引,在散列表的相应位置上进行少量的比较即可找出该对象。
  • 基于哈希散列,Set存、取、删都有较高的效率

 

HashSet操作:

HashSet不记录添加数据的顺序,且加入的元素不能重复,否则覆盖。

注意:加入HashSet集合的自定义类型的对象通常需要重写hashCode()和equals()方法。

 

TreeSet

TreeSet同样不记录添加数据的顺序,但是可以对存入的元素进行排序(基于红黑树实现),输出也会按照排序后的顺序。

因此,存入TreeSet的元素,必须是“可排序的”。

                                                

 

LinkedHashSet

LinedHashSet根据元素的哈希码进行存放,同时用链表记录元素的插入顺序。

                

 

HashSet 和TreeSet 的区别:

  1. TreeSet里面无法放置空对象,而HashSet可以放置空对象 null。
  2. TreeSet和HashSet都可以放置空内容“”,并且都放在第一 位。

Set小结

  •       Set的上述3个实现类,插入元素都不可以重复
  •       HashSet采取哈希值存储,不记录元素插入的位置,也不排序
  •       TreeSet采取红黑树存储,不记录元素插入的位置,但是可以排序
  •       LinkedHashSet采取哈希值存储,并使用链表记录元素插入的位置,不排序

 


Map

  • Map接口用来存储“键-值”映射对。JDK API中Map接口的常用实现类:
  1.                      HashMap
  2.                      TreeMap
  3.                      Hashtable(不常用)
  • Map中存储的“键-值”映射对是通过键来唯一标识,Map的“键”底层采用Set来存放。
  • 因此,存入Map中的“键”如果是自定义类,应该重写hashCode()和equals()方法,确保键的唯一
  • 常用String作为Map的"键"。

 

HashMap

HashMap内部对“键”使用Set进行散列存放。因此,根据“键”取“值”的效率较高,也是Map接口使用频率较高的一个实现类。

HashMap遍历

遍历key
    map.keySet()
           iterator
           增强for
    map.entrySet()
          iterator
          增强for
   遍历key+value:获取key之后,通过get(key)
   遍历value:除上述之外,还可以直接使用values()

 

Map.Entry接口

Map.Entry是Map内部定义的一个static接口,专门用来保存key-value对的内容。

  • 可以通过entrySet()方法取到Entry对象,然后使用getKey(),getValue()获取键、值
  • 一般情况下,map多用于存放、查找数据,遍历输出的情况较少。

TreeMap

TreeMap内部使用红黑树结构对“key”进行排序存放,所以放入TreeMap中的“key-value”对的“key”必须是“可排序”的。

 

HashMap、TreeMap、HashTable的使用结论

HashMap中的结论:(起源JDK1.2)

  1. Key相同,value会被覆盖
  2. Key和value都可以为null
  3. HashMap也是无序的

TreeMap结论:(起源JDK1.2)

  1. 有序的(不一定按照ASCII排序),跟TreeSet相像
  2. 有序的都不能放入空对象,TreeMap中Key不能为null。
  3. 有序,指的是key是“可排序的”一般情况下,key都是string,所以key的排序是通过ascii排序

HashTable结论:(起源JDK1.0)

  1. HashTable的key和value都不能为空。

在单线程中用hashmap多一点

 

(面试)Hashtable和HashMap的区别?

  1. Hashtable(注意大小写)在JDK1.0就有了,HashMap是JDK1.2引入的,操作基本和Hashtable相同,建议使用HashMap
  2. Hashtable是同步的(线程安全的),不能有null键,也不能有null值,否则运行时报空指针异常
  3. HashMap是不同步的(线程非安全的),能存储最多一个null键,任意多个null值

Map小结

  • Map的上述3个实现类,插入键值对的“键”都不可以重复,否则覆盖(为什么?)
  • HashMap的键采取哈希值存储,不记录元素插入的位置,也不排序
  • TreeMap的键采取红黑树存储,不记录元素插入的位置,但是可以排序
  • LinkedHashMap的键采取哈希值存储,并使用链表记录元素插入的位置,不排序

选择使用集合

存放要求

  • 无序,无下标,不可重复,不能随机访问-Set
  • 有序,有下标,可重复,可以随机访问-List
  • “key-value”对,较多存放,较少遍历-Map

读和改(插入删除)的效率

  • Hash*-两者都较高
  • ArrayList-读(指定下标随机访问)快,插入/删除元素慢
  • LinkedList-读(指定下标随机访问)慢,插入/删除元素快

 

 

 

 

 

MyBatis 集合、集合嵌套查询 集合 &lt;collection property="posts" ofType="domain.blog.Post"&gt; &lt;id property="id" column="post_id"/&gt; &lt;result property="subject" column="post_subject"/&gt; 阅读详情

相关推荐

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

从零到一:Admin.NET中Swagger与Knife4jUI的深度集成实践

本文详细介绍了在Admin.NET框架中深度集成Swagger与Knife4jUI的实践方法,从基础配置到高级定制,包括认证配置、安全增强、界面主题定制等。通过Furion框架简化配置,开发者可以快速构建专业且友好的API文档界面,提升团队协作效率。

defi6farmer的博客 408

集合详解(详解)

Collection主要有两个子接口 List 和 Set 也就是所谓的单列集合 Map接口的实现子类是双列集合,也就是存放的键值对(K - V) 双列集合

qq_66798107的博客 1524

HomeAssistant+HACS实战:5分钟搞定米家设备接入(附HomeKit配置技巧)

本文详细介绍了如何通过HomeAssistant和HACS插件商店快速接入米家设备,并分享HomeKit配置技巧。从HACS安装到米家设备接入,再到HomeKit设备集成,提供一站式智能家居解决方案,帮助用户实现设备统一管理和自动化场景设置。

weixin_29192141的博客 1050

Oracle数据库表空间使用情况查询

在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对象的逻辑存储单元。了解表空间的使用情况对于数据库管理员和开发人员来说是非常重要的,因为它可以帮助他们监控数据库的空间使用情况并进行容量规划。本文将介绍如何查询Oracle数据库中的表空间使用情况。通过执行以上SQL查询语句,你可以获得Oracle数据库中表空间的使用情况、文件大小和表空间大小等信息。这些信息可以帮助你了解数据库的存储情况,并进行适当的优化和容量规划。查看表空间的数据文件和表空间大小。查看表空间的使用情况。

CsmbPascal的博客 859

集合(详细解析)

JAVA集合

Tweek_的博客 1894

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)

ArcGIS JS 态势标绘教程:直箭头(Straight Arrow)。

非科班Java出身GISer的博客 708

集合总结篇

小白学习Java集合篇

zlm1229494362的博客 256

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(1)- UCI架构和通用数据包头

如果大家学习过WiFi的SPEC,比如从我的资源里面下载 IEEE 802.11-2007,应该很容易发现,FiRa的spec定义实在是太差了。有现成的好例子不学,非得自己来一套,搞一堆新的名词,其实都是一个意思。比如GID,OID等,而且GID、OID是最先出现的,但是对应表格 还得去附件的最后一项去找。 FiRa是UWB联盟,希望跟WIFi联盟学习一下,把UWB做大做强,而不是自成一派,自命不凡。

Ankie资深技术项目经理 2434

集合详解(小白必看)

集合总结详解,小白必看!

m0_57816620的博客 3068

在 SAP ABAP 里可靠地对接 FTP 服务器:从连接、命令到传输与排错的完整实战

本文详细介绍了在SAP ABAP中实现FTP文件交换的完整技术方案。文章首先解析了FTP协议的双连接特性(控制连接与数据连接),强调保持控制连接的重要性。随后详细说明了ABAP中FTP操作的四步标准流程:建立连接(包含HTTP_SCRAMBLE加密)、执行命令、断开连接和关闭RFC通道。文章提供了实战案例代码,演示如何将FTP文件复制到应用服务器再读取进内表处理,特别指出后台作业与前台操作的关键差异。最后总结了常见错误排查要点,包括连接模型、路径设置和资源释放等问题。全文通过SAP标准函数模块的调用顺序、典

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 308

Java集合 之 单列集合

java的单列集合,看这一篇就够了

qq_73698057的博客 3100

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

集合 —— 集合与集合运算

【概述】 集合,是集合论中主要研究对象,是指具有某种特定性质的具体的或抽象的对象汇总而成的集体,其中,构成集合的这些对象则称为该集合的元素。 集合中元素的数目称为集合的基数,集合 A 的基数记作:card(A),当其为有限大时,集合 A 称为有限集,反之则为无限集,简单来说,含有有限个元素的集合叫做有限集,含无限个元素的集合叫做无限集。 一个集合具有三个特性:确定性、互异性、无序性。其中,确...

Alex_McAvoy的博客 7583

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【集合论】集合概念与关系 ( 集合表示 | 数集合 | 集合关系 | 包含 | 相等 | 集合关系性质 )

一、 集合论体系 、 二、 集合表示 、 三、 数集合 、 三、 集合关系 、 1、 包含关系 、 2、 相等关系 、 3、 集合间包含关系性质

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

集合框架——Map集合

Map集合概述interface Map<K,V> K:键的类型;V:值的类型Map集合的特点双列集合,一个键对应一个值键不可以重复,值可以重复Map集合的基本使用//创建集合对象​//V put(K key, V value) 将指定的值与该映射中的指定键相关联map.put("wedu001","林青霞");map.put("wedu002","张曼玉");map.put("wedu003","王祖贤");map.put("wedu003","柳岩");​。

weixin_64681117的博客 2470

集合论_集合代数

文章目录集合代数解决问题创建过程组成部分基本概念集合定义集合表示集合基数集合关系空集全集相等关系包含关系子集和真子集证明集合相等n 元集的子集幂集定理集合运算集合运算定律可数集合与不可数集合等式可数集合不可数集合 集合代数 解决问题 ​ 在现代数学中,集合论是数学的基础,数学是其它学科的基础,集合论成为了基础的基础,可见其重要性 ​ 在离散数学中,我们需要用集合表达各类离散量和离散量之间的关系 创...

nmgyangguangyuan的博客 5099

各种集合的集合

文章目录数组千千万,集合是真理数组与集合的扩容集合的分类 数组千千万,集合是真理   我们在代码中常见的数据保存形式一般就是两种—>数组与集合;数组和集合的最大的区别在于查询和扩展,一般情况下,在数据确定的情况下,我们采用数组的形式会更便于我们查询,而在数据长度不确定的情况下,我相对更推荐集合。 数组与集合的扩容   数组的扩容 我们都知道的是数组在一旦确定下来的时候我们是无法对数组的长度进行改变的,所以对数组进行扩容就只能通过创建一个新的更长的数组来将原来的数组长度给复制过去才可以。这一段我在数组

qq_43325476的博客 1079

Java里的集合:单列集合+双列集合

集合的一些知识点总结,适合复习

weixin_60470460的博客 1915

单列集合 双列集合

扩容: 当数组中元素的个数>threshold 进行扩容 扩容为原来的2倍, loadFactor 加载因子 0.75 ,threshold = 数组的长度*loadFactor=16*0.75 =12 第一次长度为16的数组所指定的值threshold 也扩容为原来的2倍。jdk8:在创建集合的时候 创建长度为0的数组 赋值给elementData,在第一次添加元素的时,将新产生的长度为10的数组赋值给elementData,当添加的元素超过数组的长度时,进行扩容为原来的1.5倍。

2402_83268176的博客 1859

【数学分析】集合 ① ( 集合概念 | 集合表示 | 常用的数集合 | 集合的表示 )

一、集合概念、 二、集合表示、 三、常用的数集合、 四、集合的表示

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1万+

集合论知识总结——集合及其运算

集合论知识总结

m0_62249876的博客 9536

Java集合类--List集合,Set集合,Map集合

集合类类似于数组,与数组不同的是,数组的长度是固定的,集合的长度是可变的;数组用来存放基本类型数据,集合用来存放对象的引用。

qq_40132294的博客 3347

python集合输出_Python之集合

集合:无序的,不可随机访问的,不可重复的元素集合# 可以使用大括号 { } 或者 set() 函数创建集合,# 注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。# 集合可分为可变集合和不可变集合# 可变集合:有增、删、改的操作 set# 不可变集合:创建好以后,无法进行增、删、改的操作 frozenset# 可变集合定义1 s = {1, 2, 3}2...

weixin_39996762的博客 4989

Java集合进阶——单列集合

数组+链表+红黑树⑴引用构造方法时,方法底层会创建一个默认长度为16,加载因子为0.75的数组⑵添加元素时,方法会根据元素的哈希值跟数组的长度计算出应存入的位置⑶判断当前位置是否有元素如果没有元素则直接存入;如果有元素则会通过equals方法比较元素属性值是否一样,一样的话表示元素重复,不存;不一样的话存入数组,形成链表细节:当链表长度超过8且数组长度大于等于64时,链表会自动转换为红黑树,从而提高查找效率LinkedHashSet是HashSet的子类,其完全继承了父类中的方法。

m0_74808313的博客 1317
上一篇: Java ConcurrentModificationException异常原因和解决方法
下一篇: java集合中三种遍历方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值