java面试-场景题

一、集合

1. java中如何给一个超大的一个亿左右的list数据去重?

我当时的回答是使用HashSet或Stream流的distinct语法。但是面试官好像更注重内存的消耗问题。

  • 使用HashSet:
    HashSet 是一个不允许有重复元素的集合。你可以将List中的元素添加到HashSet中,然后再将HashSet转换回List(如果你需要的话)。但请注意,这种方法只适用于可以安全地在HashSet中存储的元素(即实现了正确的hashCode()和equals()方法的对象)。
List<YourType> originalList = ... // 你的原始列表
Set<YourType> set = new HashSet<>(originalList);
List<YourType> uniqueList = new ArrayList<>(set);

但是,如果List中的元素非常大(例如,每个元素都是一个复杂的对象),那么将整个List添加到HashSet中可能会消耗大量内存。

  • 流式处理(Stream API):
    如果你使用的是Java 8或更高版本,你可以使用Stream API进行去重。但是,流式处理可能不适用于非常大的数据集,因为它需要在内存中构建中间结果。
List<YourType> uniqueList = originalList.stream().distinct().collect(Collectors.toList());

与HashSet方法类似,这种方法也依赖于元素的hashCode()和equals()方法的正确实现。

  • bigSet:参考:https://blog.csdn.net/qq_44591181/article/details/138843109
    个人柑橘bigSet更适合存数字的去重
import java.util.ArrayList;
import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;class MyObject {private int id; // 假设对象有一个唯一的ID属性// 构造函数、getter、setter等...
}public class ListDeduplicationWithBitmapForObjects {// 假设我们有一个函数可以将对象映射到唯一的整数IDpublic static int getIdFromObject(MyObject obj) {return obj.getId(); // 示例:直接返回对象的ID属性}public static List<MyObject> deduplicateListWithBitmap(List<MyObject> list) {// 假设我们知道可能的最大ID是maxValue(实际情况中需要根据数据确定)int maxValue = ...; // 例如,如果你的ID范围是0到100000000,则maxValue = 100000000// 创建一个BitSet,大小为maxValue+1BitSet bitSet = new BitSet(maxValue + 1);// 遍历原始List,并将对象的ID设置为true在BitSet中for (MyObject obj : list) {int id = getIdFromObject(obj);if (id >= 0 && id <= maxValue) { // 确保ID在有效范围内bitSet.set(id);}}// 创建一个新的List来存储去重后的对象(如果需要的话)List<MyObject> deduplicatedList = new ArrayList<>();// 如果你需要保留去重后的对象列表,你可能需要额外的数据结构来存储对象与ID的映射// 这里只是一个简单的示例,我们假设你可以从ID直接获取到对象(这通常不现实)// 遍历BitSet(如果需要的话,可以将ID转换回对象并添加到deduplicatedList中)// 但在这个简单的示例中,我们仅打印去重后的IDfor (int i = bitSet.nextSetBit(0); i >= 0; i = bitSet.nextSetBit(i + 1)) {// MyObject obj = getObjectFromId(i); // 假设你有这样的函数可以从ID获取对象System.out.println(i); // 或者打印出对象的ID// deduplicatedList.add(obj); // 如果需要的话,将对象添加到列表中}// 注意:这个示例没有返回去重后的对象列表,因为它取决于你如何存储和检索对象// 根据你的具体需求,你可能需要实现getObjectFromId函数或其他逻辑来恢复对象return null; // 或者返回一个空的deduplicatedList,取决于你的需求}public static void main(String[] args) {// 示例:创建一个包含重复对象的ListList<MyObject> list = new ArrayList<>();// ... 添加对象到list中 ...// 去重(并可能打印结果,取决于你的实现)deduplicateListWithBitmap(list);}
}

内存占用比较:
在内存消耗有限制的场景中,使用BitSet来去重确实可以比使用HashSet更加节省内存,特别是在处理大量整数或可以映射到整数的对象时。但是,节省的内存量取决于具体的数据集和整数ID的分布情况。

以下是使用BitSet与HashSet去重时内存消耗的对比:

BitSet:

BitSet使用位(bit)来表示每个可能的元素是否出现过。因此,如果你知道可能的ID范围是0到maxValue,那么BitSet将使用(maxValue + 1) / 8个字节(因为一个字节有8位)。
BitSet不会为那些未使用的ID分配内存,因此它的内存使用是固定的,并且基于ID范围的上限。
HashSet:

