JAVA面试之容器

java collections框架中大量集合接口以及这些接口的实现类和操作他们的算法,具体而言,主要提供了List、Queue、Set、Stack和Map。

其中Collection接口下有List、Queue、Set、Stack。Map里面HashMap、Hashtable、TreeMap、WeakHashMap。

下面来看看list、set、map的实现类原理

1> list称为有序的Collection。它按对象进入的顺序保存对象,所以它能够对列表中的每个元素的插入和删除位置进行精确的控制。同时,它可以保存重复的对象。List接口里面有LinkedList、ArrayList和Vector。

那么这三者有什么区别呢?

LinkedList和ArrayList的区别在于LinkedList是采用双向列表实现的,所以在指定位置进行插入或者删除的时候效率比较高,ArrayList更适合查找元素。

ArrayList和Vector的区别在于Vector是线程安全的。但两者都是基于存储元素的object[] array来实现的。因为ArrayList不是线程安全的,所以效率会比Vector高。

2> set在数学上表示集合的概念,最主要的特点就是在集合中的元素不能有重复的存在,因此存入Set的每个元素都必须定义equals()方法偶来确保对象的唯一性。该接口有两个实现类:HashSet和TreeSet。其中TreeSet实现了SortedSet接口,因此TreeSet中的元素是有序的。

那么HashSet和TreeSet有什么区别呢?

hashSet是为快速查找而设计的Set,存入HashSet的元素必须定义为hashCode()。所以如果没有其他的限制,HashSet就是默认的选择,因为对速度进行了优化。

TreeSet是保持了次序的set,底层实现为树结构,使用它可以从set中提取有序的序列,其元素必须实现comparable接口。

还有一种是LinkedHashSet,其是具有HashSet的查询速度,并且内部使用链表维护元素的顺序(插入的顺序),于是在使用的时候(迭代器遍历set时),结果会按照元素插入的次序显示。同时,元素也必须定义为hashcode()方法。

3>Map提供了一个从键映射到值的数据结构。它用于保存键值对,其中值可以重复,但是键是唯一的,不能重复。java中有多个市县该接口的类:HashMap、TreeMap、LinkedHashMap、WeakHashMap和IdentityHashMap。虽然它们都实现了相同的接口,但执行效率却不是相同的。

具体而言:

HashMap:如无限制,应该是默认的选择。因为对速度进行了优化。Map是基于散列表的实现,插入和查询"键值对"的开销是固定的。可以通过构造器设置容量和负载因子,以调整容器性能。

LinkedHashMap:类似于HashMap,但是迭代器遍历它时,取得"键值对"的顺序是其插入次序,或者是最近最小使用的次序。因此,只比HashMap慢一点,而在迭代访问时反而更快。因为使用是链表维护内部次序。

TreeMap:基于红黑树的实现,查看键或键值的时候,他们会被排序。TreeMap的特点在于,所得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的map,可以返回一个子树。

WeakHashMap:弱键映射,允许释放映射所指向的对象,这是为解决某类特殊问题而设计的。如果没有映射之外没有引用指向某个键,则此键被垃圾回收器回收。

ConcurrentHashMap:一种线程安全的Map,不涉及同步加锁。

identityHashMap:使用==代替equals()对键进行比较的散列映射。

注意:任何键都必须具有一个equals()方法,如果键被用于散列map,那么它必须还具有恰当的hashCode()方法,如果用于TreeMap(),还必须实现comparable。

相关推荐
551只玄猫1 小时前
【数学建模 matlab 实验报告12】聚类分析和判别分析
开发语言·数学建模·matlab·课程设计·聚类·实验报告
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
H Journey3 小时前
C++之 CMake、CMakeLists.txt、Makefile
开发语言·c++·makefile·cmake
一定要AK7 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao7 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao8 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
lly2024068 小时前
C 标准库 - `<stdio.h>`
开发语言
沫璃染墨8 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
jwn9998 小时前
Laravel6.x核心特性全解析
开发语言·php·laravel
迷藏4948 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源