Java复习01 集合概念

Java复习01 集合

在Java中,集合(Collections)是一种用来存储一组对象的结构。想象一下有一个装东西的箱子,这个箱子可以装很多不同类型的东西,例如书、DVD或者玩具。Java的集合也是这样,但是它专门用来装载对象(比如字符串、整数等等)。

现在,让我们区分CollectionMap,以及Collection里的ListSet

1. Collection 和 Map 的区别

  • Collection: 这是一个单列集合,它的意思是每一个元素只包含一个对象(就像一串单独的珍珠),例如一个珍珠串。在Collection接口下面有不同类型的集合,比如ListSet
  • Map: 这是一种双列集合,意思是它存储的每个元素包含两部分:一个键(Key)和一个值(Value),就像是一个词典。在词典中,每个单词(键)都对应一个定义(值)。在Java的Map中,你可以通过键来快速找到对应的值。

2. Collection 里面 List 和 Set 的区别

这两者都是Collection的子接口,但是它们存储元素的方式有所不同:

  • List: 想象一下你有一个购物清单,你可以按照顺序在上面写下你要买的东西,就像牛奶、面包、牛奶。注意,你可以写下多次牛奶。这表明List是有序的,并且可以包含重复的元素。在Java的List中,每个元素都有一个特定的位置,就像购物清单上的物品。
  • Set: 现在假设你是一个集邮爱好者,你的集邮册里面不会想有重复的邮票,每一枚邮票都是独一无二的。这个集邮册就像是Java中的Set,它不允许重复的元素,也不保证元素的顺序。所以,如果你尝试把相同的邮票加入集邮册,它就会拒绝这个重复的。

3. List 里面 ArrayList 和 LinkedList 的区别

ArrayListLinkedList都是Java中List接口的两种不同实现。我们可以用一个比喻来解释它们之间的区别:

想象一下你有一排学生坐在教室里,他们是按照座位号顺序排列的。这就像一个ArrayList,每个学生都有一个固定的座位号(也就是在列表中的索引位置),你可以很快地找到任何一个学生(元素)只要知道他们的座位号。ArrayList在内部使用一个数组来存储元素,因此访问任何元素都非常快,就像直接叫一个学生的座位号一样简单。

现在想象一下,有一列孩子站成一排等着上滑梯。每个孩子只知道前一个和后一个孩子是谁。如果你想找到队列中的某个特定孩子,你需要从头或者从尾开始,一个接一个地问直到找到那个孩子。这个队列就像是一个LinkedList,每个元素都保持着与前一个和后一个元素的连接,但是它们并不知道自己在队列中的具体位置。LinkedList在内部使用双向链表来存储元素,因此插入和删除元素非常快,因为这就像是让一个孩子加入或离开滑梯队列一样简单。

总结一下ArrayListLinkedList的主要区别:

  • ArrayList:
    • 优点: 快速随机访问性能(快速定位元素)。
    • 缺点: 在列表中间插入和删除元素可能很慢,因为这可能涉及到移动元素来填补空白或者创建空间。
    • 适用场景: 当你需要频繁地通过索引访问元素,而且添加或删除操作主要发生在列表的末尾时。
  • LinkedList:
    • 优点: 插入和删除元素通常更快,尤其是在列表中间。
    • 缺点: 随机访问性能较慢(查找元素需要时间)。
    • 适用场景: 当你需要频繁地在列表中间进行添加或删除操作时。

4. Map 里面 HashMap()

假设我们有一个巨大的储物柜(HashMap),而每个储物格可以放你的东西,比如运动鞋。

每个储物格都有一个号码,但是这个号码不是随便给的,它是通过你鞋子的某个特别标记计算出来的。这个过程就像一个数学魔法,可以把鞋子的标记转化成储物格的号码。所以当你需要存储一双鞋时,你就使用这个魔法计算出储物格号码,然后把鞋子放进去。

现在,当你下次来,想要取回你的鞋子,你不需要去每个储物格门口找,你只需要记住那个特别标记,再用同样的魔法计算一次,就能直接知道你的鞋子在哪个储物格了。这样你就可以很快地取到你的鞋子。

但是,有时候会出现一个问题。可能会有两双不同的鞋,它们的特别标记通过魔法计算出来的储物格号码是一样的。这就像两个不同的学生被分配到了同一个宿舍。HashMap的解决办法是在同一个储物格里面加个小盒子,这样每双鞋都有自己的小盒子。虽然这样找鞋子可能会慢一点,因为你需要检查每个小盒子,但通常来说,这个魔法计算得很好,所以每个储物格里只有一两个小盒子,你还是很快就能找到你的鞋子。

