Java.Util复习贴

news2025/1/18 17:06:05

参加了数次竞赛之后,我发现我的瓶颈所在——语法。于是今天来复习一下常用的Java库函数吧。

比赛中用java8还是10我就不care啦,我直看官方最新文档。地址在 https://docs.oracle.com/javase/10/docs/api/java/util/package-summary.html

首先看到java.util是一个package,而java.base是一个module。我简单查了一下,据说module是在java9时候出现的程序结构术语,我没有查到名词解释,从文档里看module比package要高一个抽象级别。概念这种东西,真的有时候解释不清楚还不如不解释,大家意会为主吧

java.util

官方文档里关于Java.util的解释是:“Contains the collections framework, some internationalization support classes, a service loader, properties, random number generation, string parsing and scanning classes, base64 encoding and decoding, a bit array, and several miscellaneous utility classes. This package also contains legacy collection classes and legacy date and time classes”。从文字上看,包含的内容很杂,很多,但是其实最主要的肯定排在最前面咯,考过雅思和GRE的同学们都懂,阅读理解最重要的就是不需要全部读懂,读懂最重要的就行。我们画重点的就是——collections framework!

collections framework是有tutorial的,在这里https://docs.oracle.com/javase/tutorial/collections/index.html

原来我一直以为官方文档没有例子很不友好,是我误会了,还是有教程可以follow的哈。

跟着官方教程,先从interfaces走起。

interfaces

在这里插入图片描述
借用一下官方的图,看一下核心的collection interfaces有哪些。我们发现map和collection是分开放置了,但是我们发现图的题目没有把map排除在collection外面,所以往下读,有提示:“Note also that the hierarchy consists of two distinct trees — a Map is not a true Collection.” 分开单独一棵树就是为了告诉大家Map不是真正意义上的Collection。那为什么不放在别的地方?(这个问题是留给我们自己的)

Collection

关于这个类,官方的介绍很简单明了:“The root interface in the collection hierarchy. A collection represents a group of objects, known as its elements. Some collections allow duplicate elements and others do not. Some are ordered and others unordered. The JDK does not provide any direct implementations of this interface: it provides implementations of more specific subinterfaces like Set and List. This interface is typically used to pass collections around and manipulate them where maximum generality is desired”。

如图所示,collection这颗树的根节点,就是collection。collection用于表示一组对象——也就是他的元素。有些collection允许重复元素,有些不允许。JDK不提供这个接口(Collection)的任何直接的Implementation。这个接口通常是为了传递collections并在希望具有最大通用性的情况下操纵他们。

Set

官方教程在这里:https://docs.oracle.com/javase/tutorial/collections/interfaces/set.html

教程里比较有用的一句话就是:“The Set interface contains only methods inherited from Collection and adds the restriction that duplicate elements are prohibited.” Set这个类只有继承自Collection的方法而已哦,外加一个禁止重复元素的限制。 这是一个多么听话的孩子啊,除了妈妈告诉的方法就没有别的方法了!

比较常用的instance Method,我记下来,以便查询

