Java集合框架(十六):ArrayList 源码分析
1、ArrayList 简述Java ArrayList是List接口的可调整大小的数组实现,这意味着它以默认大小开始,并在将更多数据添加到数组列表时自动扩容。 除了实现List接口之外,此类还提供了一些方法来操作内部用于存储列表的数组的大小。
ArrayList不是线程安全的,多线程环境下可以考虑用 List list = Collections.synchronizedList(new ArrayList(…)); 函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。
ArrayList 的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。 因此,在并发修改的情况下,迭代器快速失败,而不是在未来的未确定时间冒任意,非确定性的风险。
2、ArrayList 类图
ArrayList 继承了 Abstrac ...
Java集合框架(十五):TreeSet 源码分析
1、TreeSet 简述🌂TreeSet是基于TreeMap作为存储的可排序、可去重的有序集合
🌂继承于AbstractSet,AbstractSet实现了equals和hashcode方法
🌂实现了NavigableSet接口,意味着它支持一系列的导航方法,比如查找与指定目标最匹配项
🌂实现了Cloneable接口,意味着它能被复制
🌂实现了java.io.Serializable接口,意味着它支持序列化
2、TreeSet源码分析
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable{ ...
Java集合框架(十四):LinkedHashSet 源码分析
1、LinkedHashSet 简述LinkedHashSet底层使用 LinkedHashMap 来保存所有元素,它继承自 HashSet,其所有的方法操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法
2、LinkedHashSet实现因为LinkedHashSet都是调用父类的方法,在此我们只介绍他的构造函数
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849public class LinkedHashSet<E> extends HashSet<E> implements Set<E>, Cloneable, java.io.Serializable { p ...
Java集合框架(十三):HashSet 源码分析
1、简述HashSet继承于AbstractSet,实现接口Set,内部使用HashMap来存储数据,数据存储在HashMap的key中,value只是同一个默认值,所以HashSet存储的值是不能重复的。
2、HashSet实现2、HashSet实现HashSet几乎实现了Set接口中的所有方法,在此我们不对每一个方法进行介绍,只介绍一部分重要方法和属性。首先我们看一下HashSet的构造方法,了解一下HashSet是如何构建的
1234567891011121314151617181920212223242526272829303132333435private transient HashMap<E,Object> map; // PRESENT则是用来虚拟一个假的value,作为Map的值 private static final Object PRESENT = new Object(); /** * 使用HashMap构造一个空的HashSet对象,初始容量为16,负载因子为0.75,相当于初始化一个空的HashMap对象 */ pu ...
Java集合框架(十二):SortedMap 源码分析
1、SortedMap 简述SortedMap 接口扩展了 Map 接口并提供了有序的Map实现,SortedMap 的排序方式有两种:根据键值的自然顺序排序和指定比较器(Comparator)排序。插入有序的 SortedMap 的所有元素都必须实现Comparable接口
所有通用的有序映射实现类都应该提供四个“标准”构造函数:🌂一个void(无参数)构造函数,它根据键的自然顺序创建一个空的有序映射。🌂具有Comparator类型的单个参数的构造函数,它创建根据指定的比较器排序的空的有序映射。🌂具有Map类型的单个参数的构造函数,它创建一个具有与其参数相同的 key-value 映射的新映射,并根据键的自然顺序进行排序。🌂具有SortedMap类型的单个参数的构造函数,它创建一个新的有序映射,其具有相同的 key-value 映射和与输入有序映射相同的顺序。
2、SortedMap 类图
🌂父接口:Map<K,V>
🌂所有已知子接口:ConcurrentNavigableMap<K,V>, NavigableMap<K,V>
🌂所有 ...
Java集合框架(十一):Map 源码分析
1、Map 简述java.util.Map 接口表示键和值之间的映射对象。Map接口不是Collection接口的子类型。因此它的行为与其他集合类型略有不同。Map接口取代了传统的 Dictionary类,它是一个完全抽象的类而不是接口。
Map 接口具有以下几个特征:
🌂Map提供了三个集合视图,键集,键值映射集和值集合。
🌂Map 不能包含重复的键,每个键最多可以映射一个值。一些实现允许null键和null值,如HashMap和LinkedHashMap,但有些实现不允许,比如:TreeMap。
🌂Map 的顺序取决于具体的实现,例如 TreeMap 和LinkedHashMap 保证了元素的顺序,而 HashMap 则没有。
🌂Map 使用 hashCode 和equals 方法来获取和存放操作。 所以可变类不适合Map键。 如果 hashCode 或 equals 的值在put之后发生变化,则在get操作中将无法获得正确的值。
🌂AbstractMap 类提供了 Map 接口的主要实现,大多数Map实现类扩展了 AbstractMap 类并实现了所需的方法。
🌂当访 ...
Java集合框架(十):Deque 源码分析
1、Deque 简述线性集合,支持两端插入和移除元素。名称deque是“双端队列(double ended queue)”的缩写,通常发音为“deck”。
大多数Deque实现对它们可能包含的元素数量没有固定限制,但是此接口支持容量限制的deques以及没有固定大小限制的deques。此接口定义了访问双端队列两端元素的方法,提供了插入,移除和检索元素的方法。这些方法中的每一种都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(null或false,具体取决于操作)。 后一种形式的插入操作专门设计用于容量限制的Deque实现, 在大多数实现中,插入操作不会失败。
上述中三种操作涉及十二种方法总结在下表中:
2、Deque 类图
🌂父接口: Collection, Iterable, Queue
🌂子接口: lockingDeque
🌂实现类: ArrayDeque, ConcurrentLinkedDeque, LinkedBlockingDeque, LinkedList
此接口扩展了Queue接口。 当deque用作队列时,会产生FIFO(先进先出)行为。元素在双端队 ...
Java集合框架(九):Queue 源码分析
1、Queue 简述1、Queue 简述队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
Java Queue是java.util包中提供的接口,并扩展了java.util.Collection接口。就像Java List一样,Java Queue是有序元素(或对象)的集合,但它以不同方式执行插入和删除操作。 在处理这些元素之前,我们可以使用Queue存储元素。
🌂java.util.Queue接口是java.util.Collection接口的子类型。
🌂就像现实世界的排队(例如,在银行或ATM中)一样,Queue在队列的末尾插入元素并从队列的开头删除元素。
🌂Java Queue遵循FIFO顺序来插入和删除它的元素。 FIFO代表先入先出。
🌂Java Queue支持Collection接口的所有方法。
🌂最常用的Queue实现是LinkedList,ArrayBlockingQueue和PriorityQueue。
🌂Bloc ...
Java集合框架(八):List 源码分析
1、List 简述Java.util.List 是 Collection 的子接口。它是一个有序集合,可以存储重复的值。由于List保留可插入元素的位置的控制,因此它可以按索引访问元素,也可以搜索列表中的元素。
关于Java List的一些重要特点有:🌂Java List 接口是 Java Collections Framework 的成员。🌂List 允许添加重复元素。🌂List允许拥有’null’元素。🌂List接口在Java 8中有许多默认方法,例如replaceAll,sort和spliterator。🌂列表索引从0开始,就像数组一样。🌂List支持泛型,我们应尽可能使用它。 将Generics与List一起使用将在运行时避免ClassCastException。
2、List 类图2、List 类图Java List接口扩展了 Collection 接口。 Collection 接口又扩展了 Iterable接口。一些最常用的 List 实现类有 ArrayList,LinkedList,Vector,Stack,CopyOnWriteArrayList。Abst ...
Java集合框架(七):SortedSet 源码分析
1、SortedSet 简述SortedSet 接口扩展了 Set 接口并提供了元素的排序功能。
插入到有序集中的所有元素必须实现Comparable接口(或者被指定的Comparator接受),并且所有这些元素必须是可相互比较的,比如:**e1.compareTo(e2)**(或 comparator.compare(e1, e2))对于有序集合中的任意元素 e1 和 e2 都不能抛出 ClassCastException。试图违反规则的方法或者构造方法,调用时会抛出 ClassCastException。
如果有序集合正确实现了 Set 接口,则有序集合所保持的顺序(无论是否明确提供了比较器)都必须保持相等一致性(相等一致性的定义请参阅 Comparable 接口或 Comparator 接口)。
这也是因为** Set 接口是按照 equals 操作定义的,但有序集合使用它的 compareTo** 或** compare** 方法对所有元素进行比较, 因此从有序集合的角度来看,此方法认为相等的两个元素就是相等的。即使顺序没有保持相等一致性,有序集合的行为仍然是良好的,只不过没有 ...