首页 > 编程语言 >Java基础-2-集合

Java基础-2-集合

时间:2023-09-13 18:11:38浏览次数:33  
标签:Map Set Java -- List 元素 基础 场景 集合

目录

简介

  • Java中有三大类集合:List(列表)、Set(集合)、Map(映射),三者都属于接口类,分别有各自的实现。
  • Collection为基本的集合接口,声明了集合的通用方法,List和Set都是继承于此。
    • add(Object o):新增对象
    • set(int index, Object o):设置对象值
    • remove(Object o):删除对象
    • contains(Object o):检查是否包含此对象
    • size():返回元素个数
    • iterator():返回一个迭代器,用来遍历集合元素
    • toArray():集合转换成数组,数组中是全部元素
  • 继承关系graph TB; Iterator(Iterator) --> Collection(Collection) Iterator --> ListIterator(ListIterator) Iterator --> Map(Map) Collection --> Set(Set) Collection --> List(List) ListIterator --> List Set --> HashSet[HashSet] Set --> TreeSet[TreeSet] HashSet --> LinkedHashSet[LinkedHashSet] List --> ArrayList[ArrayList] List --> LinkedList[LinkedList] Map --> HashMap[HashMap] Map --> TreeMap[TreeMap] HashMap --> LinkedHashMap[LinkedHashMap]

List

List的最大特点就是保证了元素的顺序,使用Iterator可以方便的遍历、增删列表中的元素。两个实现都是线程不安全的,但是效率高;Vector虽然线程安全,但是方法中加synchronized导致阻塞,效率低。

  1. ArrayList
    由数组实现的List,可以高效的对元素进行随机访问,但是往数组内部增删则效率会慢很多(因为涉及到数组中元素的移动),使用Iterator最好用来遍历,而非增删数据。
    • 优点:实现了基于动态数组的数据结构,地址连续,查询效率高。
    • 缺点:因为地址连续,要在列表中增删数据会导致其他数据移动,所以插入效率低。
    • 使用场景:多查询访问的用,或者在列表后方添加数据的场景。
  2. LinkedList
    使用链表实现的List,由于没有固定的内存列表,而是元素首尾互相记录地址来“链接”,所以元素内部的增删操作效率会高很多,相应的随机访问则会慢很多。由于双向链表的特性,LinkedList可以作为堆栈、队列和双向队列来使用。
    • 优点:基于链表的数据结构,地址随意,开辟新空间不需要连续地址,对于增删只需要修改内存地址即可。
    • 缺点:由于地址不连续,所以在查询的时候,需要移动指针,性能较低。
    • 使用场景:适用于头尾操作或者插入指定位置的场景。
    • 常用方法:addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()
  3. Vector
    也是由数组实现的动态列表,但是比较老,由于所有操作都使用线程同步,所以效率较低。与List不同的是在空间不够时,扩容方式不一样,且Vector可以设置增长因子。所以Vector适合在多线程场景或数据量较大的场景。

Set

具有和Collection一样的接口,只是行为不同,体现了继承与多态的典型应用。存入Set中的每个元素都是唯一的,加入的元素需要重写equals保证对象唯一。Set接口不保证维护元素次序。

  1. HashSet
    使用hash表记录的元素集合,内部也是列表,专门快速查询设计的。填充的元素需要重写hashCode方法来对比检查是否存在。允许key的值为null,但是也仅支持一个。
    • 使用场景:查找较多且不关心顺序的场景
  2. LinkedHashSet
    在HashSet的基础上添加了链表,用来维护元素插入顺序,使用迭代器遍历都时候会按照元素插入顺序。
    • 使用场景:查找较多且关心插入顺序的场景(比较少)
  3. TreeSet
    使用红黑树结构记录的集合,因为树原生具有次序,所以具有次序(为自定义顺序,非插入顺序)。
    • 使用场景:需要自定义排序功能的场景

Map

Map需要提供键和值作为映射关系进行关联,可以通过键来获取值。虽然更加灵活,功能更加丰富,但是Map的效率也是比较低的。同时Map的实现是线程非安全的,虽然Hashtable线程安全(方法加synchronized),但是效率低,推荐使用ConcurrentHashMap。

  1. HashMap
    基于列表、散列表、链表和红黑树(Java8)的实现,最优场景下开销都是固定的。
    • 使用场景:较多插入、删除、定位元素
    • 获取数据:
      • map.keySet()、map.values():以集合形式获取Map的所有key或value
      • map.get(key):根据key值获取value值
      • 迭代器遍历:
        // 迭代器
        Iterator<Entry<Object, Object>> iterator = map.entrySet().iterator();
        // 直接遍历
        for (Entry<Object, Object> entry : map.entrySet()) {
            entry.getKey();
            entry.getValue();
        }
        
  2. LinkedHashMap
    在HashMap的基础上,添加了维护插入顺序的链表用来在迭代中返回插入顺序,同时因为使用链表,迭代的效率会更加的快。
  3. TreeMap
    基于红黑树数据结构实现。在插入数据的时候会根据排序算法对数据进行排序(Comparabel或Comparator)。
    • 使用场景:需要自然排序或者自定义排序顺序遍历键

