某大厂的面试现场,一位目光深邃,头顶稀疏的中年面试官坐在椅子上,这时候的我走了进来。
查看历史文章,请点击上方链接关注公众号。 从38节到51节,我们介绍的都是具体的容器类,上节我们提到,所有具体容器类其实都不是从头构建的,它们都继承了一些抽象容器类。这些抽象类提供了容器接口的部分实现,方便了Java具体容器类的实现,理解它们有助于进一步理解具体容器类。 此外,通过继承抽象类,自定义的类也可以更为容易的实现容器接口。为什么需要实现容器接口呢?至少有两个原因: 容器类是一个大家庭,它们之间可以方便的协作,比如很多方法的参数和返回值都是容器接口对象,实现了容器接口,就可以方便的参与进这种协作。
基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外, HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素正确分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代集合视图所需的时间与 HashMap 实例的 “容量”(桶的数量)及其大小(键-值映射关系数)的和成比例。所以,如果迭代性能很重要,
迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行Java集合的迭代。
集合,不同于数组,长度可变,存储对象。 Collection接口,常用功能如:add添加,clear清空,remove移除,contains是否包含,inEmpty是否为空,size个数,toArray存储到数组 Iterator迭代器接口,取出集合中的元素,直到集合中没有元素。常用如hasNext有下一个元素,和next取出下一个元素方法。 使用迭代器遍历集合,使用collection的iterator方法获取迭代器(含泛型),然后遍历。迭代器实质是从-1指针位置开始向后的移动遍历。 针对遍历的增强for循环,其格式简化了迭代器的书写。for(变量,变量名:集合/数组名){访问变量名}
HashMap继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。 Hashtable继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
注意:如果集合中要存储的是自定义对象时,一定要重写equals() 和 hashCode()。 问题一:HashSet为什么存取顺序不一致:底层数组存储的是链表,而遍历这些链表时,与存储数据时的顺序很可能不一致。 问题二:HashSet为什么没有索引:底层时数组+链表+红黑树,很难去规定索引。 问题三:HashSet是利用什么机制保证数据去重的?利用hashCode方法和equals方法保证去重,因为方法重写后,属性值一致的对象哈希值一致,存放的位置一致,若equals比较到相同,会不做存入操作。
注:以上方法时List集合特有的方法,Collection集合没有这些方法,但是ArrayLIst集合有这些方法,因为ArrayList继承自List集合。
针对一个特定的问题,如果事先不知道需要多少个对象,或者它们的持续时间有多长,那么也不知道如何保存那些对象。既然如此,怎样才能知道那些对象要求多少空间呢?事先上根本无法提前知道,除非进入运行期。
这是Java面试问题的重要主题之一。在这里,我列出了一些重要的Java集合面试问题和解答,以帮助您进行面试。这直接来自我14年以上的Java编程经验。
上一期 有人留言说 “就没回答对过” 。甭担心,晒一下前几期的正确率,你并不孤单 ~
迭代器模式(Iterator Pattern)也被称为游标模式(Cursor Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。是一种最简单也最常见的设计模式。
以脑图的形式来展示Java集合知识,让零碎知识点形成体系 Iterator 对比 Iterator(迭代器)是一种设计模式,是一个对象,用于遍历集合中的所有元素。 Iterator 包含四个方
============================================================================= ============================================================================= 涉及到的知识点有: 1:对象数组的概述和案例(掌握) (1)对象数组的概述 (2)对象数组的案例 2:集合(Collection接口)(掌握) (1)集合的由来? (2)集合和数组的区别? (3)集合的继承体系结构 (4)Collection接口的概述 (5)Collection接口的成员方法(注意:默认方法前有public abstract修饰) (6)Collection集合的遍历 (7)迭代器 (8)Collection集合的案例(遍历方式:迭代器方式)(要求:用记事本默写) A:存储字符串并遍历 B:存储自定义对象并遍历 3:集合(List接口)(掌握) (1)List是Collection的子接口 (2)List的特有功能(注意:默认方法前有public abstract修饰) (3)List集合的特有遍历功能 (4)列表迭代器的特有功能(了解) (5)ConcurrentModificationException 并发修改异常 (6)常见的数据结构以及其优缺点 (7)List的子类特点(面试题) (8)List集合的案例(遍历方式 迭代器和普通for循环) ============================================================================= ============================================================================= 1:对象数组的概述和案例(掌握) (1)对象数组的概述 数组既可以存储基本数据类型,也可以存储引用类型。它存储引用类型的时候的数组就叫对象数组。 (2)对象数组的案例 我有5个学生,请把这个5个学生的信息存储到数组中,并遍历学生数组,获取得到每一个学生的信息。
HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类,存在于Java API中很久了。在Java 4中被重写了,实现了Map接口,所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题。
《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Map 接口是 java 中两大集合接口之一,相对于 Collection,Map 接口结构规定了所有键值对形式的集合容器。同时,它与 Collection 的子接口 Set 又密切相关,Map 一部分实现依赖于 Set 集合,而 Set 集合的一些实现也依赖于 Map。
List 应该接口是 Collection 最常被使用的接口了。其下的实现类皆为有序列表,其中主要分为 Vector,ArrayList,LinkedList 三个实现类,其中 Vecotr 又拥有子类 Stack。
文章目录: 1、iterator迭代器 使用迭代器遍历集合 2、类和对象 创建类和对象 定义和访问成员变量 3、使用下划线初始化成员变量 4、定义成员方法 5、访问修饰符 6、类的构造器 主构造器 辅助构造器 7、单例对象 定义单例对象 8、工具类案例 9、main方法 10、伴生对象 private[this]访问权限 11、继承 示例 | 类继承 示例 | 单例对象继承 12、override和super 1、iterator迭代器 scala
能在不暴露集合底层表现形式(数组、链表、树、图、跳表等)的情况下遍历集合中所有的元素。
Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 LIst集合:链接: Java中List集合的三种遍历方式(全网最详) 集合区别:链接: java中list,set,map集合的区别,及面试要点
兄弟们好,今天我们来学习一下迭代器设计模式。迭代器这三个字应该很熟悉吧。在我们学习Java集合的时候,采用的遍历集合的方式就是通过迭代器实现的。
注:Collection在使用泛型之前,可存放Object的所有子类,在使用泛型之后,只能存某个具体的类型。
1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类。 (2)随着使用经过严格测试的集合框架类,代码质量会得到提高。 (3)通过使用JDK附带的集合类,可以降低代码维护成本。 (4)复用性和可操作性。 2.集合框架中的泛型有什么优点? Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代码整洁,我们不需要使用显式转换和instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。 3.Java集合框架的基础接口有哪些? Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。 Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。 List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。 Map是一个将key映射到value的对象.一个Map不能包含重复的key:每个key最多只能映射一个value。 一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。 4.为何Collection不从Cloneable和Serializable接口继承? Collection接口指定一组对象,对象即为它的元素。如何维护这些元素由Collection的具体实现决定。例如,一些如List的Collection实现允许重复的元素,而其它的如Set就不允许。很多Collection实现有一个公有的clone方法。然而,把它放到集合的所有实现中也是没有意义的。这是因为Collection是一个抽象表现。重要的是实现。 当与具体实现打交道的时候,克隆或序列化的语义和含义才发挥作用。所以,具体实现应该决定如何对它进行克隆或序列化,或它是否可以被克隆或序列化。 在所有的实现中授权克隆和序列化,最终导致更少的灵活性和更多的限制。特定的实现应该决定它是否可以被克隆和序列化。 5.为何Map接口不继承Collection接口? 尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是Map。因此,Map继承Collection毫无意义,反之亦然。 如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表集合的方法,但是它不适合“一组对象”规范。 6.Iterator是什么? Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。 7.Enumeration和Iterator接口的区别? Enumeration的速度是Iterator的两倍,也使用更少的内存。Enumeration是非常基础的,也满足了基础的需要。但是,与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其它线程去修改集合。 迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不能做到。为了使它的功能更加清晰,迭代器方法名已经经过改善。 8.为何没有像Iterator.add()这样的方法,向集合中添加元素? 语义不明,已知的是,Iterator的协议不能确保迭代的次序。然而要注意,ListIterator没有提供一个add操作,它要确保迭代的顺序。 9.为何迭代器没有一个方法可以直接获取下一个元素,而不需要移动游标? 它可以在当前Iterator的顶层实现,但是它用得很少,如果将它加到接口中,每个继承都要去实现它,这没有意义。 10.Iterater和ListIterator之间有什么区别? (1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。 (2)Iterator只可以向前遍历,
本文主要介绍JAVA中常见容器间的关系和主要区别。JAVA中的容器种类很多,且各有特点。为此特意进行学习研究,写下此文,作为一点总结。若有错误,欢迎拍砖。
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。 博主:java_wxid 社区:幕后大佬 @TOC 本文的大概内容: HashMap优化使用 不能用==判断或者可能有哈希冲突时,尽量减少长度,一旦冲突也会少用点时间。如果hashCode 不冲突,那查找效率很高,但是如果hashCode一旦冲突,要调用equal
每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:
然后会发现抛出java.util.ConcurrentModificationException异常,这是一个并发异常。那么这个到底是什么情况?首先需要介绍一下增强for循环
一个 java 程序猿比较广为人知的小知识 ,是 ArrayList 和 LinkedList 最好使用迭代器删除,而不是遍历删除。
为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator).
HashMap 是 Map 接口下一个线程不安全的,基于哈希表的实现类。由于他解决哈希冲突的方式是分离链表法,也就是拉链法,因此他的数据结构是数组+链表,在 JDK8 以后,当哈希冲突严重时,HashMap 的链表会在一定条件下转为红黑树以优化查询性能,因此在 JDK8 以后,他的数据结构是数组+链表+红黑树。
迭代器(Iterator)模式,从其英文单词可以看出,有反复做某件事的意思。迭代器模式常用于数据集合中,对数据集合中的数据按照顺序进行遍历。它能提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。
在迭代器中不能对来源集合直接修改需要用迭代器实现类中已经定义好的方法。对于例子用的ArrayList对象创建的集合来说,ArrayList中就有三个方法除了重写的terator(),还有ListIterator()还有一个重载的,ArrayList类中定义了内部类实现Iterator接口,重写实现接口中相关方法详情见源码。方法会新建对应的内部类对象返回,例子中的Iterator it = c.iterator();c.iterator就会得到一个ArraysList中的一个内部类对象
关于List接口的类结构和AbstractList的讲解,可以看看上一篇文章jdk源码追踪-ArrayList。
在上篇文章中,我们将剩下的常见的 Map 接口下的相关具体类做了一个解析,还有一些相关的类将会在下一篇文章中做一个总结,这篇我们来看看 Set 接口的相关类。老规矩,还是继续看一下 Set 接口下继承关系图:
迭代器模式的官方定义: 迭代器模式提供了一种方法,它能够顺序访问一个集合对象中的各个元素,并且又不暴露该对象的内部结构。 不使用迭代器模式实现容器的迭代: 当我们拿到一个含有集合的对象时,如果我们想要遍历对象中的集合,就必须要知道对象的内部结构,然后使用for循环遍历对象中的集合。而且当我们需要换一种遍历方式的时候(如:顺序遍历换成逆序遍历),需要修改客户端的代码,这就违背了“封闭-开放原则”。但如果使用了迭代器模式之后,需要换迭代方式时,只需要增加一个迭代器类,然后稍微修改一下集合对象中的代码,而客户端代
我是廖志伟,一名Java开发工程师、幕后大佬社区创始人、Java领域优质创作者、CSDN博客专家。拥有多年一线研发经验,研究过各种常见框架及中间件的底层源码,对于大型分布式、微服务、三高架构(高性能、高并发、高可用)有过实践架构经验。 ---- @TOC ---- 本文的大概内容: HashMap优化使用 不能用==判断或者可能有哈希冲突时,尽量减少长度,一旦冲突也会少用点时间。如果hashCode 不冲突,那查找效率很高,但是如果hashCode一旦冲突,要调用equals一个字节一个自己的去比
在上篇文章 Java 集合框架(1)— 概述 中我们从大体上看了一下 Java 中的集合框架,包括 List 、Set、Map 接口的一些介绍并且解释了一些接口中声明的相关方法用法。从这篇开始,我们将一起来看一下 Java 集合框架中一些具体的类的解析,了解它们的运行原理。先从 List 接口下的相关类开始。
既然是绕过迭代器遍历时的数据修改异常,那么有必要先看一下是什么样的异常。如果在集合的迭代器遍历时尝试更新集合中的数据,比如像下面这样,我想输出 Hello,World,Java,迭代时却发现多了一个 C++ 元素,如果直接删除掉的话。
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ----HashSet:底层数据结构是哈希表, * 保证数据唯一性的方法是调用存入元素的hashCode()方法 * 和equals(Object obj)方法 * HashCode值相同,才会调用equals方法 * * */
今天好累,来学学 AbstractCollection 吧! 什么是 AbstractCollection AbstractCollection 是 Java 集合框架中 Collection 接口
今天来了解下 AbstractMap。 什么是 AbstractMap AbstractMap 是 Map 接口的的实现类之一,也是 HashMap, TreeMap, ConcurrentHashM
在我们日常的开发中,集合占据着举足轻重的地位。在不同的情况下,我们会去选择性能更佳(或更安全的)集合类作为一个容器去存储数据。在接下来的几节中,我会带着大家对于集合的知识进行一次系统的深入梳理,相信梳理过后,面试或日常开发再遇到有关集合的问题对我们来说都不会是问题了。
集合在我们的日常开发中所使用的次数简直太多了,你已经把它们都用的熟透了,但是作为一名合格的程序员,你不仅要了解它的基本用法,你还要了解它的源码;存在即合理,你还要了解它是如何设计和实现的,你还要了解它的衍生过程。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
LinkedHashSet 能够维护元素插入集合的顺序,在遍历时,按照此顺序进行遍历。
原文链接:https://blog.csdn.net/javageektech/article/details/103077788
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
我们通常使用的Map集合是HashMap,在大多数情况下HashMap可以满足我们的要求,但是HashMap有一个缺点:HashMap是无序的,即其迭代顺序与其key或value的大小无关。而在某些情况下,如果我们需要Map集合里的元素有序,那么HashMap是不能满足我们的要求的。
领取专属 10元无门槛券
手把手带您无忧上云