HashMap就像这个巨大的储物柜,帮你快速地存储和取出东西。每次你想存东西,它都会帮你找到一个地方放。而每次你想取东西时,只要你知道那个特别的标记,你就能迅速找到它们。这就是HashMap的魔法!

4.1 HashMap的可能问题
  1. 基本概念: 他们可能会问你什么是HashMap ?
    • “HashMap是Java中的一个集合类,它可以存储键值对,并且可以快速地通过键来访问值。它是基于哈希表实现的,所以它的获取和插入的速度很快,因为它通过哈希函数直接定位到它的值的存储位置。”
  2. 内部工作原理: 他们可能会询问HashMap是如何工作的 ?
    • “HashMap通过哈希函数来计算键的哈希码,哈希码决定了键值对在内部数组中的存储位置。如果有两个不同的键产生了相同的哈希码,并且哈希函数将它们定位到了相同的位置,这种情况称为哈希冲突。HashMap通过链表或红黑树来解决冲突,这意味着每个位置实际上可以存储多个键值对。”
  3. 性能问题: 面试官可能会问到性能,比如HashMap的时间复杂度 ?
    • “HashMap的getput操作通常有常数时间的性能,即O(1),但这依赖于哈希函数的质量和键值对的分布。如果发生了很多哈希冲突,性能可能会退化至O(n),其中n是哈希桶中元素的数量。”
  4. 容量和负载因子: 关于HashMap的初始化容量和负载因子 ?
    • “HashMap有一个初始容量值,它是存储元素的内部数组的大小,还有一个负载因子,用来衡量HashMap在自动增加其容量(重新哈希)之前可以有多满。默认的负载因子是0.75,这是一个在时间和空间成本之间的折衷。”
  5. 线程安全: 如果问到线程安全 ?
    • “HashMap本身不是线程安全的,如果在多线程环境中使用HashMap,需要额外的同步措施。或者,可以使用ConcurrentHashMap,它是专为多线程环境设计的。
  6. 和其他Map的比较: 也许会让你跟其他Map实现比较,比如HashtableTreeMap ?
    • “与Hashtable比较,HashMap是非同步的,因此在单线程环境下速度更快,而Hashtable是线程安全的。与TreeMap比较,HashMap通常更快,因为TreeMap保持键的排序,其getput操作的时间复杂度为O(log n)。”

总结一下:

  • Collection: 一组单一元素的集合,可以是有序的(List),也可以是唯一的(Set)。
  • Map: 一组成对的键值对集合,可以通过键来快速查找值。
  • List: 一个可以包含重复元素并且有序的集合。
  • Set: 一个不可以有重复元素,元素位置也不固定的集合。

在使用Java集合框架时,你可以根据需要存储的数据类型和数据操作来选择最合适的集合类型。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2868724.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

更安全的C gets()和str* 以及fgets和strcspn的用法

#include <stdio.h>int main() {char *str;gets(str);puts(str);return(0); }可以说全是错误 首先char *str没有指向一个分配好的地址&#xff0c;就直接读入&#xff0c;危险 ps: 怎么理解char *str "Hello World" 是将一个存储在一个只读的数据段中字符串常…

java算法第25天 | ● 216.组合总和III ● 17.电话号码的字母组合

这两道题都是基于回溯的基本问题。 216.组合总和III 这道题是77.组合问题的变体&#xff0c;只不过终止条件多了一个和等于n。 class Solution {List<List<Integer>> resnew ArrayList<>();List<Integer> pathnew ArrayList<>();public List&l…

c++算法学习笔记 (8) 树与图部分

1.树与图的存储 &#xff08;1&#xff09;邻接矩阵 &#xff08;2&#xff09;邻接表 // 链式前向星模板&#xff08;数组模拟&#xff09; #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N 100010, M …

ABC345(A-C)

A - Leftrightarrow(100 points) 语法题&#xff0c;输入一个字符串&#xff0c;判断是否是&#xff1a;的样式&#xff0c;输入后只需判断是第一个和最后一个字符是否分别为">"和"<",再判断中间是否都是""即可。 #include<bits/stdc…

pta上的几个例题

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

双向SSM: Vision Mamba Encoder

文章目录 Vision Mamba Encoder初始化输入映射序列变换参数映射BC参数映射delta参数映射 SSM参数初始化A , D矩阵初始化delta参数初始化 双向SSM初始化参数初始化 前向输入映射fast_pathuse_fast_pathno use_fast_path 双向SSMv1前向后向 v2前向后向 Vision Mamba Encoder Vis…

解决游戏程序一运行就退出的问题

