今天在刷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()时间复杂度相关推荐

  1. 浅谈Java语言中ArrayList和HashSet的区别

    Java语言中ArrayList和HashSet的区别 2019-04-10   13:22:49 一.基本区别 首先一起看个实例,其代码如下: package com.MrZ_baby.com; i ...

  2. Java中使用ArrayList的10个示例–教程

    Java中的ArrayList是HashMap之后最常用的集合类. Java ArrayList表示一个可自动调整大小的数组,并用于代替数组. 由于创建数组后我们无法修改数组的大小,因此我们更喜欢在J ...

  3. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

  4. java arraylist 对象 删除_如何从Java中的ArrayList对象中删除冗余元素?

    接口集不允许重复的元素.茶add() 此接口的方法接受元素并添加到Set对象,如果添加成功,则如果您尝试使用此方法添加现有元素,则返回true,添加操作将返回false. 因此,要删除ArrayLis ...

  5. Java HashSet和HashMap源码剖析

    转载自 Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...

  6. 从源码看Java集合之ArrayList

    Java集合之ArrayList - 吃透增删查改 从源码看初始化以及增删查改,学习ArrayList. 先来看下ArrayList定义的几个属性: private static final int ...

  7. 实现Java中的ArrayList

    最近深受轮子哥影响,觉得造一些轮子应该会对自己的技术功底有一定的帮助,就决定先从简单的容器开始实现.废话不多说,就先实现一个Java中的ArrayList. ArrayList是我们在Java中使用非 ...

  8. Java集合干货——ArrayList源码分析

    前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体实现,一些基本的都也知道,譬 ...

  9. mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String

    mybatis中传集合时 报异常 invalid comparison: java.util.Arrays$ArrayList and java.lang.String 参考文章: (1)mybati ...

  10. Java-Runoob-高级教程-实例-数组:01. Java 实例 – 数组排序及元素查找

    ylbtech-Java-Runoob-高级教程-实例-数组:01. Java 实例 – 数组排序及元素查找 1.返回顶部 1. Java 实例 - 数组排序及元素查找  Java 实例 以下实例演示 ...

最新文章

  1. web前端开发最佳实践_学习前端Web开发的最佳方法
  2. Linux常用的文本查找命令 find
  3. CSP认证201809-4 再卖菜[C++题解]:差分约束、前缀和
  4. 第15课:卷积神经网络(CNN)
  5. C++中关于内部与外部函数
  6. Linux 用户空间和内核空间
  7. NFS配置及开机自动挂载
  8. TensorFlow model
  9. 用python写一个简单的web服务器
  10. SpringBoot中SpringMVC 整合启动嵌入式Tomcat 原理及源码解析
  11. 拒绝版权流氓!阿里巴巴重磅发布免费商用字体
  12. Minio入门系列【19】断点续传和断点下载实现方案
  13. 可以写进简历的软件测试项目实战经验(包含电商、银行、app等)
  14. (八) 项目干系人管理
  15. 自律给你自由——Android设计布局的新姿势
  16. 金融业务系统日志精益化分析
  17. scrollView无限滚动,横屏和竖屏
  18. 使用RXTX实现简单串口通信调试工具
  19. CVPR、ECCV 2020 两大会议论文分类索引
  20. 读书有益——》关于 “雪” 的成语

热门文章

  1. 公司终于把我变成了一颗忠诚的螺丝钉,我再也不能离开它
  2. 文本主题发现(一)-- 数据预处理
  3. 5、SpringBoot+MyBaits+Maven+Idea+pagehelper分页插件
  4. English vocabulary-1
  5. HDFS简单的shell操作--大数据纪录片第二记
  6. php之$_SESSION的理解
  7. js 原生拖拽,返回到原点
  8. urdf 学习笔记一
  9. SharePoint【Site Definition 系列】-- 05. List Definition与List Template之比较
  10. 跟我一起来用C++写Web服务器吧