PriorityQueue java.lang.Object |—java.util.AbstractCollection<E& |—|—java.util.AbstractQueue<E& |—|—|—java.util.PriorityQueue<E& public class PriorityQueue<E> extends AbstractQueue<E> implements Serializable 基于优先级堆的无界优先级队列。 优先级队列的元素根据它们的 Comparable 或在队列构造时提供的 Comparator 排序,具体取决于使用的构造函数。 优先级队列不允许空元素。 依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致 ClassCastException)。 此队列的头部是相对于指定排序的最小元素。 如果多个元素以最低值绑定,则头部是这些元素之一——绑定被任意打破。 队列检索操作 poll、remove、peek 和 element 访问队列头部的元素。 优先级队列是无界的,但具有控制用于存储队列元素的数组大小的内部容量。 它总是至少与队列大小一样大。 随着元素被添加到优先级队列中,其容量会自动增长。 增长政策的细节没有具体说明。 此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选方法。 方法 iterator() 中提供的 Iterator 不能保证以任何特定顺序遍历优先级队列的元素。 如果您需要有序遍历,请考虑使用 Arrays.sort(pq.toArray())。 请注意,此实现不同步。 如果任何线程修改队列,则多个线程不应同时访问 PriorityQueue 实例。 相反,请使用线程安全的 PriorityBlockingQueue 类。 实现说明:此实现为入队和出队方法(offer、poll、remove() 和 add)提供 O(log(n)) 时间; remove(Object) 和 contains(Object) 方法的线性时间; 检索方法(peek、元素和大小)的恒定时间。 此类是 Java 集合框架的成员。 构造函数摘要 构造函数 描述 PriorityQueue() 创建一个具有默认初始容量 (11) 的 PriorityQueue,根据它们的 Comparable 对其元素进行排序。 PriorityQueue(int initialCapacity) 创建一个具有指定初始容量的 PriorityQueue,根据它们的 Comparable 对其元素进行排序。 PriorityQueue(int initialCapacity, Comparator<? super E> comparator) 创建一个具有指定初始容量的 PriorityQueue,它根据指定的比较器对其元素进行排序。 PriorityQueue(Collection<? extends E> c) 创建一个包含指定集合中元素的 PriorityQueue。 PriorityQueue(Comparator<? super E> comparator) 创建一个具有默认初始容量的 PriorityQueue,其元素根据指定的比较器进行排序。 PriorityQueue(PriorityQueue<? extends E> c) 创建一个包含指定优先级队列中元素的 PriorityQueue。 PriorityQueue(SortedSet<? extends E> c) 创建一个包含指定排序集中元素的 PriorityQueue。 方法总结 修饰符和类型 方法 描述 boolean add(E e) 将指定元素插入此优先级队列。 void clear() 从此优先级队列中删除所有元素。 Comparator<? super E> comparator() 返回用于对该队列中的元素进行排序的比较器,如果此队列根据其元素的 Comparable 进行排序,则返回 null。 boolean contains(Object o) 如果此队列包含指定元素,则返回 true。 IteratorE iterator() 返回此队列中元素的迭代器。 boolean offer(E e) 将指定元素插入此优先级队列。 E peek() 检索但不删除此队列的头部,如果此队列为空,则返回 null。 E poll() 检索并删除此队列的头部,如果此队列为空,则返回 null。 boolean remove(Object o) 从此队列中移除指定元素的单个实例(如果存在)。 int size() 返回此集合中的元素数。 SpliteratorE spliterator() 在此队列中的元素上创建一个后期绑定和快速失败的拆分器。 Object[] toArray()...
Observable java.lang.Object |—java.util.Observable public class Observable extends Object 此类表示可观察对象,或模型视图范例中的“数据”。 它可以被子类化以表示应用程序想要观察的对象。 一个可观察对象可以有一个或多个观察者。 观察者可以是任何实现了 Observer 接口的对象。 在 observable 实例更改后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用其 update 方法将更改通知其所有观察者。 递送通知的顺序是未指定的。观察者类中提供的默认实现将按照观察者注册兴趣的顺序通知他们,但是子类可以改变这个顺序,不使用保证的顺序,在不同的线程上传递通知,或者可以保证他们的子类遵循这个顺序,这由他们选择。 请注意,这种通知机制与线程无关,与 Object 类的等待和通知机制完全分离。 当一个可观察对象被新创建时,它的观察者集合是空的。 当且仅当equals方法为他们返回true时,两个观察者被认为是相同的。 构造函数摘要 构造函数 描述 Observable() 构造一个具有零个观察者的 Observable。 方法总结 修饰符和类型 方法 描述 void addObserver(Observer o) 将一个观察者添加到该对象的观察者集合中,前提是它与集合中的某个观察者不同。 protected void clearChanged() 指示此对象不再更改,或者它已经通知所有观察者其最近的更改,因此 hasChanged 方法现在将返回 false。 int countObservers() 返回此 Observable 对象的观察者数量。 void deleteObserver(Observer o) 从该对象的观察者集中删除一个观察者。 void deleteObservers() 清除观察者列表,使该对象不再有任何观察者。 boolean hasChanged() 测试此对象是否已更改。 void notifyObservers() 如果该对象发生了变化,如 hasChanged 方法所示,则通知其所有观察者,然后调用 clearChanged 方法以指示该对象不再更改。 void notifyObservers(Object arg) 如果该对象发生了变化,如 hasChanged 方法所示,则通知其所有观察者,然后调用 clearChanged 方法以指示该对象不再更改。 protected void setChanged() 将此 Observable 对象标记为已更改; hasChanged 方法现在将返回 true。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 构造函数详细信息 Observable public Observable() 构造一个具有零个观察者的 Observable。 方法详情 addObserver public void addObserver(Observer o) 将一个观察者添加到该对象的观察者集合中,前提是它与集合中的某个观察者不同。 未指定将通知传递给多个观察者的顺序。 参数: 参数名称 参数描述 o 要添加的观察者。 Throws: Throw名称 Throw描述 NullPointerException 如果参数 o 为空。 deleteObserver public void deleteObserver(Observer o) 从该对象的观察者集中删除一个观察者。 将 null 传递给此方法将无效。 参数: 参数名称 参数描述 o 要删除的观察者。 notifyObservers public void notifyObservers() 如果该对象发生了变化,如 hasChanged 方法所示,则通知其所有观察者,然后调用 clearChanged 方法以指示该对象不再更改。 每个观察者都有它的更新方法,它使用两个参数调用:这个可观察对象和 null。 换句话说,这个方法等价于: notifyObservers(null)...
Objects java.lang.Object |—java.util.Objects public final class Objects extends Object 此类包含用于对对象进行操作的静态实用程序方法。 这些实用程序包括用于计算对象的哈希码、返回对象的字符串以及比较两个对象的空值安全或空值容忍方法。 方法总结 修饰符和类型 方法 描述 static <T> int compare(T a, T b, Comparator<? super T> c) 如果参数相同则返回 0,否则返回 c.compare(a, b)。 static boolean deepEquals(Object a, Object b) 如果参数彼此高度相等,则返回 true,否则返回 false。 static boolean equals(Object a, Object b) 如果参数彼此相等,则返回 true,否则返回 false。 static int hash(Object… values) 为一系列输入值生成哈希码。 static int hashCode(Object o) 返回非空参数的哈希码,空参数返回 0。 static boolean isNull(Object obj) 如果提供的引用为 null,则返回 true,否则返回 false。 static boolean nonNull(Object obj) 如果提供的引用为非 null,则返回 true,否则返回 false。 static <T> T requireNonNull(T obj) 检查指定的对象引用不为空。 static <T> T requireNonNull(T obj, String message) 检查指定的对象引用是否不为空,如果是则抛出自定义的 NullPointerException。 static <T> T requireNonNull(T obj, SupplierString messageSupplier) 检查指定的对象引用是否不为空,如果是则抛出自定义的 NullPointerException。 static String toString(Object o) 返回为非 null 参数调用 toString 和为 null 参数调用“null”的结果。 static String toString(Object o, String nullDefault) 如果第一个参数不为 null,则返回对第一个参数调用 toString 的结果,否则返回第二个参数。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 方法详情 equals public static boolean equals(Object a, Object b) 如果参数彼此相等,则返回 true,否则返回 false。 因此,如果两个参数都为 null,则返回 true,如果恰好一个参数为 null,则返回 false。 否则,相等性通过使用第一个参数的 Object#equals 方法来确定。 参数: 参数名称 参数描述 a 一个对象 b 一个要与 a 比较的对象以求相等 返回: 如果参数彼此相等,则为 true,否则为 false deepEquals public static boolean deepEquals(Object a, Object b) 如果参数彼此高度相等,则返回 true,否则返回 false。 两个空值非常相等。 如果两个参数都是数组,则使用 Arrays#deepEquals(Object[], Object[]) 中的算法来确定相等性。 否则,相等性通过使用第一个参数的 Object#equals 方法来确定。 参数: 参数名称 参数描述 a 一个对象 b 一个要与 a 进行比较的对象以实现深度相等 返回: 如果参数彼此高度相等,则为 true,否则为 false hashCode public static int...
LongSummaryStatistics java.lang.Object |—java.util.LongSummaryStatistics public class LongSummaryStatistics extends Object implements LongConsumer, IntConsumer 用于收集计数、最小值、最大值、总和和平均值等统计信息的状态对象。 此类设计用于(尽管不需要)流。 例如,您可以使用以下命令计算 long 流的汇总统计信息: LongSummaryStatistics stats = longStream.collect(LongSummaryStatistics::new, LongSummaryStatistics::accept, LongSummaryStatistics::combine); LongSummaryStatistics 可以用作流的 Stream.collect(Collector) reduction} 目标。 例如: LongSummaryStatistics stats = people.stream() .collect(Collectors.summarizingLong(Person::getAge)); 这可以一次性计算人数,以及他们年龄的最小值、最大值、总和和平均值。 构造函数摘要 构造函数 描述 LongSummaryStatistics() 构造一个具有零计数、零和、Long.MAX_VALUE 最小值、Long.MIN_VALUE 最大值和零平均值的空实例。 方法总结 修饰符和类型 方法 描述 void accept(int value) 将新的 int 值记录到摘要信息中。 void accept(long value) 在摘要信息中记录一个新的 long 值。 void combine(LongSummaryStatistics other) 将另一个 LongSummaryStatistics 的状态合并到这个中。 double getAverage() 返回记录值的算术平均值,如果没有记录值,则返回零。 long getCount() 返回记录的值的计数。 long getMax() 返回记录的最大值,如果没有记录值,则返回 Long.MIN_VALUE long getMin() 返回记录的最小值,如果没有记录任何值,则返回 Long.MAX_VALUE。 long getSum() 返回记录值的总和,如果没有记录值,则返回零。 String toString() 返回对象的字符串表示形式。 从接口 java.util.function.IntConsumer 继承的方法 andThen 从接口 java.util.function.LongConsumer 继承的方法 andThen 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait 构造函数详细信息 LongSummaryStatistics public LongSummaryStatistics() 构造一个具有零计数、零和、Long.MAX_VALUE 最小值、Long.MIN_VALUE 最大值和零平均值的空实例。 方法详情 accept public void accept(int value) 将新的 int 值记录到摘要信息中。 指定者: 在接口 IntConsumer 中接受 参数: 参数名称 参数描述 value 输入值 accept public void accept(long value) 在摘要信息中记录一个新的 long 值。 指定者: 在接口 LongConsumer 中接受 参数:...
Locale.LanguageRange java.lang.Object |—java.util.Locale.LanguageRange public static final class Locale.LanguageRange extends Object 此类表示 RFC 4647 语言标签匹配中定义的语言范围。 语言范围是一个标识符,用于通过使用区域设置匹配中描述的机制来选择满足特定要求的语言标签。 代表用户偏好并由语言范围组成的列表称为语言优先级列表。 有两种类型的语言范围:基本和扩展。 在 RFC 4647 中,语言范围的语法用 ABNF 表示如下: basic-language-range = (1*8ALPHA *("-" 1*8alphanum)) / "*" extended-language-range = (1*8ALPHA / "*") *("-" (1*8alphanum / "*")) alphanum = ALPHA / DIGIT 例如,“en”(英语)、“ja-JP”(日语、日本)、“”(匹配任何语言标签的特殊语言范围)是基本语言范围,而“-CH”(任何语言,瑞士)、 “es-”(西班牙语,任何地区)和“zh-Hant-”(繁体中文,任何地区)是扩展的语言范围。 字段摘要 修饰符喝类型 字段 描述 static double MAX_WEIGHT 保持权重最大值 1.0 的常数,表示语言范围非常适合用户。 static double MIN_WEIGHT 保持权重最小值 0.0 的常数,表示语言范围不适合用户。 构造函数摘要 构造函数 描述 LanguageRange(String range) 使用给定范围构造 LanguageRange。 LanguageRange(String range, double weight) 使用给定的范围和权重构造 LanguageRange。 方法总结 修饰符喝类型 方法 描述 boolean equals(Object obj) 将此对象与指定对象进行比较。 String getRange() 返回此 LanguageRange 的语言范围。 double getWeight() 返回此 LanguageRange 的权重。 int hashCode() 返回对象的哈希码值。 static ListLocale.LanguageRange mapEquivalents(ListLocale.LanguageRange priorityList, MapString,ListString map) 使用给定的 priorityList 和映射生成新的自定义语言优先级列表。 static ListLocale.LanguageRange parse(String ranges) 解析给定的范围以生成语言优先级列表。 static ListLocale.LanguageRange parse(String ranges, MapString,ListString map) 解析给定范围以生成语言优先级列表,然后使用给定映射自定义列表。 从类 java.lang.Object 继承的方法 clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait 字段详细信息 MAX_WEIGHT public static final double MAX_WEIGHT 保持权重最大值 1.0 的常数,表示语言范围非常适合用户。 MIN_WEIGHT public static final double MIN_WEIGHT 保持权重最小值 0.0 的常数,表示语言范围不适合用户。 构造函数详细信息 LanguageRange public LanguageRange(String range) 使用给定范围构造 LanguageRange。 请注意,在构建时不会针对 IANA...
Locale.Builder java.lang.Object |—java.util.Locale.Builder public static final class Locale.Builder extends Object Builder 用于根据 setter 配置的值构建 Locale 的实例。 与 Locale 构造函数不同,Builder 检查由 setter 配置的值是否满足 Locale 类定义的语法要求。 由 Builder 创建的 Locale 对象格式正确,可以转换为格式正确的 IETF BCP 47 语言标签而不会丢失信息。 注意:Locale 类不对变体提供任何语法限制,而 BCP 47 要求每个变体子标签为 5 到 8 个字母数字或单个数字后跟 3 个字母数字。 对于不满足此限制的变体,方法 setVariant 会引发 IllformedLocaleException。 如果需要支持这种变体,请使用 Locale 构造函数。 但是,请记住,以这种方式创建的 Locale 对象在转换为 BCP 47 语言标签时可能会丢失变体信息。 以下示例显示如何使用 Builder 创建 Locale 对象。 Locale aLocale = new Builder().setLanguage("sr").setScript("Latn").setRegion("RS").build(); 构建器可以重复使用; clear() 将所有字段重置为其默认值。 构造函数摘要 构造函数 描述 Builder() 构造一个空的 Builder。 方法总结 修饰符和类型 方法 描述 Locale.Builder addUnicodeLocaleAttribute(String attribute) 添加 unicode 语言环境属性,如果不存在,否则无效。 Locale build() 返回从此构建器上设置的字段创建的 Locale 实例。 Locale.Builder clear() 将构建器重置为其初始的空状态。 Locale.Builder clearExtensions() 将扩展重置为其初始的空状态。 Locale.Builder removeUnicodeLocaleAttribute(String attribute) 删除 unicode 语言环境属性(如果存在),否则无效。 Locale.Builder setExtension(char key, String value) 设置给定键的扩展名。 Locale.Builder setLanguage(String language) 设置语言。 Locale.Builder setLanguageTag(String languageTag) 重置 Builder 以匹配提供的 IETF BCP 47 语言标签。 Locale.Builder setLocale(Locale locale) 重置 Builder 以匹配提供的语言环境。 Locale.Builder setRegion(String region) 设置区域。 Locale.Builder setScript(String script) 设置脚本。 Locale.Builder setUnicodeLocaleKeyword(String key, String type) 设置给定键的 Unicode 语言环境关键字类型。 Locale.Builder setVariant(String variant) 设置变体。 从类 java.lang.Object...
ListResourceBundle java.lang.Object |—java.util.ResourceBundle |—|—java.util.ListResourceBundle public abstract class ListResourceBundle extends ResourceBundle ListResourceBundle 是 ResourceBundle 的抽象子类,它以方便且易于使用的列表管理区域设置的资源。 子类必须覆盖 getContents 并提供一个数组,其中数组中的每个项目都是一对对象。 每对的第一个元素是键,它必须是一个字符串,第二个元素是与该键关联的值。 以下示例显示了具有基本名称“MyResources”的资源束系列的两个成员。 “MyResources”是捆绑包系列的默认成员,“MyResources_fr”是法语成员。 这些成员基于 ListResourceBundle(相关示例显示了如何将捆绑添加到基于属性文件的该系列)。 此示例中的键采用“s1”等形式。实际的键完全取决于您的选择,只要它们与您在程序中用于从包中检索对象的键相同。 键是区分大小写的。 public class MyResources extends ListResourceBundle { protected Object[][] getContents() { return new Object[][] { // LOCALIZE THIS {"s1", "The disk \"{1}\" contains {0}."}, // MessageFormat pattern {"s2", "1"}, // location of {0} in pattern {"s3", "My Disk"}, // sample disk name {"s4", "no files"}, // first ChoiceFormat choice {"s5", "one file"}, // second ChoiceFormat choice {"s6", "{0,number} files"}, // third ChoiceFormat choice {"s7", "3 Mar 96"}, // sample date {"s8", new Dimension(1,5)} // real object, not just string // END OF MATERIAL TO LOCALIZE }; } } public class MyResources_fr extends ListResourceBundle { protected Object[][] getContents()...
LinkedList java.lang.Object |—java.util.AbstractCollection<E& |—|—java.util.AbstractList<E& |—|—|—java.util.AbstractSequentialList<E& |—|—|—|—java.util.LinkedList<E& public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable List 和 Deque 接口的双向链表实现。 实现所有可选列表操作,并允许所有元素(包括 null)。 所有操作都按照双向链表的预期执行。 索引到列表中的操作将从开头或结尾遍历列表,以更接近指定索引的为准。 请注意,此实现不同步。 如果多个线程同时访问一个链表,并且至少有一个线程在结构上修改了链表,则必须对外同步。 (结构修改是添加或删除一个或多个元素的任何操作;仅设置元素的值不是结构修改。)这通常是通过同步一些自然封装列表的对象来完成的。 如果不存在这样的对象,则应使用 Collections#synchronizedList 方法“wrapped”该列表。 这最好在创建时完成,以防止对列表的意外不同步访问: List list = Collections.synchronizedList(new LinkedList(...)); 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,除了通过迭代器自己的 remove 或 add 方法之外,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 此类是 Java 集合框架的成员。 字段摘要 从类 java.util.AbstractList 继承的字段 modCount 构造函数摘要 构造函数 描述 LinkedList() 构造一个空列表。 LinkedList(Collection<? extends E> c) 按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。 方法总结 修饰符和类型 方法 描述 void add(int index, E element) 在此列表中的指定位置插入指定元素。 boolean add(E e) 将指定元素附加到此列表的末尾。 boolean addAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入此列表,从指定位置开始。 boolean addAll(Collection<? extends E> c) 按照指定集合的迭代器返回的顺序,将指定集合中的所有元素附加到此列表的末尾。 void addFirst(E e) 在此列表的开头插入指定元素。 void addLast(E e) 将指定元素附加到此列表的末尾。 void clear() 从此列表中删除所有元素。 Object clone() 返回此 LinkedList 的浅表副本。 boolean contains(Object o) 如果此列表包含指定元素,则返回 true。 IteratorE descendingIterator() 以相反的顺序返回此双端队列中元素的迭代器。 E element() 检索但不删除此列表的头部(第一个元素)。 E get(int index) 返回此列表中指定位置的元素。 E getFirst() 返回此列表中的第一个元素。 E getLast() 返回此列表中的最后一个元素。 int indexOf(Object o) 返回此列表中指定元素第一次出现的索引,如果此列表不包含该元素,则返回 -1。 int lastIndexOf(Object o) 返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回 -1。 ListIteratorE listIterator(int index)...
LinkedHashSet java.lang.Object |—java.util.AbstractCollection<E& |—|—java.util.AbstractSet<E& |—|—|—java.util.HashSet<E& |—|—|—|—java.util.LinkedHashSet<E& public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, Serializable Set 接口的哈希表和链表实现,具有可预测的迭代顺序。 此实现与 HashSet 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。 该链表定义了迭代顺序,即元素插入集合的顺序(插入顺序)。 请注意,如果将元素重新插入集合中,则插入顺序不受影响。 (如果 s.add(e) 被调用,而 s.contains(e) 将在调用之前立即返回 true,则元素 e 被重新插入到集合 s 中。) 此实现使其客户免于 HashSet 提供的未指定、通常混乱的排序,而不会增加与 TreeSet 相关的成本。 它可用于生成与原始集合具有相同顺序的集合的副本,而不管原始集合的实现如何: void foo(Set s) { Set copy = new LinkedHashSet(s); ... } 如果模块在输入上获取一个集合,复制它,然后返回其顺序由复制的顺序确定的结果,则此技术特别有用。 (客户通常喜欢以与呈现相同的顺序返回物品。) 此类提供所有可选的 Set 操作,并允许 null 元素。 与 HashSet 一样,它为基本操作(添加、包含和删除)提供恒定时间性能,假设哈希函数在桶中正确地分散元素。 由于维护链表的额外费用,性能可能略低于 HashSet,但有一个例外:迭代 LinkedHashSet 所需的时间与集合的大小成正比,而不管其容量如何。 HashSet 的迭代可能会更昂贵,需要的时间与其容量成正比。 链接哈希集有两个影响其性能的参数:初始容量和负载因子。 它们的定义与 HashSet 一样。 但是请注意,对于此类而言,为初始容量选择过高值的惩罚不如 HashSet 严重,因为此类的迭代时间不受容量的影响。 请注意,此实现不同步。 如果多个线程同时访问一个链接的哈希集,并且至少有一个线程修改了该集,则它必须在外部同步。 这通常是通过在一些自然封装集合的对象上同步来完成的。 如果不存在这样的对象,则应使用 Collections#synchronizedSet 方法“wrapped”该集合。 这最好在创建时完成,以防止对集合的意外不同步访问: Set s = Collections.synchronizedSet(new LinkedHashSet(...)); 此类的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间修改集合,除了通过迭代器自己的 remove 方法之外,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 此类是 Java 集合框架的成员。 构造函数摘要 构造函数 描述 LinkedHashSet() 使用默认初始容量 (16) 和加载因子 (0.75) 构造一个新的空链接哈希集。 LinkedHashSet(int initialCapacity) 使用指定的初始容量和默认加载因子 (0.75) 构造一个新的空链接哈希集。 LinkedHashSet(int initialCapacity, float loadFactor) 使用指定的初始容量和负载因子构造一个新的空链接哈希集。 LinkedHashSet(Collection<? extends E> c) 使用与指定集合相同的元素构造一个新的链接哈希集。 方法总结 修饰符和类型 方法 描述 SpliteratorE spliterator() 在此集合中的元素上创建一个后期绑定和快速失败的拆分器。 从类 java.util.AbstractCollection 继承的方法 addAll, containsAll, retainAll, toArray, toArray, toString 从类 java.util.AbstractSet...
LinkedHashMap java.lang.Object |—java.util.AbstractMap<K,V& |—|—java.util.HashMap<K,V& |—|—|—java.util.LinkedHashMap<K,V& public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> Map 接口的哈希表和链表实现,具有可预测的迭代顺序。 此实现与 HashMap 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。 这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。 请注意,如果将键重新插入到 map 中,则插入顺序不会受到影响。 (如果在调用 m.containsKey(k) 将在调用之前立即返回 true 时调用 m.put(k, v),则将键 k 重新插入到映射 m 中。) 此实现使其客户免于 HashMap(和 Hashtable)提供的未指定的、通常混乱的排序,而不会增加与 TreeMap 相关的成本。 无论原始 map 的实现如何,它都可用于生成与原始地图具有相同顺序的 map 副本: void foo(Map m) { Map copy = new LinkedHashMap(m); ... } 如果模块在输入上获取映射,复制它,然后返回其顺序由副本确定的结果,则此技术特别有用。 (客户通常喜欢以与呈现相同的顺序返回物品。) 提供了一个特殊的构造函数来创建一个链接哈希映射,其迭代顺序是其条目最后一次访问的顺序,从最近最少访问到最近访问(访问顺序)。 这种映射非常适合构建 LRU 缓存。 调用 put、putIfAbsent、get、getOrDefault、compute、computeIfAbsent、computeIfPresent 或 merge 方法会导致对相应条目的访问(假设它在调用完成后存在)。 如果值被替换,replace 方法只会导致对条目的访问。 putAll 方法为指定映射中的每个映射生成一个条目访问,按照指定映射的条目集迭代器提供键值映射的顺序。 没有其他方法生成条目访问。 特别是,collection-views 上的操作不会影响 backing map 的迭代顺序。 可以重写 removeEldestEntry(java.util.Map.Entry) 方法,以在将新映射添加到映射时自动删除陈旧映射的策略。 此类提供所有可选的 Map 操作,并允许 null 元素。 与 HashMap 一样,它为基本操作(添加、包含和删除)提供恒定时间性能,假设哈希函数在桶中正确地分散元素。 由于维护链表的额外费用,性能可能略低于 HashMap,但有一个例外:迭代 LinkedHashMap 的集合视图所需的时间与映射的大小成正比,而不管其容量如何 . HashMap 的迭代可能更昂贵,需要的时间与其容量成正比。 链接哈希图有两个影响其性能的参数:初始容量和负载因子。 它们的定义与 HashMap 一样。 但是请注意,对于此类而言,为初始容量选择过高值的惩罚不如 HashMap 严重,因为此类的迭代时间不受容量的影响。 请注意,此实现不同步。 如果多个线程同时访问链接的哈希映射,并且至少有一个线程在结构上修改映射,则必须在外部同步。 这通常是通过同步一些自然封装 map 的对象来完成的。 如果不存在这样的对象,则应使用 Collections#synchronizedMap 方法“wrapped” map。 这最好在创建时完成,以防止对 map 的意外不同步访问: Map m = Collections.synchronizedMap(new LinkedHashMap(...)); 结构修改是添加或删除一个或多个映射的任何操作,或者在访问排序的链接哈希映射的情况下,影响迭代顺序。 在插入排序的链接哈希映射中,仅更改与映射中已包含的键关联的值不是结构修改。 在按访问顺序链接的哈希映射中,仅使用 get...