方法名用途返回值类型
size( )返回集合的元素个数int
equals( )将集合与特定元素比较,看是否相同boolean
isEmpty()判断集合是否为空boolean
contains​(Object o)判断集合是否包含元素oboolean
iterator()返回集合元素的IteratorIterator
toArray()返回集合元素的数组形式Object[]
toArray​(T[] a)返回集合元素的T类型数组 (我理解是输出为我们指定的类型T) T[]
add​(E e)如果集合里没有e元素,就添加到集合。如果集合里没有e元素,就返回trueboolean
remove​(Object o)如果集合里存在o元素,就删除它。如果集合里存在o元素,就返回trueboolean
containsAll​(Collection<?> c)判断集合里是否包含给定集合的所有元素boolean
addAll​(Collection<? extends E> c)如果给定集合的元素和集合现存元素有差异,添加差异元素。如有差异,返回true.(相当于并集操作boolean
retainAll​(Collection<?> c)保留与给定集合元素重合的元素,相当于交集操作。如集合有变化,返回trueboolean
clear()清空集合所有元素void
hashCode()返回集合的hashcode,默认是所有元素hashcode之和。空集的hashcode是0int

另有一个default method,我还没有理解,后面实验一下:

方法名用途返回值
spliterator()生成一个集合元素的spliteratorSpliterator

Java平台提供三个Set的implementation—— HashSet, TreeSet, and LinkedHashSet。 从官方的介绍来看,HashSe利用Hash table来实现元素存储,的性能最好,但是元素顺序没有保障;TreeSet用红黑树来实现元素存储,顺序按照字母顺序,比HashSet慢一些;LinkedHashSet用到hash table和linkedlist,元素按照插入顺序排列,性能只比HashSet差一点点。

SortedSet我们就不细究了吧,看名字就明白特殊之处了。

List

根据官方教程:List 是一个有序的 Collection (有时也叫equence). Lists 允许元素重复. 除了继承自Collection的方法, List interface 还包含特别的访问、搜索、轮询、范围视图等。这样难怪,因为List还有一个妈妈,叫 Iterator。所以它比Set的背景更大。

Java平台提供两个implementation, 一个是ArrayList,性能比较好;另一个是 LinkedList,在某些场景下性能较好。

常用方法列表:

方法名用途返回值类型
add​(E e)如果集合里没有e元素,就添加到集合。如果集合里没有e元素,就返回trueboolean
add​(int index, E e)在index的位置插入元素evoid
addAll​(int index, Collection<? extends E> c)在index的位置插入集cboolean
addAll​(Collection<? extends E> c)在列表末尾添加c中的元素boolean
contains​(Object o)判断列表是否包含元素oboolean
containsAll​(Collection<?> c)判断列表里是否包含给定集的所有元素boolean
clear()情况列表的所有元素void
equals( )将列表与特定对象比较,看是否相同boolean
get​(int index)返回列表中在 index 位置的元素E
hashCode()返回列表的hashcode,默认是所有元素hashcode之和。空集的hashcode是0int
indexOf​(Object o)返回列表中 o 的位置,如果o没有出现, 返回-1int
isEmpty()判断列表是否为空boolean
iterator()返回集合元素的IteratorIterator
lastIndexOf​(Object o)返回列表中 o 最后出现的位置,如果o没有出现, 返回-1int
listIterator()返回列表的 listIterator。 ListIterator有很好的特性,可以双向遍历ListIterator
listIterator​(int index)返回列表的 listIterator, 从index位置开始ListIterator
remove​(int index)删除列表中index位置的元素E
remove​(Object o)如果列表里存在o元素,就删除它。如果列表里存在o元素,就返回trueboolean
removeAll​(Collection<?> c)去掉列表中存在于c集中的所有元素boolean
replaceAll​(UnaryOperator operator)将列表中的元素在指定运算符下计算,用计算结果替换原来的元素默认void
retainAll​(Collection<?> c)保留与给定集合元素重合的元素,相当于交集操作。如集合有变化,返回trueboolean
set​(int index, E element)用 elemen t替换列表中 index 位置的元素E
size( )返回列表的元素个数int
sort​(Comparator<? super E> c)按照comparator的规则对列表元素进行排序默认void
spliterator()为列表元素生成一个spliteratorSpliterator
subList​(int fromIndex, int toIndex)生成一个从 fromIndex开始到 toIndex结束的子列表List
toArray()返回集合元素的数组形式Object[]
toArray​(T[] a)返回集合元素的T类型数组 (我理解是输出为我们指定的类型T) T[]

Algorithm

在官方教程里找到了一个好东东,algorithm!https://docs.oracle.com/javase/tutorial/collections/algorithms/index.html, 这里有好多又快又好的算法捷径,藏得好深啊!

Collections的内置函数:

函数名用途返回值类型
sort( Collection e)自然排序 evoid
shuffle( Collection e )打乱顺序void
reverse( List list)将list元素逆序排列void
swap(lList list, int i, int j)交换下标 i 和 j的元素的位置void
fill( List list, String str )用str填充listvoid
copy( List list1, List list2)将list2的内容复制到list1void
binarySearch(List list, E key)返回list中key的位置,如果没有返回 (-(insertion point) - 1)int
frequency(List list, E e)返回e元素在list中出现的频率int
disjoint( List list1, List list2)判断 list1 和 list2 是否没有交集,没有交集返回trueboolean
min( List list )返回list里最小的元素E
max( List list )返回list中最大的元素E

Queue

官方文档里说的很清楚,“A Queue is a collection for holding elements prior to processing”,也就是说队列只是为了在对数据进行处理加工之前存放元素的。所以,队列的方法比起前面的两个就少了很多,基本上就涉及到存取。

方法名用途返回值类型
add​(E e)如果空间允许,将e元素添加到队列,返回true。如果超出空间限制,抛出异常boolean
element()读取队列的头元素E
offer​(E e))如果空间允许,将e元素添加到队列,返回true;不抛异常boolean
peek())读取队列的头元素,如果队列为空,返回nullE
poll()读取并删除队列的头元素,如果空队列,返回nullE
remove()读取并删除队列的头元素E

