首页 > 编程语言 >Java集合基础——针对实习面试

Java集合基础——针对实习面试

时间:2024-11-11 15:45:16浏览次数:6  
标签:Map Set Java 元素 接口 面试 实习 集合

目录

Java集合基础

在这里插入图片描述

什么是Java集合?

Java集合(Java Collections)是Java中提供的一种容器,用于存储和管理一组对象。Java集合框架(Java Collections Framework,JCF)提供了一套标准的接口和实现,使得开发者可以方便地实现各种集合操作,如添加、删除、遍历等。

Java集合主要包含以下几类:

  1. Collection接口:这是所有集合类的根接口,它包含了一些基本的操作,如添加(add)、删除(remove)、遍历(iterator)等。

  2. List接口:它是Collection的子接口,代表一个有序集合,可以包含重复的元素。常见的实现类有ArrayListLinkedListVector等。

  3. Set接口:它也是Collection的子接口,代表一个无序集合,不包含重复的元素。常见的实现类有HashSetLinkedHashSetTreeSet等。

  4. Map接口:它不是Collection的子接口,而是一个独立的接口,用于存储键值对。常见的实现类有HashMapLinkedHashMapTreeMapHashtable等。

  5. Queue接口:代表一种队列集合,用于先进先出的操作。常见的实现类有LinkedListPriorityQueue等。

Java集合框架的主要优势在于提供了一套统一的接口,使得不同的集合类型可以很容易地互换使用。此外,Java集合框架还提供了一些辅助类,如CollectionsArrays,用于提供对集合进行操作的静态方法,如排序、搜索、复制等。

说说List,Set,Queue,Map的区别?

当然,让我来详细解释一下ListSetQueueMap这四种类型的集合以及它们之间的主要区别:

List(列表)

  • 有序集合List中的元素按照插入的顺序保存
  • 可重复List允许重复的元素。
  • 索引访问:可以通过索引快速访问元素(例如,通过get(int index))。
  • 实现类:常见的实现类有ArrayListLinkedListVector

Set(集合)

  • 无序集合Set中的元素不保证有序
  • 不可重复Set不允许重复的元素,如果尝试添加重复的元素,它将被忽略。
  • 无索引访问Set不支持通过索引访问元素。
  • 实现类:常见的实现类有HashSetLinkedHashSetTreeSet

Queue(队列)

  • 先进先出(FIFO)Queue是一种特殊的集合,用于按照特定的顺序(通常是FIFO)处理元素。
  • 可重复Queue允许重复的元素。
  • 实现类:常见的实现类有LinkedListPriorityQueue

Map(映射)

  • 键值对集合Map存储的是键值对,每个键映射到一个值。
  • 键唯一Map中的键是唯一的,每个键只能映射到一个值。
  • 无索引访问Map不支持通过索引访问元素。
  • 实现类:常见的实现类有HashMapLinkedHashMapTreeMapHashtable

说说List?

List 是 Java 集合框架中的一个接口,它继承自 Collection 接口。List 接口的特点是它允许我们按索引来存储和访问元素,并且允许元素重复。以下是 List 接口的一些关键特性和实现类:

关键特性

  1. 有序性List 中的元素按照插入的顺序保存,这意味着元素的顺序是有意义的。
  2. 可重复List 允许存储重复的对象。
  3. 随机访问:可以通过索引快速访问列表中的元素,时间复杂度为 O(1)。
  4. 元素插入:可以在列表的任何位置插入元素,也可以在列表的末尾添加元素。
  5. 元素删除:可以删除列表中的任何元素,包括删除特定索引位置的元素。

实现类
List 接口有多种实现,每种实现都有其特定的用途和性能特点:

  1. ArrayList

    • 基于动态数组实现。
    • 支持快速随机访问
    • 插入和删除操作可能较,因为可能需要数组扩容或元素移动。
  2. LinkedList

    • 基于双向链表实现。
    • 不支持快速随机访问
    • 插入和删除操作较,因为只需改变节点的链接。
  3. Vector

    • 类似于 ArrayList,但它是同步的。
    • 由于同步操作,通常比 ArrayList 慢。
  4. CopyOnWriteArrayList

    • 线程安全的 ArrayList 实现。
    • 在进行修改操作时,会复制整个底层数组,因此读操作不需要加锁,适合读多写少的并发场景。

