Java集合总结

集合和数组在存储数据的时候是各有优缺点的,先总结下集合和数组的区别

1.数组长度固定,集合长度不固定

2.数组只能存储同一类型的元素,集合可以存储不同数据类型(在引入泛型后,可以规定元素的类型相同)

3.数组可以存储基本类型也可以存储引用类型,集合只能存储引用类型

集合类由两大接口派生而出:Collection<E>和Map<K,V>

Collection<E>:是接口,需要由实现类去实现接口,存储单列元素。

它的主要方法:

添加:boolean add(E e)  移除:boolean remove(Object o)  判断是否包含某元素:boolean contains(Object o)  返回集合中元素的个数:int size()   判断集合是否为空:boolean isEmpty()  迭代器:Iterator<E> iterator()  是Collection集合特有的一种遍历方式,实现了Iterable<E>接口,使用boolean hasNext():如果迭代器中还有元素,则返回true。和E next():返回迭代器中的下一个元素  这两个方法进行遍历

它的子接口:List<E>Set<E>Queue<E>。List集合中元素是有序不唯一的(有序是指存储有序但不是排序),Set集合中元素是无序但唯一的。

List<E>集合的实现类:

  • ArrayList:底层数据结构是数组,查询快,增删慢;线程不安全,效率高;
  • Vector:底层数据结构是数组,查询快,增删慢;线程安全,效率低;
  • LinkedList:底层数据结构是联邦,查询慢,增删快;线程不安全,效率低。
  • Queue<E>:底层数据结构是队列,类似于List(Queue接触较少,后面不做总结)

Set<E>集合的实现类:

HashSet:底层数据结构是哈希表,依赖HashCode()方法和equals()方法。这两个方法的执行顺序:先HashCode(),值不同:添加;值相同:equals()值,不同:添加;相同:不添加。 其子类LinkedHashSet,底层数据结构由哈希表及链表构成,链表保证元素有序,Set保证元素唯一。

TreeSet:底层数据结构是红黑树,是一种自平衡的二叉树。元素排序(是排序不是有序!)

排序分为自然排序和比较器排序。自然排序:元素具备比较性,元素所属类实现接口Comparable即可,比如我们平常使用的Integer,String都已实现Comparable接口;比较器排序:如果元素是自定义类时,需要按需求对元素进行排序,比如按自定义类中的某个成员变量的大小进行排序,此时需要集合接收一个Comparator的实现类对象,可采用匿名内部类或外部类去重写compare()方法。

Map<K,V>:是一个接口,K是键 ,V是该键对应的值,存储的元素是键值对,也就是成对存在的,存储双列元素。键不能重复,每一个键最多映射一个值。

它的主要方法:

添加:V put(K key,V value)   删除:V remove(K key,V value)   判断:1).boolean containsKey(Object o):是否包含某个键;2).boolean containsValue(Object o):是否包含某个值;3).boolean isEmpty():是否为空  获取:1) Set<K> keySet() 获取所有键的视图  2) V get(Object key) 返回改建对应的值  3) int size() 获得该集合的键值对的对数

Map集合的遍历方式:

1)键找值:将所有的键获取到一个集合Set中,再遍历该集合获取对应的值

2)由键值对对象找键和值:获取所有的键值对对象到集合中,再遍历该集合获得每一个键值对的键和值

Map常用的实现类与Set的实现类类似:

  • Hashtable:类似HashSet,线程安全,效率低,被HashMap替代;
  • HashMap:类似HashSet,线程不安全,效率高;
  • LinkedHashMap:类似LinkedHashSet;
  • TreeMap:类似SetMap

注意:Map集合的数据结构仅对键有效,与值无关。

判断使用哪个集合:

是否是键值对形式的元素?

是:Map

是否需要排序?

是:TreeMap

否:HashMap

否:Collection

是否唯一(或有序)

不唯一,有序:List

数据结构:数组:ArrayList(线程不安全,效率高);Vector(线程安全,效率低)

链表:LinkedList(线程不安全,效率高);

唯一,无序:Set

是否排序?

是:TreeSet

