面试中经常被问到HashMap与HashSet的区别。于是本渣静下心来总结了一下HashSet与HashMap的区别。
1、HashSet底层使用Hash表。确保元素唯一性的原理:判断元素的hashCode值是否相同。如果是一样的话,会继续判断元素的equals方法是否是true。
HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
HashMap 是非线程安全的,Hashtable 是线程安全的,因为 Hashtable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);
21 JDK 8 HashMap 链表转红黑树,为啥是链表长度大于 8 才转?为什么是 8?
HashMap 是 map 接口的实现类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap 允许 null key 和 null value,而 HashTable 不允许。
2.Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。
集合类存放于 Java.util 包中,主要有 3 种:set、list 和 map。
大家好,又见面了,我是你们的朋友全栈君。 Java集合面试题 Java 集合框架的基础接口有哪些? Collection ,为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java 平台不提供这个接口任何直接的实现。 Set ,是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。 List ,是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List 更像长度动态变换的数组。 Map ,是一个将 key 映射到 value 的对
在工作中,经常有这样的需求,需要判断某个ID是否在某个组的管理之下等,就需要查询该组下的ID放到一个集合中,且集合中元素不能有重复,之后判断该集合是否包含我们的目标ID;这时,我们可以使用 HashSet 来存放我们的ID,HashSet可以自动的帮助我们去重,比如HashSetset = new HashSet<>(list) 等。接下来看下 HashSet 的内部是怎么实现的。
从下图可以看出,在 Java 中除了以 Map 结尾的类之外, 其他类都实现了 Collection 接口。
List结构的集合类:ArrayList类,LinkedList类,Vector类,Stack类
哈希表存放的是哈希值, HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的 hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较 equals 方法 如果 equls 结果为 true , HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。哈希值相同 equals 为 false 的元素是怎么存储呢,就是在同样的哈希值下顺延(可以认为哈希值相同的元素放在一个哈希桶中)。也就是哈希一样的存一列。
联合整理 https://blog.csdn.net/feiyanaffection/article/details/81394745 https://www.cnblogs.com/linliquan/p/11323172.html
当将一个新对象加入HashSet时,HashSet首先会计算它的hashcode值来确定该元素应当存入的位置,同时还会与其余要加入的对象的hashcode值进行对比,如果没有重复,则加入元素;否则HashSet会调用equals()方法来判断二者是否完全相同,若相同则添加失败。
双向循环链表:最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。
注意说出集合体系,常用类,接口,实现类 加上你所知道的高并发集合类,JUC 在实际项目中引用,照实说就好了
本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。
Java中的集合包括三大类,它们是Set(集)、List(列表)和Map(映射),它们都处于java.util包中,Set、List和Map都是接口,它们有各自的实现类。Set的实现类主要有HashSet和TreeSet,List的实现类主要有ArrayList,Map的实现类主要有HashMap和TreeMap。
1. 写出 List、Set、Map的各自特点 List接口: 存储任意类型的Object对象,有序、有下标、元素可以重复; 下标范围:0~元素个数-1 0~size()-1 Set集合: 无序、无下标、元素内容不允许重复; Map集合: (1) Map以键值对形式存储(key-value)。 (2) 键:无序、无下标、元素不允许重复(唯一)。 (3) 值:无序、无下标、元素内容允许重复。
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
21.HashMap的工作原理是什么? HashMap内部是通过一个数组实现的,只是这个数组比较特殊,数组里存储的元素是一个Entry实体(jdk 8为Node),这个Entry实体主要包含key、v
在说集合前我们不得不说一下数组 数组的作用: 存放一组相同的数据类型(基本或对象)的数据,从而实现对数据的管理 优势:可以快速的通过下标对数组元素进行访问,效率高 劣势:容量实现定义好了,不能随着需求变化而扩容 因此出现了更好的集合框架 一、数组和集合的比较 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下: 1:数组能存放基本数据类型和对象,而集合类存放的都是对象的引用,而非对象本身! 2:数组容易固定无法动态改变,集合类容量动态改变。
Collection是集合接口 |————Set子接口:无序,不允许重复。 |————List子接口:有序,可以有重复元素。
如果你看过 HashSet 源码的话就应该知道:HashSet 底层就是基于 HashMap 实现的。(HashSet 的源码非常非常少,因为除了 clone()、writeObject()、readObject()是 HashSet 自己不得不实现之外,其他方法都是直接调用 HashMap 中的方法。
Java 集合类主要存放于 Java.util 包中,大致可以分为两大体系(一个是 Collection,另一个是 Map)、三/四种类型(List 列表、Queue 队列、Set 集合、Map 映射):
看过 HashSet 源码的人就应该知道:HashSet 底层就是基于 HashMap 实现的。(HashSet 的源码非常非常少,除了 clone()、writeObject()、readObject() 是 HashSet 本身实现之外,其他方法都是直接调用 HashMap 中的方法。
Collection 接口的接口 对象的集合(单列集合) ├——-List 接口:元素按进入先后有序保存,可重复 │—————-├ LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全 │—————-├ ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全 │—————-└ Vector 接口实现类 数组, 同步, 线程安全 │ ———————-└ Stack 是Vector类的实现类 └——-Set 接口: 仅接收一次,不可重复,并做内部排序 ├—————-└HashSet 使用hash表(数组)存储元素 │————————└ LinkedHashSet 链表维护元素的插入次序 └ —————-TreeSet 底层实现为二叉树,元素排好序
继承关系:从Set集合的继承图可以看到,它与List集合一样继承了Collection接口,说明Set集合也是一个单列集合。
Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类,另外LinkedHashSet也有一定的使用频率。
数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架。 Java工具
在运行时判断任意一个对象所属的类。 在运行时构造任意一个类的对象。 在运行时判断任意一个类所具有的成员变量和方法(通过反射设置可以调用private)。 在运行时调用任意一个对象的方法。
1. List:列表,有序集合,可以包含重复元素。主要实现类有ArrayList和LinkedList。
个人觉得 Java 集合类在面试过程中是个超高频的模块,所以一定要认真准备每个知识点。那么我个人学习这块知识点的方法是:
1. List:有序、可重复。可以通过索引快速查找,但进行增删操作时后续的数据需要移动,所以增删速度慢。
反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部成员进行操作。反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法
remove(value):将给定值从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。
HashSet 源码分析 1. 在阅读源码时做了大量的注释,并且做了一些测试分析源码内的执行流程,由于博客篇幅有限,并且代码阅读起来没有 IDE 方便,所以在 github 上提供JDK1.8 的源码、详细的注释及测试用例。欢迎大家 star、fork ! 2. 由于个人水平有限,对源码的分析理解可能存在偏差或不透彻的地方还请大家在评论区指出,谢谢! 1. 基本结构 1. 继承 这个类简直适合 HashMap 如出一辙,他们继承的类都极其相似。继承的是 AbstractSet 。 2. 实现 实现了 Se
5.comparable/comparator区别。 用Comparable简单,只要实现Comparable接口的对象直接就成为一个可以比较的对象但是需要修改源代码。 用Comparator的好处是不需要修改源代码,而是另外实现一个比较器,当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。
注:最近因个人原因,更新速度可能会相对慢一些,这段时间过去就会缓和很多,公众号会持续更新。我也在用这段时间,好好沉淀一下自己。希望能给大家带来更好的文章。
2019年总结:Java中高级面试题228道系列(6)
75、Java 中,ByteBuffer 与 StringBuffer 有什么区别?(答案)
本篇文章带你从Java源码深入解析关于Java容器的概念。 前言 本篇文章是Tsy远的投稿,Android群英传刚刚开放投稿,有什么好的建议和意见,还请大家多多和我交流~ 本篇文章是讲解Java的容器类,这些东西在我们平时的开发中用的是非常广泛的,但大家有没有好好的去了解过呢?虽然Android是对Java的进一步封装(SDK),但了解Java,可以让我们更加清楚的了解Android的实现原理,这就和我们去看Framework层的代码是一个道理。而且,这样的文章最大的受益者,实际上就是作者本身,只有自己把这
前面我们学了 List 集合。我们知道 List 是一个有序的集合,可以根据元素的整数索引访问元素,并且允许重复。
只见一尘号召了所有的弟子,把他们的名字都到他自己构造出的一个List集合里面去了。
推荐在单线程环境下使用HashMap替代,如果需要多线程使用则用ConcurrentHashMap。
java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历。
领取专属 10元无门槛券
手把手带您无忧上云