Java集合概述超详解~简单易懂-有图有内容建议码友们点亮拇指+收藏呐~

一. 集合大纲

1.集合和数组的区别

  • 数组声明了它容纳的元素的类型,而集合不声明。

  • 数组是静态的,一个数组实例具有固定的大小,一旦创建了就无法改变容量了。而集合是可以动态扩展容量,可以根据需要动态改变大小,集合提供更多的成员方法,能满足更多的需求。

  • 数组的存放的类型只能是一种(基本类型/引用类型),集合存放的类型可以不是一种(不加泛型时添加的类型是Object)。

  • 数组是java语言中内置的数据类型,是线性排列的,执行效率或者类型检查都是最快的。
    在这里插入图片描述

2.Collection集合体系

Collection的由来

  • 集合可以存储多个元素,但我们对多个元素也有不同的需求
    多个元素,不能有相同的
    多个元素,能够按照某个规则排序
  • 针对不同的需求:java就提供了很多集合类,多个集合类的数据结构不同。但是,结构不重要,重要的是能够存储东西,能够判断,获取.
  • 把集合共性的内容不断往上提取,最终形成集合的继承体系---->Collection

Collection集合的方法
在这里插入图片描述

3. 常用集合的分类

Collection 接口的接口 对象的集合(单列集合)
├——-List 接口:元素按进入先后有序保存,可重复
│—————-├ LinkedList接口实现类, 链表, 插入删除, 没有同步, 线程不安全
│—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
│—————-└ Vector接口实现类 数组, 同步, 线程安全
│ ———————-└ Stack是Vector类的实现类
└——-Set 接口: 仅接收一次,不可重复,并做内部排序
├—————-└**HashSet **使用hash表(数组)存储元素
│————————└ LinkedHashSet 链表维护元素的插入次序
└ —————-TreeSet 底层实现为二叉树,元素排好序

Map 接口 键值对的集合 (双列集合)
├———Hashtable 接口实现类, 同步, 线程安全
├———HashMap 接口实现类 ,没有同步, 线程不安全-
│—————–├ LinkedHashMap双向链表和哈希表实现
│—————–└ WeakHashMap
├ ——–TreeMap 红黑树对所有的key进行排序
└———IdentifyHashMap

二. List 和 Set 集合

1. List和Set集合的区别

区别图解

2.List集合

(1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素。
(2)LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素。
(3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素。

A:添加功能
boolean add(E e):向集合中添加一个元素
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):向集合中添加一个集合的元素。
    
B:删除功能
void clear():删除集合中的所有元素
E remove(int index):根据指定索引删除元素,并把删除的元素返回
boolean remove(Object o):从集合中删除指定的元素
boolean removeAll(Collection<?> c):从集合中删除一个指定的集合元素。

C:修改功能
E set(int index, E element):把指定索引位置的元素修改为指定的值,返回修改前的值。

D:获取功能
E get(int index):获取指定位置的元素
Iterator iterator():就是用来获取集合中每一个元素。

E:判断功能
boolean isEmpty():判断集合是否为空。
boolean contains(Object o):判断集合中是否存在指定的元素。
boolean containsAll(Collection<?> c):判断集合中是否存在指定的一个集合中的元素。

F:长度功能
int size():获取集合中的元素个数

G:把集合转换成数组
Object[] toArray():把集合变成数组。

3.Set集合

<1>概述

  • Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。实际上Set就是Collection只是行为略有不同(Set不允许包含重复元素)。
  • Set集合不允许包含相同的元素,如果试图把两个相同元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入。

<2>HashSet

  • 底层数据结构: 采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。
  • 具体实现唯一性的比较过程: 存储元素首先会使用hash()算法函数生成一个int类型hashCode散列值,然后已经的所存储的元素的hashCode值比较,如果hashCode不相等,则所存储的两个对象一定不相等,此时存储当前的新的hashCode值处的元素对象;如果hashCode相等,存储元素的对象还是不一定相等,此时会调用equals()方法判断两个对象的内容是否相等,如果内容相等,那么就是同一个对象,无需存储;如果比较的内容不相等,那么就是不同的对象,就该存储了,此时就要采用哈希的解决地址冲突算法,在当前hashCode值处类似一个新的链表, 在同一个hashCode值的后面存储存储不同的对象,这样就保证了元素的唯一性。
  • Set的实现类的集合对象中不能够有重复元素: HashSet也一样他是使用了一种标识来确定元素的不重复,HashSet用一种算法来保证HashSet中的元素是不重复的, HashSet采用哈希算法,底层用数组存储数据。
  • Object类中的hashCode()的方法是所有子类都会继承这个方法: 这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模, 模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。

<3>LinkedHashSet

底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,
哈希表保证了元素的唯一性。线程不安全,效率高。

<4>何时使用

在这里插入图片描述

三. Map 集合

1.概述

Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。

图解:
map图解

2.Map集合的常用方法

  • void clear(): 删除该Map对象中所有键值对;
  • boolean containsKey(Object key): 查询Map中是否包含指定的key值;
  • boolean containsValue(Object value): 查询Map中是否包含一个或多个value;
  • Set entrySet(): 返回map中包含的键值对所组成的Set集合,每个集合都是Map.Entry对象。
  • Object get(): 返回指定key对应的value,如果不包含key则返回null;
  • boolean isEmpty(): 查询该Map是否为空;
  • Set keySet(): 返回Map中所有key组成的集合;
  • Collection values(): 返回该Map里所有value组成的Collection。
  • Object put(Object key,Object value): 添加一个键值对,如果集合中的key重复,则覆盖原来的键值对;
  • void putAll(Map m): 将Map中的键值对复制到本Map中;
  • Object remove(Object key): 删除指定的key对应的键值对,并返回被删除键值对的value,如果不存在,则返回null;
  • boolean remove(Object key,Object value): 删除指定键值对,删除成功返回true;
  • int size(): 返回该Map里的键值对个数;

3.HashMap和Hashtable的比较

在这里插入图片描述

4.内部Entry

Map中包括一个内部类Entry,该类封装一个键值对,常用方法为:

  • Object getKey(): 返回该Entry里包含的key值;
  • Object getvalue(): 返回该Entry里包含的value值;
  • Object setValue(V value): 设置该Entry里包含的value值,并设置新的value值。

~喜欢的点赞关注,评论区留下宝贵的意见-谢谢呐♥♥♥~


相关推荐:Aimee.洁的 《Java进阶总结之异常》


*作者:Aimee.洁
*本文版权归作者和CSDN共有,欢迎转载,未经作者同意必须保留此版声明,否则保留追究法律责任的权利。

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值