互相转换

sour\dest to List to Array to Set
List null list.toArray(new Object[0]) new HashSet<>(list)
Array new ArrayList(Arrays.asList(array)) null new HashSet<>(Arrays.asList(array))
Set new ArrayList<>(set) set.toArray(new Object[0]) null
Map new ArrayList<>(map.keySet()/values()) map.keySet().toArray(new Object[0]) new HashSet<>(map.values())

标签:Map,Set,Java,--,List,元素,基础,场景,集合
From: https://www.cnblogs.com/NyanKoSenSei/p/17700384.html

相关文章

  • Python第四章(5)集合
    1.集合的特性:(1)集合为无序的不重复元素序列。(2)集合中的元素必须为不可变的类型。2.集合的创建与删除:(1)直接使用大括号:day={1,2,"Monsday"}(2)若集合中有重复元素,python会自动保留一个。(3)集合推导式:squared={x**2forxinrange(1,3)}......
  • restTemplate接收返回对象中的数据为list是集合被转为对象问题处理
    接收的对象resultModel是服务者接口自定义的返回对象,包含msg,code,以及一个泛型对象data用于存放接口返回的数据。 当消费者通过restTemplate,postObject调用时,data需要通过map封装一下需要返回的数据,然后将map填充到data。若map中出现了集合数据,当集合数据只有一条时,会出现集合......
  • java调用第三方接口
    方法一:使用HttpURLConnection类调用第三方接口的示例代码:importjava.io.BufferedReader;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.URL;publicclassThirdPartyApiCaller{publicstaticvoidmain(String[]args){......
  • 无涯教程-JavaScript - ISERROR函数
    描述如果ISERROR函数引用的是Excel错误,则该函数将返回逻辑值TRUE。否则返回FALSE。语法ISERROR(value)争论Argument描述Required/OptionalvalueAnerrorRequiredNotes此函数在公式中用于测试计算输出很有用。与IF函数结合使用时,此函数提供了一种用于定位公式中......
  • 【Python篇】Python基础语法
    【Python篇】Python基础语法拖拖拖,能使工作便捷高效的为何要拒绝,作个记录---【蘇小沐】1.实验环境默认情况下,Python3源码文件以<fontcolor='red'>UTF-8</font>编码,所有字符串都是unicode字符串。指定源码文件其它编码:#-*-coding:cp-1252-*-#允许在源文件中使用W......
  • 大厂裁员,社招锁 HC,行业内卷严重,Java工程师校招该何去何从?
    一、背景2021年底到2022年,受到疫情和业务发展的影响,很多大厂都开始裁员,社招也开始锁HC,只出不进。而且现在Java面试日益内卷,“面试造火箭,入职拧螺丝”已经不再是啥令人惊讶的事情。这这个大背景下,对我们的校招又会有怎样的影响,我们又该如何应对?本文简单聊下这个话题。二、校......
  • 大厂校招缩招,今年 Java 后端同学校招该何去何从?
    一、背景最近有一些学弟学妹请教一些校招相关的问题。作为一个经历过校招(校招拿到了美团、网易等公司Offer)、社招(在阿里工作),当过面试官的过来人,希望通过本文让大家能够意识到今年校招的形势,帮助大家了解校招复习的误区。前几年互联网很好找工作,尤其是985和211高校的同学,找......
  • Java 程序员的效率工具箱
    一、前言作为Java程序员,常用的软件开发软件(如IDEA、Eclipse)、开源项目(SpringBoot、MyBatis、Dubbo、RocketMQ、Guava等)就那些无需赘述,这里就不想介绍了。借着这个机会,本文介绍几款自己日常开发中经常用到的能够提效的软件和插件,希望对大家有帮助。二、高效软件2.1效率工具集......
  • Java基础——==和equals的区别
     ==:既可以判断基本类型,又可以判断引用类型。==:如果判断基本类型,判断的是值是否相等。==:如果判断的是引用类型,判断的是地址是否相等,即判断是不是同一对象。equals:是object类中的方法,只能判断引用类型。默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。(具体可查......
  • Java实现常见查找算法
    Java实现常见查找算法查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找。线性查找线性查找(LinearSearch)是一种简单的查找算法,用于在数据集中逐一比较每个元素,直到找到目标元素或搜索完整个数据集。它适用于任何类型......