当然Collections的基本方法Queue也都继承了的,还有Iterable的forEach。Queue也是个有双亲的孩子。
Queue的顺序感很强,通常是先进先出(FIFO),也就是队尾入队,队首出队。

Deque

官方文档里说道:A linear collection that supports element insertion and removal at both ends. The name deque is short for “double ended queue” and is usually pronounced “deck”。首先,Deque是可以从两端操作元素的Collection,然后我们就知道了它的真名,和昵称。历史无数次的证明,昵称总比真名要流传的广。

Deque的方法比较多了,Queue有的方法我就不列了,显得重复,大家记住Queue有的,他的兄弟Deque都有就行了。下面就列出区别于Queue的方法

方法名用途返回值类型
addFirst​(E e)如果空间允许,将e元素添加到队首。如果超出空间限制,抛出异常IllegalStateExceptionvoid
addLast​(E e)如果空间允许,将e元素添加到队尾。如果超出空间限制,抛出异常IllegalStateExceptionvoid
contains​(Object o)判断列表是否包含元素oboolean
descendingIterator()返回Deque的逆序IteratorIterator
getFirst()读取deque的头元素E
getLast()读取deque的尾元素E
offerFirst​(E e)如果空间允许,将e元素添加到队首。boolean
offerLast​(E e)如果空间允许,将e元素添加到队尾。boolean
pollFirst()读取并删除deque的头元素,如果是空队,返回nullE
pollLast()读取并删除deque的尾元素,如果是空队,返回nullE
pop()deque作为栈时的出栈操作E
push​(E e)deque作为栈时的压栈操作,空间不允许时抛出 IllegalStateExceptionvoid
remove​(Object o)删除 o 在deque里的最早出现的对应值boolean
removeFirst()读取并删除deque的头元素E
removeFirstOccurrence​(Object o)删除 o 在deque里的最早出现的对应值boolean
removeLast()读取并删除deque的尾元素E
removeLastOccurrence​(Object o)删除 o 在deque里的最后出现的对应值boolean

Map

根据官方的解释,Map就是一个键值映射,Map的键自然是不能有重复的,一个Key最多只能映射到一个Value。这个让我回想起自己前几天做的题目,确实我当时想着一个Key 映射到多个值呢,真的是学习不到位啊~~

前面官方文档里也说了,Map不是真正意义上的Collection,这里官方文档就说清楚了,Map只是提供三种Collection views:键,值,键值的映射关系。