使用场景

  • ArrayList:当你需要一个可以随机访问的列表,并且插入和删除操作不是主要操作时,这是一个很好的选择。
  • LinkedList:当你需要频繁地在列表中插入删除元素,尤其是在列表的开头或中间操作时,使用 LinkedList 更为合适。
  • Vector:在需要线程安全的列表时可以使用,但通常推荐使用 Collections.synchronizedList 包装 ArrayList 来获得更好的性能。
  • CopyOnWriteArrayList:适用于读多写少的并发环境,因为它通过复制整个底层数组来避免并发修改异常。

示例代码

import java.util.ArrayList;
import java.util.List;

public class ListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 访问元素
        System.out.println("First element: " + list.get(0));

        // 遍历列表
        for (String fruit : list) {
            System.out.println(fruit);
        }

        // 删除元素
        list.remove("Banana");

        // 检查列表是否包含某个元素
        if (list.contains("Cherry")) {
            System.out.println("List contains Cherry");
        }
    }
}

在 Java 面试中,了解 List 接口及其实现类的特点和使用场景是非常重要的,这有助于你根据具体需求选择最合适的集合类型。

说说Set?

Set 是 Java 集合框架中的一个接口,它继承自 Collection 接口。Set 接口的特点是它不允许重复的元素,并且不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。以下是 Set 接口的一些关键特性和常用的实现类:

关键特性

  1. 无序性Set 中的元素不按特定顺序存储,遍历顺序可能与插入顺序不同。
  2. 不可重复Set 不允许重复的元素,如果尝试添加重复的元素,它将被忽略。
  3. 无索引访问Set 不支持通过索引来访问元素。
  4. 元素唯一性:每个元素必须是唯一的,这通常是通过对象的 equals()hashCode() 方法来判断的。

实现类
Set 接口有多种实现,每种实现都有其特定的用途和性能特点:

  1. HashSet

    • 基于哈希表实现。
    • 不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。
    • 允许空元素。
    • 对于快速查找,插入和删除操作,性能通常很好。
  2. LinkedHashSet

    • 类似于 HashSet,但是维护了一个双向链表,可以按照插入顺序或访问顺序排序。
    • HashSet 稍慢,因为需要维护链表。
  3. TreeSet

    • 基于红黑树实现。
    • 元素会按照自然排序(自然顺序)或者根据创建 TreeSet 时提供的比较器进行排序。
    • 不允许空元素
    • 对于需要排序的场景,性能较好。
  4. CopyOnWriteArraySet

    • 线程安全的 Set 实现。
    • 在进行修改操作时,会复制整个底层数组,因此读操作不需要加锁,适合读多写少的并发场景。

使用场景

  • HashSet:当你需要一个不允许重复元素的集合,并且不关心元素的顺序时,这是一个很好的选择。
  • LinkedHashSet:当你需要保持元素插入的顺序,或者按照访问顺序排序时,可以使用 LinkedHashSet
  • TreeSet:当你需要元素有序,并且可能需要快速查找、插入和删除操作时,可以使用 TreeSet
  • CopyOnWriteArraySet:适用于读多写少的并发环境,因为它通过复制整个底层数组来避免并发修改异常。

示例代码

import java.util.Set;
import java.util.HashSet;

public class SetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");
        set.add("Apple"); // 尝试添加重复元素,不会被加入

        // 遍历集合
        for (String fruit : set) {
            System.out.println(fruit);
        }

        // 检查集合是否包含某个元素
        if (set.contains("Banana")) {
            System.out.println("Set contains Banana");
        }
    }
}

在 Java 面试中,了解 Set 接口及其实现类的特点和使用场景是非常重要的,这有助于你根据具体需求选择最合适的集合类型。

说说Map?

Map 是 Java 集合框架中的一个接口,它提供了一种存储键值对(key-value pairs)的方式。Map 接口不是 Collection 接口的子接口,但它是 Java 集合框架的一部分。以下是 Map 接口的一些关键特性和常用的实现类:

关键特性

  1. 键值对存储Map 存储的是键值对,每个键映射到一个值
  2. 键唯一性Map 中的键是唯一的,每个键只能映射到一个值。
  3. 值可重复Map 允许键重复,但键对应的值可以重复。
  4. 无序性Map 中的元素没有特定的顺序。
  5. 键和值的空值Map 允许键和值为空,但空键只能有一个(如果实现允许的话),空值可以有多个。