HashSet使用哈希表来存储对象,每个对象都映射到一个哈希桶(bucket)。哈希表的大小通常是基于负载因子(load factor)和预期的元素数量来动态调整的。
对于整数,如果直接使用HashSet,那么每个Integer对象本身就需要一定的内存(大约16到24字节,取决于JVM和JVM设置)。此外,哈希表本身也需要额外的内存来存储桶数组和链表或红黑树(用于解决哈希冲突)。
对于对象,HashSet会存储对象的引用,所以实际的内存消耗还取决于对象的大小。
内存占用的减少量:

如果你的ID范围是连续的,并且你知道这个范围,那么BitSet的内存消耗将是固定的,并且通常远低于HashSet。
假设maxValue是100,000,000,BitSet将需要大约12.5MB((100,000,000 + 1) / 8 / 1024 / 1024)。而使用HashSet存储这么多Integer对象将需要显著更多的内存。
如果对象本身很大,那么HashSet的内存消耗将更高。
注意事项:

BitSet只适用于可以映射到整数ID的对象,并且这些ID的范围是已知的且相对较小的。
BitSet不支持直接存储对象,因此如果你需要保留去重后的对象列表,你需要额外的数据结构(如HashMap)来存储对象与ID之间的映射。
HashSet提供了更通用的去重功能,可以处理任何类型的对象,而不仅仅是整数或可以映射到整数的对象。
在选择使用哪种方法时,请考虑你的具体需求,包括内存限制、数据类型、对象大小以及是否需要保留去重后的对象列表等因素。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD2024D卷机试题汇总,含D量50%+,按算法分类刷题,事半功倍

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

虚拟机固定配置IP

在Hyper-V中&#xff0c;vEthernet (Default Switch) 是Hyper-V自带的默认虚拟交换机&#xff0c;它允许虚拟机直接连接到宿主机网络或外部网络。这个虚拟交换机可以通过Hyper-V管理器或PowerShell等工具进行管理和配置。以下是具体的操作步骤&#xff1a; 一、通过Hyper-V管理…

SAP 贷项销售订单简介

SAP 贷项销售订单简介 1. 什么是销售贷方销售订单?2. 创建销售贷方销售订单的场景3. 销售贷方销售订单的创建流程直接创建发票---VF01将会计凭证过账到会计核算查看贷项销售订单凭证流查看客户明细---FBL5N贷项后台配置SAP销售贷方销售订单(Sales Credit Memo Request)是销售…

Windows定时任务实现关闭和开启声音

目录 1. 下载并放置 nircmd.exe1.1 下载 NirCmd&#xff1a;1.2 放置 nircmd.exe&#xff1a; 2. 定时关闭声音2.1 打开任务计划程序&#xff1a;2.2 创建基本任务&#xff1a;2.3 设置任务名称和描述&#xff1a;2.4 触发器&#xff1a;2.5 操作&#xff1a;2.6 设置程序或脚本…

面试官问:Django、Flask、FastAPI,你选哪个?为什么?

如果你是python Web方向的开发工程师&#xff0c;那么在面试中&#xff0c;会经常遇到面试官问这个问题&#xff1a; “在Python的三个流行Web框架&#xff1a;Django、Flask和FastAPI&#xff0c;说说它们的异同&#xff0c;以及你是怎么选择合适的框架&#xff1f;” 异同对…

AndroidStudio 编辑xml布局文件卡死问题解决

之前项目编写的都是正常&#xff0c;升级AndroidStudio后编辑布局文件就卡死&#xff0c;还以为是AndroidStudio文件。 其实不然&#xff0c;我给整个项目增加了版权声明。所以全部跟新后&#xff0c;布局文件也增加了版权声明。估计AndroidStudio在 解析布局文件时候因为有版…

【目标检测】Anaconda+PyTorch(GPU)+PyCharm(Yolo5)配置

前言 本文主要介绍在windows系统上的Anaconda、PyTorch、PyCharm、Yolov5关键步骤安装&#xff0c;为使用yolo所需的环境配置完善。同时也算是记录下我的配置流程&#xff0c;为以后用到的时候能笔记查阅。 Anaconda 软件安装 Anaconda官网&#xff1a;https://www.anaconda…

Java API和API帮助文档

API:目前是JDK中提供的各种功能的Java类。 简单理解&#xff0c;API就是别人已经写好的东西&#xff0c;我们不需要自己编写&#xff0c;直接用就可以了。比如Random,Scanner....。 Java在设计的时候&#xff0c;将api收入在JDK-API帮助文档中&#xff0c;可直接在API帮助文档…

