盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?

简介: 盘点Java集合(容器)概览,Collection和Map在开发中谁用的最多?

写在开头

在Java的世界里万物皆对象。但我认为是万物皆数据,世界由各种各样数据构建起来,我们通过程序去实现数据的增删改查、转入转出、加减乘除等等,不同语言的实现方式殊途同归。由此可见,数据对于程序语言的重要性。

这段话是在写数据类型那篇博客时说的,当时是为了引入Java中数据类型的重要性,现在放在这里,同样是为了引出Java中的集合(容器),因为这是存储数据的媒介!在Java中有各种存储数据的集合类型,用来存储数据,做简单的逻辑处理,比如排序、取反、截取等等。
【注】

Java集合不能存放基本数据类型,只能存放对象的引用。每个集合元素都是一个引用变量,实际内容都存放在堆内或方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上的数据随时会被收回。如何解决?可以通过包装类,把基本数据类型转化为对象类型,存放引用。

容器的分类

Java中的集合主要有大量派生接口:Collection、Map

  • Collection: 英文释义收集,集合,用在储存单一元素的容器;
  • Map: 英文释义地图,映射,非常贴切,所谓地图输入一个地点,定位对应的地址位置,所以Map存储的是键值对(Key-Value),输入唯一性的key值,可以找到对应的value。

image.png

【注】:本文中所涉及到继承派生关系都是部分的,只挑重点,没列举全部,毕竟搞完太多了(手动笑哭)

Collection

先看第一个派生接口Collection,它下面又继承了很多子接口,主要为Set、List、Queue 它们各有特点,是我们在开发中几乎都会用的集合接口,也是很多互联网公司面试必问的话题!

image.png

Set

Set 的特点是存取无序,不可以存放重复的元素,不可以用下标对元素进行操作,为了直观的感受它的特点,我们直接以其子类HashSet为例去做一些增删改查的操作。

【源码速看1】

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
   
   
    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    public HashSet() {
   
   
        map = new HashMap<>();
    }

    public boolean add(E e) {
   
   
        return map.put(e, PRESENT)==null;
    }

    public boolean remove(Object o) {
   
   
        return map.remove(o)==PRESENT;
    }
}
AI 代码解读

虽然HashSet实现了Set接口,但通过源码我们能够看到,它的底层逻辑实现其实依据的是HashMap,通过操作map的key值来实现元素的增删改查,下面来使用一下HashSet。

【代码示例1】

public class Test {
   
   
    public static void main(String[] args) throws FileNotFoundException {
   
   
        // 创建一个新的HashSet
        HashSet<Integer> set = new HashSet<>();
        // 添加元素
        set.add(3);
        set.add(4);
        set.add(0);
        set.add(1);
        set.add(4);

        // 输出HashSet的元素个数
        System.out.println("HashSet size: " + set.size());

        // 判断元素是否存在于HashSet中
        boolean containsWanger = set.contains(2);
        System.out.println(containsWanger);

        // 删除元素
        boolean removeWanger = set.remove(1);
        System.out.println(set);

        // 修改元素,需要先删除后添加
        boolean removeChenmo = set.remove(3);
        boolean addBuChenmo = set.add(4);
        System.out.println(removeChenmo && addBuChenmo);

        // 输出修改后的HashSet
        System.out.println(set);
    }
}
AI 代码解读

【输出】

HashSet size: 4
false
[0, 3, 4]
false
[0, 4]
AI 代码解读

由代码结果进一步证明了我们的结论,1、存储数据不重复,但add重复数据并不报错,原因是第一个数据会被第二次重复数据覆盖掉;2,无序,很多人发现输出了一个有序的数字集合,这个其实与我们所说的有序是有区别的,在Set中的有序无序是指输入的顺序与输出的顺序是否一致 当然,想要实现有序可以通过LinkedHashSet,底层通过链表记录元素插入顺序。

List

List 的特点是存取有序,可以存放重复的元素,可以用下标对元素进行操作,同样,我们还是选择其中一个子类ArrayList来验证一下。

【代码示例2】

public class Test {
   
   
    public static void main(String[] args) throws FileNotFoundException {
   
   
        // 创建一个集合
        ArrayList<String> list = new ArrayList<String>();
        // 添加元素
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("c");

        // 遍历集合 for each
        for (String s : list) {
   
   
            System.out.println(s);
        }
        System.out.println("--------------");
        // 删除元素
        list.remove(1);
        // 遍历集合
        for (String s : list) {
   
   
            System.out.println(s);
        }
        System.out.println("--------------");
        // 修改元素
        list.set(1, "z");
        // 遍历集合
        for (String s : list) {
   
   
            System.out.println(s);
        }
    }
}
AI 代码解读

