Java HashSet和ArrayList的查找Contains()时间复杂度
今天在刷leetCode时,碰到了一个题是这样的。
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
看到这个题的第一时间,就想到了利用集合ArrayList来存储,并且判断。
代码:
class Solution {public boolean containsDuplicate(int[] nums) {Set<Integer> list=new HashSet<>();for (int i=0;i<nums.length;i++){if(list.contains(nums[i])){return true;}else {list.add(nums[i]);}}return false;} }
然而,当数据量足够大的时候,会提示超出时间限制
后来又用了指针遍历数组,时间复杂度勉强通过,也不尽人意
最后又用到了HashSet,时间复杂度已经很好了
public static boolean containsDuplicate(int[] nums) {Set<Integer> set=new HashSet<>();for (int i=0;i<nums.length;i++){if(set.contains(nums[i])){return true;}else {set.add(nums[i]);}}return false;}
这个时候。引发了我对这两者的思考,
这道题不但在考你的基础算法实现,还涉及到算法效率优化问题。也就是必须要关注算法的时间复杂度。
既然如此,就趁这个机会加深一下ArrayList与HashSet元素查找的时间复杂度区别,实际上就是底层的实现区别。
ArrayList本质就是通过数组实现的,查找一个元素是否包含要用到遍历,时间复杂度是O(n)
而HashSetHashSet的查找是通过HashMap的KeySet来实现的,判断是否包含某个元素的实现,时间复杂度是O(1)
ArrayList判断是否包含某个元素的源码实现:
public boolean contains(Object o) {return indexOf(o) >= 0;}public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++) //从头遍历if (o.equals(elementData[i]))return i;}return -1;}
HashSet判断是否包含某个元素的源码实现:
public boolean contains(Object o) {return map.containsKey(o);}public boolean containsKey(Object key) {return getNode(hash(key), key) != null;}final Node<K,V> getNode(int hash, Object key) {Node<K,V>[] tab; Node<K,V> first, e; int n; K k;if ((tab = table) != null && (n = tab.length) > 0 &&(first = tab[(n - 1) & hash]) != null) { //直接通过hash确定元素位置,不用从头遍历if (first.hash == hash && // always check first node((k = first.key) == key || (key != null && key.equals(k))))return first;if ((e = first.next) != null) {if (first instanceof TreeNode)return ((TreeNode<K,V>)first).getTreeNode(hash, key);do {if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))//部分情况下可能会继续遍历链表定位return e;} while ((e = e.next) != null);}}return null;}
转载于:https://www.cnblogs.com/jiezai/p/11149932.html
Java HashSet和ArrayList的查找Contains()时间复杂度相关推荐
- 浅谈Java语言中ArrayList和HashSet的区别
Java语言中ArrayList和HashSet的区别 2019-04-10 13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...
- Java中使用ArrayList的10个示例–教程
Java中的ArrayList是HashMap之后最常用的集合类. Java ArrayList表示一个可自动调整大小的数组,并用于代替数组. 由于创建数组后我们无法修改数组的大小,因此我们更喜欢在J ...
- Java数据结构与算法——线性查找 二分查找 插值查找
1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...
- java arraylist 对象 删除_如何从Java中的ArrayList对象中删除冗余元素?
接口集不允许重复的元素.茶add() 此接口的方法接受元素并添加到Set对象,如果添加成功,则如果您尝试使用此方法添加现有元素,则返回true,添加操作将返回false. 因此,要删除ArrayLis ...
- Java HashSet和HashMap源码剖析
转载自 Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...
- 从源码看Java集合之ArrayList
Java集合之ArrayList - 吃透增删查改 从源码看初始化以及增删查改,学习ArrayList. 先来看下ArrayList定义的几个属性: private static final int ...
- 实现Java中的ArrayList
最近深受轮子哥影响,觉得造一些轮子应该会对自己的技术功底有一定的帮助,就决定先从简单的容器开始实现.废话不多说,就先实现一个Java中的ArrayList. ArrayList是我们在Java中使用非 ...
- Java集合干货——ArrayList源码分析
前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体实现,一些基本的都也知道,譬 ...
- mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String
mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String 参考文章: (1)mybati ...
- Java-Runoob-高级教程-实例-数组:01. Java 实例 – 数组排序及元素查找
ylbtech-Java-Runoob-高级教程-实例-数组:01. Java 实例 – 数组排序及元素查找 1.返回顶部 1. Java 实例 - 数组排序及元素查找 Java 实例 以下实例演示 ...
最新文章
- web前端开发最佳实践_学习前端Web开发的最佳方法
- Linux常用的文本查找命令 find
- CSP认证201809-4	再卖菜[C++题解]:差分约束、前缀和
- 第15课:卷积神经网络(CNN)
- C++中关于内部与外部函数
- Linux 用户空间和内核空间
- NFS配置及开机自动挂载
- TensorFlow model
- 用python写一个简单的web服务器
- SpringBoot中SpringMVC 整合启动嵌入式Tomcat 原理及源码解析
- 拒绝版权流氓!阿里巴巴重磅发布免费商用字体
- Minio入门系列【19】断点续传和断点下载实现方案
- 可以写进简历的软件测试项目实战经验(包含电商、银行、app等)
- (八) 项目干系人管理
- 自律给你自由——Android设计布局的新姿势
- 金融业务系统日志精益化分析
- scrollView无限滚动,横屏和竖屏
- 使用RXTX实现简单串口通信调试工具
- CVPR、ECCV 2020 两大会议论文分类索引
- 读书有益——》关于 “雪” 的成语
热门文章
- 公司终于把我变成了一颗忠诚的螺丝钉,我再也不能离开它
- 文本主题发现(一)-- 数据预处理
- 5、SpringBoot+MyBaits+Maven+Idea+pagehelper分页插件
- English vocabulary-1
- HDFS简单的shell操作--大数据纪录片第二记
- php之$_SESSION的理解
- js 原生拖拽,返回到原点
- urdf 学习笔记一
- SharePoint【Site Definition 系列】-- 05. List Definition与List Template之比较
- 跟我一起来用C++写Web服务器吧