Map的order其实比较复杂,TreeMap有明确的排序,但是HashMap就不一样啦。 我也记得老师说过,HashMap的排序不完全时是从大到小的,有一次作业用HashMap给1到100的数字排序,就比较有意思的结果。

键是不可以为空的,但是一些不合法的键赋值操作也不一定就会抛出异常。官方文档里说到的操作其实我都还不熟悉,没有体会,似乎可变的对象作为key会带来很大麻烦。大家有兴趣,自己去了解一下:https://docs.oracle.com/javase/10/docs/api/java/util/Map.html

值得注意的是这一条:“Some map operations which perform recursive traversal of the map may fail with an exception for self-referential instances where the map directly or indirectly contains itself. This includes the clone(), equals(), hashCode() and toString() methods. Implementations may optionally handle the self-referential scenario, however most current implementations do not do so” Map把自己作为一个value是可以的,那么就可以recursive traversal, 但是这里说到可能会异常的情况,看起来不很稳定。留心一下,不知道以后会不会遇到这类题目啊~~

Map的一个static interface是 Map.Entry<K,V>, entry就是map的键值对。

Map的方法好多,还有很多static的方法涉及到 Unmodifiable Map, 基于目前的菜鸟属性,我就不去学啦,因为我估计我十有八九也用不到。既然复习吗,我们就记下来常用的insntance method