【输出】

a
b
c
c
--------------
a
c
c
--------------
a
z
c
AI 代码解读

通过代码输出结果进一步论证结论,可通过下标操作元素(下标以0为开始);输入输出一致(有序);可存储重复数据。

Queue

Queue,也就是队列,通常遵循先进先出(FIFO)的原则,新元素插入到队列的尾部,访问元素返回队列的头部。其实在日常的开发中,我们队列的使用场景不是很多,但在很多算法题中,还是有他独特的优势的。
比如,对Queue进行扩展出Deque, 实现双端队列,在队列的两端均可以插入或删除元素。

【代码示例3】

 // 创建一个ArrayDeque
        ArrayDeque<String> deque = new ArrayDeque<>();

        // 添加元素
        deque.add("a");
        deque.add("b");
        deque.add("c");

        // 删除元素
        deque.remove("b");

        // 修改元素
        deque.remove("b");
        deque.add("bb");

        // 查找队首元素
        System.out.println(deque.getFirst());
        //查找队尾元素
        System.out.println(deque.getLast());
        //遍历队列
        for (String s : deque) {
   
   
            System.out.print(s);
        }
AI 代码解读

【输出】

a
bb
acbb
AI 代码解读

List、Set、Queue三者的区别?

看望上面的几种集合类型,我们在这里进行一个区别总结

1、List(对付顺序的好帮手): 存储的元素是有序的、可重复的。
2、Set(注重独一无二的性质): 存储的元素不可重复的。
3、Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
AI 代码解读

Map

键值对集合,存储键、值和之间的映射;Key无序,唯一;value 不要求有序,允许重复。

image.png

我们以Map下最经典的HasMap为例看一看Map的特点
【代码示例4】

// 创建一个 HashMap 对象
        HashMap<String, String> hashMap = new HashMap<>();

        // 添加键值对
        hashMap.put("1", "aa");
        hashMap.put("2", "bb");
        hashMap.put("3", "cc");

        // 获取指定键的值
        String value1 = hashMap.get("1");
        System.out.println("1对应的值:" + value1);

        // 修改键对应的值
        hashMap.put("1", "aaa");
        String value2 = hashMap.get("1");
        System.out.println("1对应的值:" + value2);

        // 删除指定键的键值对
        hashMap.remove("1");

        // 遍历 HashMap
        for (String key : hashMap.keySet()) {
   
   
            String value = hashMap.get(key);
            System.out.println(key + " 对应的值为:" + value);
        }
AI 代码解读

HashMap 实现了 Map 接口,可以根据键快速地查找对应的值——通过哈希函数将键映射到哈希表中的一个索引位置,从而实现快速访问。
【输出】

1对应的值:aa
1对应的值:aaa
2 对应的值为:bb
3 对应的值为:cc
AI 代码解读

总结

本文的重心是Java集合的盘点,Collection和Map的引出,各子类的特点比较,针对很多常用的子类并没有展开过多的叙述,后面会按个的学习按个的梳理滴,毕竟这一块内容有非常多的考点,至少得更新个十几篇博文才能讲个大概,继续保持耐心,继续保持学习,一起冲!!!

结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

image.png

目录
打赏
0
0
0
0
66
分享
相关文章
Java大厂面试高频:Collection 和 Collections 到底咋回答?
Java中的`Collection`和`Collections`是两个容易混淆的概念。`Collection`是集合框架的根接口,定义了集合的基本操作方法,如添加、删除等;而`Collections`是一个工具类,提供了操作集合的静态方法,如排序、查找、同步化等。简单来说,`Collection`关注数据结构,`Collections`则提供功能增强。通过小王的面试经历,我们可以更好地理解这两者的区别及其在实际开发中的应用。希望这篇文章能帮助你掌握这个经典面试题。
65 4
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
67 3
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
使用 entrySet 遍历 Map 类集合 KV
使用 entrySet 遍历 Map 类集合 KV
|
3月前
|
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
91 18
你对Collection中Set、List、Map理解?
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
79 5
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
90 4
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
4月前
|
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
73 2

热门文章

最新文章