实现类
Map 接口有多种实现,每种实现都有其特定的用途和性能特点:

  1. HashMap

    • 基于哈希表实现。
    • 不保证映射的顺序,特别是它不保证该顺序恒久不变。
    • 允许键和值为
    • 对于快速查找,插入和删除操作,性能通常很好。
  2. LinkedHashMap

    • 类似于 HashMap,但是维护了一个双向链表,可以按照插入顺序或访问顺序排序。
    • HashMap 稍慢,因为需要维护链表。
  3. TreeMap

    • 基于红黑树实现。
    • 键会按照自然排序(自然顺序)或者根据创建 TreeMap 时提供的比较器进行排序。
    • 不允许键和值为空。
    • 对于需要排序的场景,性能较好。
  4. Hashtable

    • 类似于 HashMap,但是它是线程安全的。
    • 不允许键和值为空。
    • 由于同步操作,通常比 HashMap 慢。
  5. ConcurrentHashMap

    • 线程安全的 HashMap 实现。
    • 通过分段锁的概念来提高并发性能。

使用场景

  • HashMap:当你需要一个简单的键值对映射,并且不关心元素的顺序时,这是一个很好的选择。
  • LinkedHashMap:当你需要保持键值对的插入顺序或访问顺序时,可以使用 LinkedHashMap
  • TreeMap:当你需要键有序的映射,并且可能需要快速查找、插入和删除操作时,可以使用 TreeMap
  • Hashtable:在需要线程安全的映射时可以使用,但通常推荐使用 ConcurrentHashMap 来获得更好的性能。
  • ConcurrentHashMap:适用于高并发的环境,因为它通过分段锁的概念来减少锁的粒度。

示例代码

import java.util.Map;
import java.util.HashMap;

public class MapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Cherry", 3);

        // 访问元素
        System.out.println("Value for Apple: " + map.get("Apple"));

        // 遍历映射
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }

        // 检查映射是否包含某个键
        if (map.containsKey("Banana")) {
            System.out.println("Map contains key Banana");
        }

        // 检查映射是否包含某个值
        if (map.containsValue(3)) {
            System.out.println("Map contains value 3");
        }
    }
}

在 Java 面试中,了解 Map 接口及其实现类的特点和使用场景是非常重要的,这有助于你根据具体需求选择最合适的集合类型。

说说Queue?

Queue 是 Java 集合框架中的一个接口,它继承自 Collection 接口。Queue 主要用于按照先进先出(FIFO,First-In-First-Out)的原则处理元素。以下是 Queue 接口的一些关键特性和它的实现类:

关键特性

  1. 先进先出Queue 保证元素是按照它们被添加的顺序进行处理的
  2. 元素插入:可以在队列的尾部插入元素,通常称为“入队”(enqueue)。
  3. 元素移除:可以从队列的头部移除元素,通常称为“出队”(dequeue)。
  4. 不允许空元素Queue 不允许插入 null 元素。

实现类
Queue 接口有多种实现,每种实现都有其特定的用途和性能特点:

  1. LinkedList

    • 基于链表实现。
    • 支持快速插入和删除
    • 可以当作队列、栈或双端队列使用。
  2. PriorityQueue

    • 基于优先级堆实现。
    • 元素根据其自然顺序或者通过提供的比较器进行排序。
    • 不允许空元素,如果尝试添加 null,则会抛出 NullPointerException
  3. ArrayDeque

    • 基于数组实现的双端队列(Deque)。
    • 可以当作队列或栈使用。
    • LinkedList 在内存使用和性能上更优。

使用场景

  • LinkedList:当你需要一个通用的队列,或者需要栈(后进先出)的行为时,可以使用 LinkedList
  • PriorityQueue:当你需要根据元素的优先级来处理元素时,可以使用 PriorityQueue
  • ArrayDeque:当你需要一个高效的队列实现,或者需要双端队列的行为时,可以使用 ArrayDeque

示例代码

import java.util.Queue;
import java.util.LinkedList;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();
        
        // 入队
        queue.offer("Apple");
        queue.offer("Banana");
        queue.offer("Cherry");
        
        // 出队
        while (!queue.isEmpty()) {
            System.out.println(queue.poll()); // 输出 Apple, Banana, Cherry
        }
        
        // 检查队列是否为空
        if (queue.isEmpty()) {
            System.out.println("Queue is empty");
        }
    }
}

在 Java 面试中,了解 Queue 接口及其实现类的特点和使用场景是非常重要的,这有助于你根据具体需求选择最合适的集合类型。面试官可能会询问你如何实现一个队列,或者如何使用 PriorityQueue 来根据元素的优先级进行排序。

为什么要用集合?

