铁马冰河2000

导航

集合面试题

Java集合

集合就是一个可变长度的用来存放数据的容器,准确的说是存放数据对象引用的容器,集合类存放的都是对象的引用,而不是对象的本身(不能存储基本数据类型)。
集合类存放于 Java.util 包中,主要有 3 种:set、list和 map。
1) Collection:Collection 是集合 List、Set、Queue 的最基本的接口。
2) Iterator:迭代器,可以通过迭代器遍历集合中的数据
3) Map:是映射表的基础接口

Java集合关系

 

集合和数组的区别

数组是固定长度的;集合可变长度的。
数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

Collection 和 Collections 有什么区别?

Collection是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式。
Collections是一个包装类,它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等),此类不能实例化,就像一个工具类,服务于Collection框架。

List、Set与Map三者的区别?

List :存储的元素是有序的(按对象的顺序保存对象)、可重复的,允许多个Null元素对象,每个元素都有索引。
Set:存储的元素是无序的、不可重复的,最多允许一个Null元素对象,只能通过迭代器或foreach的方式进行遍历。
Map:以键值对(key-value)的方式存储元素,Key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。Map没有继承于Collection接口,从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。

List集合

ArrayList :基于动态的 Object[] 数组实现的,连续内存存储,适合下标访问(随机访问),适用于频繁的查找工作,数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
Vector :基于动态的Object[] 数组,支持线程的同步,即某一时刻只有一个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问 ArrayList 慢
LinkedList :双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环),适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

Set集合

HashSet (无序,唯一): HashSet 底层就是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为present。因此 HashSet 的实现比较简单,除了 clone() 、 writeObject() 、 readObject() 是 HashSet集合不得不实现之外,其他方法都是直接调用HashMap 中的方法。
LinkedHashSet : LinkedHashSet 是 HashSet 的子类,并且其内部是通过 LinkedHashMap来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的。
TreeSet (有序,唯一):红黑树(自平衡的排序二叉树) 基于二叉树的原理,对新 add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。(可以对Integer和String 对象都进行默认的排序,而自定义类的对象是不可以的,须实现 Comparable 接口,并且覆写相应的 compareTo()函数)

Map集合

HashMap :JDK1.8 之前 HashMap 由数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度大于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间
LinkedHashMap :LinkedHashMap 继承于 HashMap ,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外, LinkedHashMap 在上述结构的基础上,增加了一条双向链表,使得数据结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。
HashTable : 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
TreeMap :红黑树(自平衡的排序二叉树)

posted on 2023-02-11 21:18  铁马冰河2000  阅读(14)  评论(0编辑  收藏  举报