方法名用途返回值类型
clear()删除map的所有映射void
compute​(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)利用remappingFunction在给定Key的基础上利用旧Value计算新的Value,如果旧mapping不存在则Value为nulldefault V
computeIfAbsent​(K key, Function<? super K,? extends V> mappingFunction)当Map中不包含给定key时,利用mappingFunction生成key的mappingdefault V
computeIfPresent​(K key, BiFunction<? super K,? super V,? extends V> remappingFunction在Map中包含给定key的情况下,利用remappingFunction在给定Key的基础上生成新的Valuedefault V
containsKey​(Object key)如果Map包含有key的mapping,就返回trueboolean
containsValue​(Object value)如果Map包含有value的mapping,就返回trueboolean
entrySet()返回Map中所有映射的Set视图Set<Map.Entry<K,V>>
equals​(Object o)如果o也是一个Map,而且所有mapping都相等,就返回true。相等的Map的entrySet也相等boolean
forEach​(BiConsumer<? super K,? super V> action)对所有mapping依次执行action操作,直到轮完所有mapping或者action抛出异常default void
get​(Object key)返回对应key的value,如果map没有对应的key的mapping,返回nullV
getOrDefault​(Object key, V defaultValue)返回对应key的value,如果map没有对应的key的mapping,返回defaultValuedefault V
hashCode()返回Map的hashcodeint
isEmpty()如果map不包含任何键值映射,则返回trueboolean
keySet()返回Map的所有key的Set视图Set
merge​(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)如果给定的key没有关联到任何value或者关联到null值,则映射到remappingFunction算出的valuedefault V
put​(K key, V value)建立key和value的映射V
putAll​(Map<? extends K,? extends V> m)从给定map复制所有映射void
putIfAbsent​(K key, V value)如果给定的key还没有关联到value,或者映射到null,则将其关联到给定的value,并返回null。否则,返回当前的映射value.V
remove​(Object key)如果key的映射存在,则将其删除V
remove​(Object key, Object value)当且仅当key和value的映射存在时(返回true)将其删除default boolean
replace​(K key, V value)当且仅当包含key的映射存在时将其value替换default V
replace​(K key, V oldValue, V newValue)当且仅当包含key的映射存在时(返回true)将oldValue替换成newValuedefault boolean
replaceAll​(BiFunction<? super K,? super V,? extends V> function)使用function替换每一个entry的value,直到所有entry都被替换或者function抛出异常void
size()返回map中键值映射的数量int
values()返回map中所有value的Collection视图Collection

复习内容大致就这么多。准备多多练习,希望可以在下一次Leetcode的比赛中签到成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序——插入排序、希尔排序

目录 一.插入排序 1.实现 2.时间复杂度 二.希尔排序 2.预排序 (1).单次预排序的实现 (2).相对有序 2.代码 一.插入排序 1.实现 正如其名&#xff0c;是将第n1个数据插入到前面的n的升序&#xff08;降序&#xff09;数据中&#xff0c;形成一个n1大小的升序&#xff0…

用于宏观经济数据分析的神经网络(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 宏观经济时间序列的分析和预测是国家决策者非常感兴趣的因素。然而&#xff0c;由于缺乏精确的经济模型和外部因素&#xff08…

浏览器隐藏滚动条(不影响内容滚动)

系列文章目录 文章目录系列文章目录一、背景和效果图如下&#xff1a;1.背景2.设置属性前效果图&#xff1a;2.设置后效果图&#xff1a;二、直接通过CSS修改样式&#xff0c;保存滑动功能1.全局设置滚动条如下&#xff08;所有的都被隐藏&#xff09;Css代码如下效果图如下2.给…

DP1363F高度集成的非接触读写芯片 13.56M NFC/RFID读卡器芯片 兼容替代CLRC663

DP1363F高度集成的非接触读写芯片 13.56M NFC/RFID读卡器芯片 兼容替代CLRC663 DP1363F是一款高度集成的非接触读写芯片&#xff0c;集强大的多协议支持、最高射频输出功率&#xff0c;以及突破性技术低功耗卡片检测等优势于一身&#xff0c;满足市场对更高集成度、更小外壳和…

Mybatis 异常总结

java.sql.SQLSyntaxErrorException: #42000 一般发生在修改 删除中 原因可能是 传入的参数与 sql 语句不匹配 It’s likely that neither a Result Type nor a Result Map was specified 异常分析&#xff1a; 关键在第一段提示&#xff1a; It’s likely that neither a Re…

Yolov5移植树莓派4B问题总结

Hallo&#xff0c;大家好啊&#xff01;之前出过几篇文章关于Yolov5的&#xff0c;不得不说Yolov5的识别率真的很高&#xff0c;对个体检测很有帮助&#xff0c;如果大家训练完之后会发现获得一个pt文件&#xff0c;这就是训练好的模型。但是&#xff0c;这个模型只能够在自己的…

Golang 【basic_leaming】2 语言容器

阅读目录Go 语言数组_定义_初始化_遍历定义数组Go 语言初始化数组Go 语言遍历数组参考文献Go 语言切片&#xff08;Slice&#xff09;初始化_删除元素_遍历什么是切片声明切片使用 make() 函数构造切片使用 append() 函数为切片添加元素从数组或切片生成新的切片从指定范围中生…

Unreal Engine中的UHT和UBT

UBT&#xff1a;附加在引擎之外的一个自定义工具&#xff0c;用于管理跨各种构建配置&#xff0c;来配置和构建UE源码的过程。 UHT&#xff1a; 目录 UBT&#xff08;UnrealBuilderTool&#xff09; UHT&#xff08;UnrealHeadTool&#xff09; UBT&#xff08;UnrealBuilder…

《第三堂棒球课》:MLB棒球创造营·棒球名人堂

田中将大 田中将大(Tanaka Masahiro)&#xff0c;1988年11月1日出生于兵库县伊丹市&#xff0c;日本职业棒球运动员。 在2006年日本职棒高中生选秀会上被东北乐天金鹰队第一指选中&#xff0c;此后开始职业生涯。在2014年被纽约洋基队以上亿巨额签约&#xff0c;期限为七年。…

混合云运维,实现批量自动化配置

随着企业业务规模扩大和复杂化及云计算、大数据等技术不断发展&#xff0c;企业希望通过上云加速其数字化转型&#xff0c;以私有云为数据存储&#xff0c;保障安全&#xff0c;同时兼顾公有云的计算资源&#xff0c;公有云和私有云融合&#xff0c;混合云逐渐成为企业的大多数…

SpringBoot改动后0.03秒启动

SpringBoot改动后0.03秒启动 一、概述 GraalVM 是一种高性能运行时&#xff0c;可显着提高应用程序性能和效率&#xff0c;非常适合微服务. 对于 Java 程序 GraalVM 负责将 Java 字节码编译成机器码&#xff0c;映像生成过程使用静态分析来查找可从主 Java 方法访问的任何代码…

详细讲解MySQL在Linux中的部署(Centos为例)

本篇文章详解Mysql在Linux中的部署&#xff0c;以便于能够在SQLyog中远程连接MySQL服务&#xff0c;具体步骤如下所示&#xff1a; 1.查找并卸载mariadb 由于Centos7中自带mariadb&#xff0c;而mariadb是MySQL的一个分支&#xff0c;因此&#xff0c;按照MySQL前必须卸载mar…

【C++初阶】string的模拟实现

文章目录string的介绍string的模拟实现string类的成员变量Member functionsconstructor&#xff08;构造函数&#xff09;destructor&#xff08;析构函数&#xff09;operator(给创建出来的对象赋值)Iterators&#xff08;迭代器&#xff09;beginendCapacitysizecapacityrese…

Oracle --- 基础

目录 启动Oracle Oracle监听 监听服务的主要文件 listener.ora tnsnames.ora sqlnet.ora Oracle用户 创建用户 启动Oracle 四步 su - oracle # 切换用户&#xff0c;进入oracle的用户&#xff0c;读取oracle的配置文件lsnrctl start # 启…

手把手教您从建模到仿真计算优化改进新能源汽车电驱动系统转子冲片强度

导读&#xff1a;新能源汽车电驱动系统的主驱电机&#xff0c;正在向高功率密度、高扭矩密度、高效率、低成本、低损耗、轻量化、小型化、集成化、系列化等方向发展。这给各大零部件供应商&#xff0c;提出了一个又一个的新问题和新挑战。 为了降低结构尺寸、重量、原材料成本…

帮你拿下offer的软件测试面试技巧 赶紧码住!

想要进入一家软件类公司&#xff0c;拿到软件测试这方面岗位的offer&#xff0c;除了专业的技术知识过硬之外&#xff0c;必要的软件测试面试技巧也是少不了的&#xff0c;那么测试人们在面试过程中又应该如何作答呢&#xff1f; 这些可以帮你拿下offer的软件测试面试技巧记得不…

北斗导航 | ION GNSS+ 2014到 ION GNSS+ 2017会议论文下载:ION 美国导航学会

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 后文有 ION GNSS+ 2014、2015、2016、2017论文下载百度云链接美国导航学…

路由选择协议(计算机网络)

目录 理想的路由算法 关于最佳路由 从路由算法的自适应性考虑 互联网分层路由 分层路由和自治系统 边界网关协议 BGP 理想的路由算法 算法必须是正确的和完整的 算法在计算上应简单 算法应能适应通信量和网络拓扑的变化&#xff0c;这就是说&#xff0c;要有自适应性 算法…

Java高效率复习-MyBatis[MyBatis]

前言 ORM是持久化映射框架&#xff0c;但是MyBatis的本质并不是ORM框架。 如何使用MyBatis执行数据库语句 依赖导入 首先如果是Maven工程&#xff0c;则导入JDBC的依赖以及MyBaits的核心依赖。 <packaging>jar</packaging> <dependencies><dependenc…

Struts2漏洞 - Struts2-015 Struts2-016 Struts2-045

文章目录Struts2简介Struts2历史漏洞Struts2历史漏洞发现Struts2框架识别Struts2历史漏洞利用Struts2-015漏洞简介影响范围环境搭建漏洞复现Struts2-016漏洞简介影响范围环境搭建漏洞复现Struts2-045漏洞简介影响范围环境搭建漏洞复现Struts2简介 Apache Struts是美国阿帕奇&a…