使用集合(Collections)在编程中有许多好处,以下是一些关键原因:

  1. 数据存储和管理:集合提供了一种方便的方式来存储和管理一组对象。它们为数据提供了结构化的存储,使得数据操作更加直观和易于管理。

  2. 动态大小:大多数集合类型(如 ArrayListHashMap)可以动态地增长和收缩,这意味着你不需要在创建集合时指定大小,也不必担心集合容量不足。

  3. 提供标准算法:集合框架提供了一套标准算法(如排序、搜索、洗牌等),这些算法可以在不同的集合类型上工作,减少了重复代码的编写。

  4. 提高代码复用性:通过使用集合,你可以编写更通用的代码,这些代码可以适用于不同类型的数据集合。

  5. 提高性能:某些集合实现(如 HashMapArrayList)针对特定操作进行了优化,可以提供比手动管理数组或列表更好的性能。

  6. 减少错误:使用集合可以减少编程错误,例如,使用 ArrayListaddremove 方法比手动管理数组索引更安全,因为集合类会处理边界条件和同步问题。

  7. 支持多线程环境:某些集合实现(如 ConcurrentHashMapCopyOnWriteArrayList)是线程安全的,可以在多线程环境中安全使用,而不需要额外的同步措施。

  8. 提供数据抽象:集合提供了一种抽象层,使得代码不再依赖于特定的数据表示,这有助于提高代码的可维护性和可扩展性。

  9. 方便的数据操作:集合提供了丰富的方法来执行常见的数据操作,如添加、删除、遍历、查找等,使得数据处理更加简单。

  10. 支持泛型:集合支持泛型,这意味着你可以在编译时指定集合中元素的类型,从而提供类型安全,避免运行时出现类型错误。

  11. 集合的不可变性:不可变集合(如 Collections.unmodifiableList)提供了一种方式来创建一旦创建就不能修改的集合,这有助于保证程序的安全性。

  12. 集合的转换:集合可以轻松地在不同的集合类型之间转换,例如,你可以将列表转换为集合,或者将集合转换为映射。

总之,集合是Java编程中不可或缺的一部分,它们提供了一种强大、灵活且高效的方式来处理数据集合。在面试中,展示你对集合框架的理解和如何有效地使用它们,可以表明你具备编写高质量、可维护代码的能力。

如何选用集合?

在Java面试中,面试官可能会询问如何选择合适的集合类型来满足特定的需求。选择合适的集合类型需要考虑以下几个关键因素:

  1. 是否需要保持元素顺序
  • 如果需要保持元素插入的顺序,可以选择ArrayListLinkedList
  • 如果需要按照自然顺序或自定义顺序对元素进行排序,可以选择TreeSetTreeMap
  1. 是否需要允许重复元素
  • 如果允许重复元素,可以选择ArrayListLinkedListHashMap
  • 如果不允许重复元素,可以选择HashSetLinkedHashSetTreeSet
  1. 是否需要快速查找
  • 如果需要快速查找元素,可以选择基于哈希表的实现,如HashMapHashSet
  • 如果需要按顺序快速查找,可以选择基于红黑树的实现,如TreeMapTreeSet
  1. 是否需要线程安全
  • 如果需要在多线程环境中使用,可以选择线程安全的集合,如VectorHashtableCopyOnWriteArrayListConcurrentHashMap
  • 如果对性能有要求,并且需要自己控制同步,可以选择普通的非线程安全集合,并通过Collections.synchronizedListCollections.synchronizedMap来包装。
  1. 是否需要键值对存储
  • 如果需要键值对存储,可以选择HashMapLinkedHashMapTreeMapHashtableConcurrentHashMap
  1. 是否需要按插入顺序排序
  • 如果需要保持元素的插入顺序,可以选择LinkedHashMapLinkedHashSet
  1. 是否需要双端队列
  • 如果需要双端队列,可以选择ArrayDeque
  1. 是否需要不可变集合
  • 如果需要不可变集合,可以使用Collections.unmodifiableListCollections.unmodifiableSetCollections.unmodifiableMap来创建不可变集合。
  1. 是否需要排序
  • 如果需要对集合进行排序,可以使用Collections.sortList进行排序,或者使用List.sort方法。
  • 对于Map,可以使用Collections.sort对键或值进行排序。
  1. 是否需要处理并发
  • 如果需要处理并发,可以选择ConcurrentHashMapCopyOnWriteArrayList等并发集合。

示例:选择集合类型

假设你需要一个可以随机访问、允许重复元素、并且线程安全的集合,你可能会选择Collections.synchronizedList包装ArrayList

List<String> syncList = Collections.synchronizedList(new ArrayList<String>());

如果需要一个可以随机访问、不允许重复元素、并且线程安全的集合,你可能会选择Collections.synchronizedSet包装HashSet