否:HashSet

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Java动态获取实现某个接口下所有的实现类对象集合

    最近有个需求,我需要获取所有同一类型的定时任务的对象,并自动执行. 我想的方案是:直接获取某个接口下面所有的实现类的对象集合,方便以后只需要 实现这个接口,就能自动被加载执行.话不多说,说说我的实现方案. 开始想着用反射自己写一个工具类,后面懒得去折腾,就直接用第三方工具包了,这里我用的是org.reflections. maven配置: <dependency> <groupId>org.reflections</groupId> <artifactId>

  • Java实现过滤掉map集合中key或value为空的值示例

    本文实例讲述了Java实现过滤掉map集合中key或value为空的值.分享给大家供大家参考,具体如下: import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * 过滤掉map集合中key或value为空的值 * @author lmb * @date 2017-3-14 */ public

  • java使用lambda表达式对List集合进行操作技巧(JDK1.8)

    具体代码如下所示: import java.util.ArrayList; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; public class LambdaStudy { public static void main(String[] args) { //初始化list集合 List<String> list = new ArrayList&l

  • 详细分析Java并发集合ArrayBlockingQueue的用法

    在上一章中,我们介绍了阻塞队列BlockingQueue,下面我们介绍它的常用实现类ArrayBlockingQueue. 一. 用数组来实现队列 因为队列这种数据结构的特殊要求,所以它天然适合用链表的方式来实现,用两个变量分别记录链表头和链表尾,当删除或插入队列时,只要改变链表头或链表尾就可以了,而且链表使用引用的方式链接的,所以它的容量几乎是无限的. 那么怎么使用数组来实现队列,我们需要四个变量:Object[] array来存储队列中元素,headIndex和tailIndex分别记录队列

  • Java8中利用stream对map集合进行过滤的方法

    前言 Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找.遍历.过滤以及常见计算等. 最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯.一次无意的点到了公司封装的对map集合过滤的方法,发现了stream.于是研究了一下.并对原有的代码再次结合Optional进行重构下 原有方法说明 主要处理过滤条件Map对象,过滤掉了null和空字符串 等操作 这

  • java拓展集合工具类CollectionUtils

    拓展集合工具类CollectionUtils,供大家参考,具体内容如下 package com.demo.utils; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.uti

  • Java集合定义与用法实例总结【Set、List与Map】

    本文实例讲述了Java集合定义与用法.分享给大家供大家参考,具体如下: java集合大体可分为三类,分别是Set.List和Map,它们都继承了基类接口Collection,Collection接口定义了众多操作集合的基本方法,如下: 为了访问Collection集合,不得不去了解Iterator接口.该接口很简单,主要用于定义访问集合的方法,如下: 所以上述的三大类子集合必定都继承了上面2个接口.其中Set集合要求元素不重复,且内部无序,所以访问时只能根据元素值来访问:List内部为动态数组,

  • 2018版java多线程面试题集合及答案

    java多线程面试题整理及答案,供大家参考,具体内容如下 1.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点. 2.线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用

  • Java判断2个List集合是否相等(不考虑元素的顺序)

    现在有两个对象,他们的一个属性是list,很明显两个对象的list里面的对象,都是相等的,只是这2个list里面的顺序不一致,导致这2个对象被判断为不相等啦,这就是问题,现在要解决这个问题. 问题图如下: 可以看到这2个对象的呢个list属性里面数据,咱看起来是一样的,但是经过equals之后,返回的是false. 所以,需要自己重写equals方法和hashcode方法,这2个方法一般是一起重写的. 然后,问题的关键就在于,怎么判断2个list集合是否相等.不考虑顺序. 看代码: 先是这2个对

  • JAVA集合框架工具类自定义Collections集合方法

    项目中有需要多次统计 某些集合中 的某个属性值,所以考虑封装一个方法,让其其定义实现计算方式. 话不多说,看代码: 1.封装的自定义集合工具类:CollectionsCustom package com.test.util; import java.util.Collection; import org.apache.commons.collections.CollectionUtils; /** * 自定义集合处理类 */ public class CollectionsCustom { /*

随机推荐