大数据量级科普

数据量的不同等级可以根据其存储能力的大小进行划分。以下是根据常见的数据存储单位&#xff0c;从低到高列出的数据量等级&#xff1a; 1. KB&#xff08;千字节&#xff09;级 定义&#xff1a;KB是Kilobyte的缩写&#xff0c;即千字节。存储容量&#xff1a;较小&#xff…

ubuntu源码安装Odoo

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo具有非常多的安装方式&#xff0c;除了我最爱用的 apt-get install&#xff0c;我们还可以使用git拉取Odoo源码进行安装。 本次示例于ubuntu20.04 Desktop上进行操作&#xff0c;理论上在ubuntu14.04之后都可以用此操作。 …

OpenWrt 配置 Tailscale 内网穿透

前言 Openwrt 安装 zerotier 内网穿透. Tailscale 在 OpenWrt 下配置教程参考 GXNAS 博客 的 OpenWrt安装Tailscale设置内网穿透科学出国外网互访局域网设备。啥都不会难搞 的 【傻呱呱】OpenWrt安装Tailscale。阿髙 的 openwrt设置开机自启 tailscale为例。 Tailscale 安…

TensorFlow 1.12函数和注释

TensorFlow 1.12 包含大量的函数和类&#xff0c;覆盖了从基础数学操作到复杂的神经网络层构建的各种功能。列举出部分函数并进行注释。 基础张量操作 tf.add: 张量加法。tf.subtract: 张量减法。tf.multiply: 张量乘法。tf.div: 张量除法。tf.mod: 张量取模。tf.pow: 张量幂…

【算法】一致性哈希

一、引言 在分布式系统中&#xff0c;数据存储和访问的均匀性、高可用性以及可扩展性一直是核心问题。一致性哈希算法&#xff08;Consistent Hashing&#xff09;是一种分布式算法&#xff0c;因其出色的分布式数据存储特性&#xff0c;被广泛应用于缓存、负载均衡、数据库分片…

AI大模型微调训练营-总结

文章目录 AI大模型微调训练营-总结课程总结大模型开发环境搭建(Windows10CUDA12.4T4TorchTransformer)1、安装CUDA2、安装ffmpeg3、安装Anaconda4、安装Torch和Transformer4.1、参考资料4.2、具体安装步骤 AI大模型微调训练营-总结 课程总结 历经2个月&#xff0c;终于初步完…

在浏览器中测试JavaScript代码方法简要介绍

在浏览器中测试JavaScript代码方法简要介绍 在浏览器中测试JavaScript代码是前端开发中的一个重要技能。方法如下&#xff1a; 1. 浏览器控制台 最简单和直接的方法是使用浏览器的开发者工具中的控制台&#xff08;Console&#xff09;。 步骤&#xff1a; 在大多数浏览器…

【CAPL】CAPL 常用语法介绍

CAPL 有 *.can 和 *.cin 两种文件格式&#xff1b;一般.can 文件中写testcase及MainTest()&#xff0c;而.cin文件中写供.can调用的接口方法和变量等&#xff0c;其结构类似于 C 语言中的.c和.h文件 一个大致的结构如下&#xff1a; // Test.cin includes{} variables{int x…

iOS ------ weak的基本原理

1.weak的基本概念 weak弱引用&#xff0c;所引用的对象的引用计数不会加一&#xff0c;引用对象被释放的时候会自动设置为nil多用于解决对象间的相互引用造成内存泄露的循环引用的问题 2.实现原理 Person *object [[Person alloc] init]; id __weak objc object;Runtime维…

Redis 7.x 系列【26】集群模式动态扩容、动态缩容

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 动态扩容1.1 安装、启动1.2 加入新节点1.3 分配哈希槽1.4 加入从节点 2. 缩容2.1 删…

护眼灯和普通台灯有什么区别?解密护眼灯行业常见的四大选购套路

护眼灯和普通台灯有什么区别&#xff1f;随着护眼台灯的普及&#xff0c;市场上涌现了许多新兴品牌。然而&#xff0c;并非所有品牌都具备专业的技术研发实力。因此&#xff0c;网络上关于护眼台灯的各种问题也日益增多&#xff0c;如耐磨性差、耐高温性不足&#xff0c;甚至可…

python实现图像缩放算法

图像缩放算法 1.最近邻插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点2.双线性插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点3.双三次插值图像缩放算法详解算法步骤Python 实现详细解释 优缺点 1.最近邻插值图像缩放算法详解 最近邻插值&#xff08;Near…