IntSummaryStatistics java.lang.Object |—java.util.IntSummaryStatistics public class IntSummaryStatistics extends Object implements IntConsumer 用于收集计数、最小值、最大值、总和和平均值等统计信息的状态对象。 此类设计用于(尽管不需要)流。 例如,您可以使用以下方法计算整数流的汇总统计信息: IntSummaryStatistics stats = intStream.collect(IntSummaryStatistics::new, IntSummaryStatistics::accept, IntSummaryStatistics::combine); IntSummaryStatistics 可用作流的缩减目标。 例如: IntSummaryStatistics stats = people.stream() .collect(Collectors.summarizingInt(Person::getDependents)); 这可以一次性计算人数,以及他们的家属人数的最小值、最大值、总和和平均值。 构造函数摘要 构造函数 描述 IntSummaryStatistics() 构造一个具有零计数、零和、Integer.MAX_VALUE 最小值、Integer.MIN_VALUE 最大值和零平均值的空实例。 方法总结 修饰符和类型 方法 描述 void accept(int value) 将新值记录到摘要信息中 void combine(IntSummaryStatistics other) 将另一个 IntSummaryStatistics 的状态合并到这个中。 double getAverage() 返回记录值的算术平均值,如果没有记录值,则返回零。 long getCount() 返回记录的值的计数。 int getMax() 返回记录的最大值,如果没有记录任何值,则返回 Integer.MIN_VALUE。 int getMin() 返回记录的最小值,如果没有记录任何值,则返回 Integer.MAX_VALUE。 long getSum() 返回记录值的总和,如果没有记录值,则返回零。 String toString() 返回对象的字符串表示形式。 从接口 java.util.function.IntConsumer 继承的方法 andThen 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait 构造函数详细信息 IntSummaryStatistics public IntSummaryStatistics() 构造一个具有零计数、零和、Integer.MAX_VALUE 最小值、Integer.MIN_VALUE 最大值和零平均值的空实例。 方法详情 accept public void accept(int value) 将新值记录到摘要信息中 指定者: 在接口 IntConsumer 中接受 参数: 参数名称 参数描述 value 输入值 combine public void combine(IntSummaryStatistics other) 将另一个 IntSummaryStatistics 的状态合并到这个中。 参数: 参数名称 参数描述 other 另一个 IntSummaryStatistics Throws: Throw名称 Throw描述 NullPointerException 如果 other 为空 getCount public final long getCount() 返回记录的值的计数。 返回: 值的计数 getSum public...
IdentityHashMap java.lang.Object |—java.util.AbstractMap<K,V& |—|—java.util.IdentityHashMap<K,V& public class IdentityHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Serializable, Cloneable 此类使用哈希表实现 Map 接口,在比较键(和值)时使用引用相等代替对象相等。 换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,两个键 k1 和 k2 才被认为相等。 (在正常的 Map 实现(如 HashMap)中,当且仅当 (k1==null ? k2==null : k1.equals(k2)) 时,才认为两个键 k1 和 k2 相等。) 这个类不是一个通用的 Map 实现! 虽然这个类实现了 Map 接口,但它故意违反了 Map 的一般合同,该合同要求在比较对象时使用 equals 方法。 此类仅在需要引用相等语义的极少数情况下使用。 此类的典型用途是保留拓扑的对象图转换,例如序列化或深度复制。 要执行这样的转换,程序必须维护一个“节点表”来跟踪所有已处理的对象引用。 节点表不能等同于不同的对象,即使它们碰巧相等。 此类的另一个典型用途是维护代理对象。 例如,调试工具可能希望为被调试程序中的每个对象维护一个代理对象。 此类提供所有可选的映射操作,并允许空值和空键。 此类不保证 map 的顺序; 特别是,它不保证订单会随着时间的推移保持不变。 此类为基本操作(get 和 put)提供恒定时间性能,假设系统身份哈希函数 (System#identityHashCode(Object)) 将元素正确地分散在桶中。 此类有一个调整参数(影响性能但不影响语义):预期的最大大小。此参数是映射预计持有的键值映射的最大数量。在内部,此参数用于确定最初包含哈希表的桶数。未指定预期的最大大小和桶数之间的精确关系。 如果映射的大小(键值映射的数量)充分超过预期的最大大小,则增加桶的数量。增加桶的数量(“重新散列”)可能相当昂贵,因此创建具有足够大的预期最大大小的身份散列映射是值得的。另一方面,对集合视图的迭代需要的时间与哈希表中的桶数成正比,因此如果您特别关心迭代性能或内存使用情况,则不要将预期的最大大小设置得太高。 请注意,此实现不同步。如果多个线程同时访问一个身份哈希图,并且至少有一个线程在结构上修改了该 map,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)这通常通过在自然封装映射的某个对象上同步来完成.如果不存在这样的对象,则应使用 Collections#synchronizedMap 方法 “wrapped” map。这最好在创建时完成,以防止对地图的意外不同步访问: Map m = Collections.synchronizedMap(new IdentityHashMap(...)); 由此类的所有“集合视图方法”返回的集合的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对映射进行结构修改,除了通过迭代器自己的删除之外的任何方式方法,迭代器将抛出 ConcurrentModificationException。因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。因此,编写一个依赖于这个异常的正确性的程序是错误的:故障快速迭代器应该只用于检测错误。 实施说明:这是一个简单的线性探针哈希表,如 Sedgewick 和 Knuth 的文本中所述。该数组交替保存键和值。 (与使用单独的数组相比,这对于大型表具有更好的局部性。)对于许多 JRE 实现和操作混合,此类将产生比 HashMap(使用链接而不是线性探测)更好的性能。 此类是 Java 集合框架的成员。 嵌套类摘要 从类 java.util.AbstractMap 继承的嵌套类/接口 AbstractMap.SimpleEntryK,V, AbstractMap.SimpleImmutableEntryK,V 从接口 java.util.Map 继承的嵌套类/接口 Map.EntryK,V 构造函数摘要 构造函数 描述 IdentityHashMap() 构造一个具有默认预期最大大小 (21) 的新的空身份哈希映射。 IdentityHashMap(int expectedMaxSize) 构造一个具有指定预期最大大小的新空映射。 IdentityHashMap(Map<? extends K,? extends V> m) 构造一个新的身份哈希映射,其中包含指定映射中的键值映射。 方法总结 修饰符和类型 方法 描述 void clear() 从此 map 中删除所有映射。...
Hashtable java.lang.Object |—java.util.Dictionary<K,V& |—|—java.util.Hashtable<K,V& public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable 这个类实现了一个哈希表,它将键映射到值。 任何非空对象都可以用作键或值。 要成功地从哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。 Hashtable 的实例有两个影响其性能的参数:初始容量和负载因子。 容量是哈希表中的桶数,初始容量只是哈希表创建时的容量。 注意哈希表是开放的:在“哈希冲突”的情况下,单个桶存储多个条目,必须按顺序搜索。 负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。 初始容量和负载因子参数只是实现的提示。 关于何时以及是否调用 rehash 方法的确切细节取决于实现。 通常,默认负载因子 (.75) 在时间和空间成本之间提供了良好的折衷。 较高的值会减少空间开销,但会增加查找条目的时间成本(这反映在大多数 Hashtable 操作中,包括 get 和 put)。 初始容量控制了浪费空间和需要重新哈希操作之间的权衡,这些操作非常耗时。 如果初始容量大于 Hashtable 将包含的最大条目数除以其负载因子,则不会发生重新哈希操作。 但是,将初始容量设置得太高会浪费空间。 如果要在 Hashtable 中创建许多条目,则创建具有足够大容量的条目可能比让它根据需要执行自动重新散列以增长表来更有效地插入条目。 此示例创建一个数字哈希表。 它使用数字的名称作为键: Hashtable<String, Integer> numbers = new Hashtable<String, Integer>(); numbers.put("one", 1); numbers.put("two", 2); numbers.put("three", 3); 要检索数字,请使用以下代码: Integer n = numbers.get("two"); if (n != null) { System.out.println("two = " + n); } 由此类的所有“集合视图方法”返回的集合的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对 Hashtable 进行结构修改,除了通过迭代器自己的删除之外的任何方式 方法,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 Hashtable 的键和元素方法返回的枚举不是快速失败的。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 从 Java 2 平台 v1.2 开始,该类被改进为实现 Map 接口,使其成为 Java Collections Framework 的成员。 与新的集合实现不同,Hashtable 是同步的。 如果不需要线程安全的实现,建议使用 HashMap 代替 Hashtable。 如果需要线程安全的高并发实现,那么建议使用 ConcurrentHashMap 代替 Hashtable。 嵌套类摘要 从接口 java.util.Map 继承的嵌套类/接口 Map.EntryK,V 构造函数摘要 构造函数 描述 Hashtable()...
HashSet java.lang.Object |—java.util.AbstractCollection<E& |—|—java.util.AbstractSet<E& |—|—|—java.util.HashSet<E& public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, Serializable 该类实现了由哈希表(实际上是 HashMap 实例)支持的 Set 接口。 它不保证集合的迭代顺序; 特别是,它不保证订单会随着时间的推移保持不变。 此类允许空元素。 此类为基本操作(添加、删除、包含和大小)提供恒定的时间性能,假设哈希函数将元素正确地分散在桶中。 迭代这个集合需要的时间与 HashSet 实例的大小(元素的数量)加上支持 HashMap 实例的“容量”(桶的数量)的总和成正比。 因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低),这一点非常重要。 请注意,此实现不同步。 如果多个线程同时访问一个哈希集,并且至少有一个线程修改了该集,则必须在外部进行同步。 这通常是通过在一些自然封装集合的对象上同步来完成的。 如果不存在这样的对象,则应使用 Collections#synchronizedSet 方法“包装”该集合。 这最好在创建时完成,以防止对集合的意外不同步访问: Set s = Collections.synchronizedSet(new HashSet(...)); 此类的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间修改了集合,除了通过迭代器自己的 remove 方法之外的任何方式,迭代器都会抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 此类是 Java 集合框架的成员。 构造函数摘要 构造函数 描述 HashSet() 构造一个新的空集; 支持的 HashMap 实例具有默认的初始容量 (16) 和加载因子 (0.75)。 HashSet(int initialCapacity) 构造一个新的空集; 支持 HashMap 实例具有指定的初始容量和默认加载因子 (0.75)。 HashSet(int initialCapacity, float loadFactor) 构造一个新的空集; 后备 HashMap 实例具有指定的初始容量和指定的负载因子。 HashSet(Collection<? extends E> c) 构造一个包含指定集合中元素的新集合。 方法总结 修饰符和类型 方法 描述 boolean add(E e) 如果指定的元素尚不存在,则将其添加到此集合中。 void clear() 从此集合中移除所有元素。 Object clone() 返回此 HashSet 实例的浅表副本:元素本身未被克隆。 boolean contains(Object o) 如果此集合包含指定的元素,则返回 true。 boolean isEmpty() 如果此集合不包含任何元素,则返回 true。 IteratorE iterator() 返回此集合中元素的迭代器。 boolean remove(Object o) 如果存在,则从此集合中删除指定的元素。 int size() 返回此集合中的元素数(其基数)。 SpliteratorE spliterator() 在此集合中的元素上创建一个后期绑定和快速失败的拆分器。 从类 java.util.AbstractCollection 继承的方法 addAll, containsAll, retainAll, toArray, toArray, toString 从类 java.util.AbstractSet 继承的方法 equals, hashCode, removeAll 从接口 java.util.Collection 继承的方法 parallelStream, removeIf, stream 从接口 java.lang.Iterable 继承的方法 forEach 从类 java.lang.Object 继承的方法 finalize, getClass, notify, notifyAll, wait, wait, wait 从接口 java.util.Set 继承的方法 addAll, containsAll, equals, hashCode, removeAll, retainAll, toArray, toArray 构造函数详细信息...
Dictionary java.lang.Object |—java.util.Dictionary<K,V& public abstract class Dictionary<K,V> extends Object Dictionary 类是任何类的抽象父类,例如 Hashtable,它将键映射到值。 每个键和每个值都是一个对象。 在任何一个 Dictionary 对象中,每个键最多与一个值相关联。 给定一个字典和一个键,可以查找相关的元素。 任何非空对象都可以用作键和值。 通常,此类的实现应使用 equals 方法来确定两个键是否相同。 注意:此类已过时。 新的实现应该实现 Map 接口,而不是扩展这个类。 构造函数摘要 构造函数 描述 Dictionary() 唯一的构造函数 方法总结 修饰符和类型 方法 描述 abstract EnumerationV elements() 返回此字典中值的枚举。 abstract V get(Object key) 返回此字典中键映射到的值。 abstract boolean isEmpty() 测试此字典是否没有将键映射到值。 abstract EnumerationK keys() 返回此字典中键的枚举。 abstract V put(K key, V value) 将指定的键映射到此字典中的指定值。 abstract V remove(Object key) 从此字典中删除键(及其对应的值)。 abstract int size() 返回此字典中的条目数(不同的键)。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 构造函数详细信息 Dictionary public Dictionary() 唯一的构造函数。 (用于子类构造函数的调用,通常是隐式的。) 方法详情 size public abstract int size() 返回此字典中的条目数(不同的键)。 返回: 此字典中的键数。 isEmpty public abstract boolean isEmpty() 测试此字典是否没有将键映射到值。 isEmpty 方法的一般约定是,当且仅当此字典不包含条目时,结果才为true。 返回: 如果此字典没有将键映射到值,则为 true; 否则为false。 keys public abstract EnumerationK keys() 返回此字典中键的枚举。 keys 方法的一般约定是返回一个 Enumeration 对象,该对象将生成该字典包含条目的所有键。 返回: 此字典中键的枚举。 elements public abstract EnumerationV elements() 返回此字典中值的枚举。 elements 方法的一般约定是返回一个 Enumeration ,它将生成该字典中条目中包含的所有元素。 返回: 此字典中的值的枚举。 get public abstract V get(Object key) 返回此字典中键映射到的值。 isEmpty 方法的一般约定是,如果此字典包含指定键的条目,则返回关联的值; 否则,返回...
DoubleSummaryStatistics java.lang.Object |—java.util.DoubleSummaryStatistics public class DoubleSummaryStatistics extends Object implements DoubleConsumer 用于收集计数、最小值、最大值、总和和平均值等统计信息的状态对象。 此类设计用于(尽管不需要)流。 例如,您可以使用以下方法计算双精度流的汇总统计信息: DoubleSummaryStatistics stats = doubleStream.collect(DoubleSummaryStatistics::new, DoubleSummaryStatistics::accept, DoubleSummaryStatistics::combine); DoubleSummaryStatistics 可用作流的缩减目标。 例如: DoubleSummaryStatistics stats = people.stream() .collect(Collectors.summarizingDouble(Person::getWeight)); 这会在一次通过中计算人数,以及他们的权重的最小值、最大值、总和和平均值。 构造函数摘要 构造函数 描述 DoubleSummaryStatistics() 构造一个具有零计数、零和、Double.POSITIVE_INFINITY 最小值、Double.NEGATIVE_INFINITY 最大值和零平均值的空实例。 方法总结 修饰符和类型 方法 描述 void accept(double value) 将另一个值记录到摘要信息中。 void combine(DoubleSummaryStatistics other) 将另一个 DoubleSummaryStatistics 的状态合并到这个中。 double getAverage() 返回记录值的算术平均值,如果没有记录值,则返回零。 long getCount() 返回记录的值的计数。 double getMax() 返回最大记录值,如果任何记录值为 NaN,则返回 Double.NaN;如果没有记录值,则返回 Double.NEGATIVE_INFINITY。 double getMin() 返回最小记录值,如果任何记录值为 NaN,则返回 Double.NaN;如果没有记录值,则返回 Double.POSITIVE_INFINITY。 double getSum() 返回记录值的总和,如果没有记录值,则返回零。 String toString() 返回对象的字符串表示形式。 从接口 java.util.function.DoubleConsumer 继承的方法 andThen 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait 构造函数详细信息 DoubleSummaryStatistics public DoubleSummaryStatistics() 构造一个具有零计数、零和、Double.POSITIVE_INFINITY 最小值、Double.NEGATIVE_INFINITY 最大值和零平均值的空实例。 方法详情 accept public void accept(double value) 将另一个值记录到摘要信息中。 指定者: 在接口 DoubleConsumer 中接受 参数: 参数名称 参数描述 value 输入值 combine public void combine(DoubleSummaryStatistics other) 将另一个 DoubleSummaryStatistics 的状态合并到这个中。 参数: 参数名称 参数描述 other 另一个 DoubleSummaryStatistics Throws: Throw名称 Throw描述 NullPointerException 如果其他为空 getCount public final long getCount() 返回记录的值的计数。 返回: 值的计数 getSum public...
EnumMap java.lang.Object |—java.util.AbstractMap<K,V& |—|—java.util.EnumMap<K,V& public class EnumMap<K extends Enum<K>,V> extends AbstractMap<K,V> implements Serializable, Cloneable 用于枚举类型键的专用 Map 实现。 枚举映射中的所有键都必须来自创建映射时显式或隐式指定的单个枚举类型。 枚举映射在内部表示为数组。 这种表示非常紧凑和高效。 枚举映射以其键的自然顺序(声明枚举常量的顺序)维护。这反映在集合视图(keySet()、entrySet() 和 values())返回的迭代器中。 集合视图返回的迭代器是弱一致的:它们永远不会抛出 ConcurrentModificationException 并且它们可能会或可能不会显示在迭代过程中对映射进行的任何修改的影响。 不允许使用空键。尝试插入空键将引发 NullPointerException。但是,尝试测试是否存在空键或删除空键将正常运行。允许空值。 像大多数集合实现一样,EnumMap 是不同步的。如果多个线程同时访问一个枚举映射,并且至少有一个线程修改了映射,则它应该在外部同步。这通常是通过同步一些自然封装枚举映射的对象来完成的。如果不存在这样的对象,则应使用 Collections#synchronizedMap 方法“包装”地图。这最好在创建时完成,以防止意外的不同步访问: Map<EnumKey, V> m = Collections.synchronizedMap(new EnumMap<EnumKey, V>(...)); 实施说明:所有基本操作都在恒定时间内执行。 它们很可能(尽管不能保证)比它们的 HashMap 对应物更快。 此类是 Java 集合框架的成员。 嵌套类摘要 从类 java.util.AbstractMap 继承的嵌套类/接口 AbstractMap.SimpleEntryK,V, AbstractMap.SimpleImmutableEntryK,V 从接口 java.util.Map 继承的嵌套类/接口 Map.EntryK,V 构造函数摘要 构造函数 描述 EnumMap(ClassK keyType) 创建具有指定键类型的空枚举映射。 EnumMap(EnumMap<K,? extends V> m) 创建一个与指定枚举映射具有相同键类型的枚举映射,最初包含相同的映射(如果有)。 EnumMap(Map<K,? extends V> m) 创建一个从指定映射初始化的枚举映射。 方法总结 修饰符和类型 方法 描述 void clear() 从此映射中删除所有映射。 EnumMapK,V clone() 返回此枚举映射的浅表副本。 boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true。 boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。 SetMap.EntryK,V entrySet() 返回此映射中包含的映射的 Set 视图。 boolean equals(Object o) 比较指定对象与此映射是否相等。 V get(Object key) 返回指定键映射到的值,如果此映射不包含该键的映射,则返回 null。 int hashCode() 返回此映射的哈希码值。 SetK keySet() 返回此映射中包含的键的 Set 视图。 V put(K key, V value) 将指定的值与此映射中的指定键相关联。 void putAll(Map<? extends K,? extends V> m) 将所有映射从指定映射复制到此映射。 V remove(Object key) 如果存在,则从此映射中删除此键的映射。 int size() 返回此映射中键值映射的数量。 CollectionV values() 返回此映射中包含的值的集合视图。 从类 java.util.AbstractMap 继承的方法 isEmpty, toString 从接口 java.util.Map 继承的方法 compute, computeIfAbsent, computeIfPresent, forEach, getOrDefault, merge, putIfAbsent, remove, replace, replace, replaceAll 从类 java.lang.Object...
HashMap java.lang.Object |—java.util.AbstractMap<K,V& |—|—java.util.HashMap<K,V& public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable Map 接口的基于哈希表的实现。 此实现提供所有可选的映射操作,并允许空值和空键。 (HashMap 类大致相当于 Hashtable,除了它是不同步的并且允许空值。)这个类不保证映射的顺序; 特别是,它不保证订单会随着时间的推移保持不变。 此实现为基本操作(get 和 put)提供恒定时间性能,假设哈希函数将元素正确地分散在桶中。 集合视图的迭代需要的时间与 HashMap 实例的“容量”(桶的数量)加上它的大小(键值映射的数量)成正比。 因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低),这一点非常重要。 HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。 容量是哈希表中的桶数,初始容量只是哈希表创建时的容量。 负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。 当哈希表中的条目数超过负载因子和当前容量的乘积时,对哈希表进行重新哈希(即重建内部数据结构),使哈希表具有大约两倍的桶数。 作为一般规则,默认负载因子 (.75) 在时间和空间成本之间提供了良好的折衷。 较高的值会减少空间开销,但会增加查找成本(反映在 HashMap 类的大多数操作中,包括 get 和 put)。 在设置其初始容量时,应考虑映射中的预期条目数及其负载因子,以尽量减少重新哈希操作的次数。 如果初始容量大于最大条目数除以负载因子,则不会发生重新哈希操作。 如果要在 HashMap 实例中存储许多映射,则创建具有足够大容量的映射将比让它根据需要执行自动重新散列以增长表来更有效地存储映射。 请注意,使用具有相同 hashCode() 的多个键是降低任何哈希表性能的可靠方法。 为了改善影响,当键是 Comparable 时,此类可以使用键之间的比较顺序来帮助打破平局。 请注意,此实现不同步。 如果多个线程同时访问一个哈希映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)这通常通过在自然封装映射的某个对象上同步来完成 . 如果不存在这样的对象,则应使用 Collections#synchronizedMap 方法“包装”地图。 这最好在创建时完成,以防止对地图的意外不同步访问: Map m = Collections.synchronizedMap(new HashMap(...)); 所有此类的“集合视图方法”返回的迭代器都是快速失败的:如果在创建迭代器后的任何时间对映射进行结构修改,除了通过迭代器自己的 remove 方法之外,迭代器将抛出 ConcurrentModificationException . 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 此类是 Java 集合框架的成员。 嵌套类摘要 从类 java.util.AbstractMap 继承的嵌套类/接口 AbstractMap.SimpleEntryK,V, AbstractMap.SimpleImmutableEntryK,V 从接口 java.util.Map 继承的嵌套类/接口 Map.EntryK,V 构造函数摘要 构造函数 描述 HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。 HashMap(int initialCapacity) 构造一个具有指定初始容量和默认加载因子 (0.75) 的空 HashMap。 HashMap(int initialCapacity, float loadFactor) 构造一个具有指定初始容量和负载因子的空 HashMap。 HashMap(Map<? extends K,? extends V> m) 构造一个与指定 Map 具有相同映射的新 HashMap。 方法总结 修饰符和类型 方法 描述 void clear() 从此 map 中删除所有映射。 Object clone() 返回此 HashMap 实例的浅表副本:键和值本身没有被克隆。 V compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为 null)。 V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 如果指定的键尚未与值关联(或映射为 null),则尝试使用给定的映射函数计算其值并将其输入到此映射中,除非为 null。 V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定键的值存在且非空,则尝试在给定键及其当前映射值的情况下计算新映射。 boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true。...
GregorianCalendar java.lang.Object |—java.util.Calendar |—|—java.util.GregorianCalendar public class GregorianCalendar extends Calendar GregorianCalendar 是 Calendar 的一个具体子类,并提供世界上大多数地方使用的标准日历系统。 GregorianCalendar 是一种混合日历,它同时支持儒略历和公历系统,并支持单个不连续性,默认情况下对应于公历制定时的公历日期(在某些国家/地区为 1582 年 10 月 15 日,在其他国家/地区较晚)。 调用者可以通过调用 setGregorianChange() 来更改切换日期。 从历史上看,在那些首先采用公历的国家中,1582 年 10 月 4 日(儒略历)随后是 1582 年 10 月 15 日(公历)。 这个日历正确地模拟了这一点。 在公历转换之前,GregorianCalendar 实现了儒略历。 公历和儒略历之间的唯一区别是闰年规则。 儒略历每四年指定闰年,而公历省略不能被 400 整除的世纪年。 GregorianCalendar 实现了预测的公历和儒略历。 也就是说,日期是通过无限期地向后和向前推断当前规则来计算的。 因此,GregorianCalendar 可用于所有年份以生成有意义且一致的结果。 然而,使用 GregorianCalendar 获得的日期仅在公元 4 年 3 月 1 日之后才具有历史准确度,当时采用了现代儒略历规则。 在此日期之前,闰年规则的应用不规律,而在公元前 45 年之前,儒略历甚至都不存在。 在公历制度制定之前,元旦是 3 月 25 日。为避免混淆,此日历始终使用 1 月 1 日。如果需要,可以手动调整公历转换之前的日期和 1 月 1 日之间的日期 和 3 月 24 日。 一年中的一周和一周年 为 Calendar#WEEK_OF_YEAR 字段计算的值范围为 1 到 53。日历年的第一周是从 Calendar#getFirstDayOfWeek() 开始的最早的 7 天时间段,其中至少包含该年的 Calendar#getMinimalDaysInFirstWeek() 天。 因此,它取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 和 1 月 1 日的星期几的值。一年的第 1 周和下一年的第 1 周(不包括)之间的周数从 2 到 52 或 53 年(儒略-格里高利过渡所涉及的年份除外)。 getFirstDayOfWeek() 和 getMinimalDaysInFirstWeek() 值在构造 GregorianCalendar 时使用与语言环境相关的资源进行初始化。当 getFirstDayOfWeek() 为 MONDAY 且 getMinimalDaysInFirstWeek() 为...
Formatter java.lang.Object |—java.util.Formatter public final class Formatter extends Object implements Closeable, Flushable printf 样式格式字符串的解释器。 此类提供对布局对齐和对齐、数字、字符串和日期/时间数据的通用格式以及特定于语言环境的输出的支持。 支持常见的 Java 类型,例如 byte、BigDecimal 和 Calendar。 通过 Formattable 接口为任意用户类型提供有限的格式定制。 格式化程序对于多线程访问不一定是安全的。 线程安全是可选的,并且是此类中方法的用户的责任。 Java 语言的格式化打印很大程度上受到 C 的 printf 的启发。 尽管格式字符串与 C 相似,但已进行了一些定制以适应 Java 语言并利用其某些特性。 此外,Java 格式比 C 更严格; 例如,如果转换与标志不兼容,则会引发异常。 在 C 中,不适用的标志会被默默地忽略。 因此,格式字符串旨在为 C 程序员识别,但不一定与 C 中的格式字符串完全兼容。 预期用法示例: StringBuilder sb = new StringBuilder(); // Send all output to the Appendable object sb Formatter formatter = new Formatter(sb, Locale.US); // Explicit argument indices may be used to re-order output. formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d") // -> " d c b a" // Optional locale as the first argument can be used to get // locale-specific formatting of numbers. The precision and width can be //...