Set<String> syncSet = Collections.synchronizedSet(new HashSet<String>());

在面试中,展示你对不同集合类型的理解以及如何选择它们来满足不同的需求,可以表明你具备解决实际问题的能力。

标签:Map,Set,Java,元素,接口,面试,实习,集合
From: https://blog.csdn.net/weixin_73527957/article/details/143675197

相关文章

  • 【老白学 Java】人以群分,物以类聚
    人以群分,物以类聚文章来源:《HeadFirstJava》修炼感悟。上一章,Guess想必让师兄们留下「深刻」印象,也见到了OOP应有的样子。本章老白继续学习Java变量相关的知识,感兴趣的师兄可以继续往下看。一、变量的分类Java的数据类型可分为两大类:基本数据类型引用数据类......
  • visualvm远程连接Docker容器中部署的java应用并监控
    visualvm远程连接Docker容器中部署的java应用前言jdk1.8中自带了,java11中需要单独下载下载地址visualvm下载地址简介java虚拟机监控,故障排查及性能分析工具。网络配置局域网与docker内网打通,请参考:办公网络与Docker内网网络互通服务于网络服务名称节点IPj......
  • 堪称2025最强前端面试场景题,这下不慌了...
    前言2025年的春季招聘还有三个月就即将到来,很多同学开始思考前端面试中场景题的重要性。这里我提供一些见解和建议来帮助大家准备即将到来的面试。首先,理解面试中场景题的必要性是至关重要的。与算法或理论问题不同,场景题更贴近实际工作中可能遇到的具体情况,能更好地评估应聘......
  • 2024年前端面试高频题(一)
    1.什么是事件冒泡和事件捕获事件流有三个阶段:事件捕获、事件目标、事件冒泡。在事件捕获阶段,事件从文档的根节点向下传播到目标元素;在事件冒泡阶段,事件从目标元素向上传播到文档的根节点。事件冒泡与事件捕获的区别事件捕获:事件从document→parent→child(从外到内)事......
  • 2024中高级前端面试真题解析
    我是一名本科毕业的前端程序媛,工作5年了,周末双休待遇还不错。公司最近要搬迁新地址,业务要整合到一起,所以最近比较清闲,天天上班摸鱼,闲着没事,整理了以前面试时用的资料文档有945道:JavaScript(323题)CSS(61题)HTML(57题)React(83题)Vue(80题)算法(19题)计算机网络(71题)Node.js(2......
  • 将学习型索引ALEX的cmake项目在虚拟机上用java运行
    一、环境配置虚拟机:Centos7gcc-v:11.2.1java-version:1.8.0 二、ALEX实现步骤   1、安装c++输入命令sudoapt-getinstallg++出错sudo:apt-get:找不到命令原因:Centos7中用yum命令下载再次输入命令sudoyuminstallg++再次报错已加载插件:fastestmirror,l......
  • Java 日期 API
    JDK8之前日期与时间戳之间的转换publicclassTest{publicstaticvoidmain(String[]args){Datedate=newDate();System.out.println("date="+date);//date=SunSep2614:48:52CST2021Datedate1=newDate(1632638970000L......
  • Java爬虫:京东商品SKU信息的“偷心盗贼”
    在这个信息爆炸的时代,数据就像是藏在深山里的宝藏,等待着我们这些“数据探险家”去发掘。今天,我们要化身为一名“偷心盗贼”,用Java这把锋利的“剑”,精准地从京东的海洋中窃取商品的SKU信息。别担心,我们这是合法的“盗窃”,因为我们只是在学习如何用代码与网页对话。环境准备:装......
  • Java爬虫精准获得JD商品SKU信息
    在数字化时代,数据的价值日益凸显,尤其是在电商领域。通过爬虫技术,我们可以从网站中提取有价值的信息,用于市场分析、价格监控等。Java作为一种成熟且功能强大的编程语言,拥有丰富的库支持,使其成为编写爬虫的理想选择。本文将详细介绍如何使用Java编写爬虫,以精准获取京东(JD)商品的详......
  • 2024年Java后端开发最全面试攻略,不管你工作几年,都得看看
    互联网公司的面试,从形式上说,一般分为2~3轮技术面+1轮HR面,不过某些公司没有HR面试。在技术面试中,面试官一般会就你所应聘的岗位进行相关知识的考察,也叫基础知识和业务逻辑面试,只要回答的不是特别差,面试官通常会继续跟你聊聊项目,这个时候就开始了项目面试。也就是说,技......