正文&#xff1a; 在游戏开发过程中&#xff0c;我们可能会遇到程序一运行就立即退出的情况。这种情况通常是由于程序中的某些逻辑错误或初始化问题导致的。 下面我们将分析可能的原因&#xff0c;并提供一些解决方案。 目录 正文&#xff1a; 原因分析&#xff1a; 解决方案…

AI健身教练-引体向上-俯卧撑计数-仰卧起坐姿态估计-康复训练姿态识别-姿态矫正

在AI健身应用中&#xff0c;通过关键点检测技术可以实现对用户动作的精准捕捉和分析&#xff0c;从而进行统计计数和规范性姿态识别。 统计计数&#xff1a;比如在做瑜伽、健身操等运动时&#xff0c;系统可以通过对人体关键点&#xff08;如手部、脚部、关节等&#xff09;的…

关于工业机器人的四大保养事项

工业机器人的保养周期和注意事项会根据具体机器人的型号、使用环境和工作负荷等因素而有所不同。一般来说&#xff0c;以下是一些常见的保养周期和注意事项&#xff1a; 工业机器人保养注意事项如下&#xff1a; 一、常规保养 1.清洁与除尘&#xff1a;定期清洁机器人的外壳、…

前端之CSS 创建css--行内引入、内联样式、外联样式

创建css有三种创建样式&#xff0c;行内引入、内联引入、外联引入。 行内引入 在行内标签引入 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>行内样式</title> </head> <body>…

深度学习入门基于python的理论与实现-第四章神经网络的学习(个人向笔记)

文章目录 从数据中学习损失函数均方误差(MSE)交叉熵误差mini_batch学习mini_batch版交叉熵误差的实现 梯度概念梯度法神经网络的梯度 从数据中学习 神经网络的"学习"的学习是指从训练数据自动获取最有权重参数的过程。 神经网络的特征就是可以从数据中学习即由数据自…

C++ 优先级队列(大小根堆)OJ

目录 1、 1046. 最后一块石头的重量 2、 703. 数据流中的第 K 大元素 为什么小根堆可以解决TopK问题&#xff1f; 3、 692. 前K个高频单词 4、 295. 数据流的中位数 1、 1046. 最后一块石头的重量 思路&#xff1a;根据示例发现可以用大根堆(降序)模拟这个过程。 class So…

Hack The Box-Jab

目录 信息收集 nmap enum4linux 服务信息收集 Pidgin kerbrute hashcat 反弹shell & get user 提权 系统信息收集 端口转发 漏洞利用 get root 信息收集 nmap 端口探测┌──(root㉿ru)-[~/kali/hackthebox] └─# nmap -p- 10.10.11.4 --min-rate 10000 -oA…

Linux服务器(Debian系)包含UOS安全相关巡检shell脚本

#!/bin/bash# Define output file current_date$(date "%Y%m%d") # Gets the current date in YYYYMMDD format output_file"server_security_inspection_report_${current_date}.txt"# Empty the file initially echo > $output_file# 获取巡检时间 (…

unity学习(57)——选择角色界面--删除角色2

1.客户端添加点击按钮所触发的事件&#xff0c;在selectMenu界面中增加myDelete函数&#xff0c;当点击“删除角色”按钮时触发该函数的内容。 public void myDelete() {string message nowPlayer.id;//string m Coding<StringDTO>.encode(message);NetWorkScript.get…

8:00面试,8:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

MySQL语法分类 DQL(5)分组查询

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

【django framework】ModelSerializer+GenericAPIView接口数据流

GenericAPIView数据从序列化到最终返回响应的数据流 // 以ModelSerializergenerics.CreateAPIView为例 程序终归是为了处理数据&#xff0c;怎么处理&#xff0c;以怎样的顺序和方法去处理&#xff0c;就涉及到了具体的业务流程。当我们是用了一个牛掰的框架&#xff0c;发现原…

面向对象(C# )

面向对象&#xff08;C# &#xff09; 文章目录 面向对象&#xff08;C# &#xff09;ref 和 out传值调用和引用调用ref 和 out 的使用ref 和 out 的区别 结构体垃圾回收GC封装成员属性索引器静态成员静态类静态构造函数拓展方法运算符重载内部类和分布类 继承里氏替换继承中的…

JavaWeb06-MVC和三层架构

目录 一、MVC模式 1.概述 2.好处 二、三层架构 1.概述 三、MVC与三层架构 四、练习 一、MVC模式 1.概述 MVC是一种分层开发的模式&#xff0c;其中 M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a; View&#xff0c;视图&#xff0c;界面展…