数组的长度是固定的,用来存放基本数据类型
集合的长度是可变的,用来存放对象的引用
本文内容包括:
接口:Collection、List、Set、SortedSet、Map、Map.Entry<K,V>、SortedMap
类:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap
迭代器及相关接口(Iterable、Iterator)、比较器及相关接口(comparable、comparator)
图片来源在《深入浅出java程序设计》 朱颢东 张志峰等编著
上两张图中,虚线框表示接口,实线框表示类,抽象类用斜体表示,虚线表示实现接口,实线表示继承关系。
上两张图中将继承实现表示的很详细,下面的图更简单明了一点。
图片来源《java从入门到精通》明日学院 编著
还有就是这
public interface Collection<E> extends Iterable<E>
Collection接口继承了Iterable接口
接口Collection是集合层次结构的顶层接口,定义了集合、链表等所有属于集合的类都应该具有的通用方法,如添加、删除、遍历等,这些方法和功能都需要在其实现类中加以实现。接口Set只是简单地继承了Collection接口,其中并没有声明任何新的成员方法。SortedSet接口继承了Set接口,并增加了一些与排序有关的成员方法。接口List在继承 Collection接口的基础上,还增加了几个与顺序有关的成员方法。抽象类AbstractCollection、AbstractList、AbstractSet和AbstractSequentialList分别实现了部分接口或抽象类中的成员方法,以减轻子类需要实现接口或抽象类中所有成员方法的负担。
再来看看个接口、类的方法(若接口中的方法已在其父接口中出现过,子接口就不重复列出了)
============================================================================================
迭代器相关内容
Modifier and Type | Method and Description |
---|---|
default void | forEach(Consumer<? super T> action) 对 Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。 |
Iterator | iterator() 返回类型为 T元素的迭代器。 |
default Spliterator | spliterator() 在Iterable描述的元素上创建一个Iterable 。 |
实现了iterable接口的类可以支持for each循环,foreach是基于Iterator实现的
关于Iterable和Iterator可以去这看看 Java中的Iterable与Iterator详解
Modifier and Type | Method and Description |
---|---|
default void | forEachRemaining(Consumer<? super E> action) 对每个剩余元素执行给定的操作,直到所有元素都被处理或动作引发异常。 |
boolean | hasNext() 如果迭代具有更多元素,则返回 true 。 |
E | next() 返回迭代中的下一个元素。 |
default void | remove() 从底层集合中删除此迭代器返回的最后一个元素(可选操作)。 |
下面使用了三种方法遍历集合(对Iterable和iterator的运用):
public class demo1 {public static void main(String[] args) {A a1 = new A();A a2 = new A();A a3 = new A();List<A> l = new ArrayList<>();l.add(a1);l.add(a2);l.add(a3);// 1 foreach循环for (A a : l) {a.myPrint();}// 2 迭代器Iterator<A> it = l.iterator(); // 如果在这不加泛型<A>, 那么在使用it.next()前要强制类型转换一下()返回的默认为Object类型while(it.hasNext()){it.next().myPrint();}// 3 forEach()方法Consumer<A> action = new MyConsumer();l.forEach(action);}
}class A {private int a;public void myPrint() {System.out.println("hello");}
}class MyConsumer implements Consumer<A>{@Overridepublic void accept(A a) {a.myPrint();}
}
============================================================================================
Modifier and Type | Method and Description |
---|---|
boolean | add(E e) 确保此集合包含指定的元素(可选操作)。 |
boolean | addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合(可选操作)。 |
void | clear() 从此集合中删除所有元素(可选操作)。 |
boolean | contains(Object o) 如果此集合包含指定的元素,则返回 true 。 |
boolean | containsAll(Collection<?> c) 如果此集合包含指定 集合中的所有元素,则返回true。 |
boolean | equals(Object o) 将指定的对象与此集合进行比较以获得相等性。 |
int | hashCode() 返回此集合的哈希码值。 |
boolean | isEmpty() 如果此集合不包含元素,则返回 true 。 |
default Stream | parallelStream() 返回可能并行的 Stream与此集合作为其来源。 |
boolean | remove(Object o) 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。 |
boolean | removeAll(Collection<?> c) 删除指定集合中包含的所有此集合的元素(可选操作)。 |
default boolean | removeIf(Predicate<? super E> filter) 删除满足给定谓词的此集合的所有元素。 |
boolean | retainAll(Collection<?> c) 仅保留此集合中包含在指定集合中的元素(可选操作)。 |
int | size() 返回此集合中的元素数。 |
default Spliterator | spliterator() 创建一个Spliterator在这个集合中的元素。 |
default Stream | stream() 返回以此集合作为源的顺序 Stream 。 |
Object[] | toArray() 返回一个包含此集合中所有元素的数组。 |
T[] | toArray(T[] a) 返回包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。 |
有序集合(也称为序列)。用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。索引从0开始
允许重复的元素,允许元素e1和e2使得e1.equals(e2) ,并且如果它们允许空元素,它们通常允许多个空元素。
Modifier and Type | Method and Description |
---|---|
void | add(int index, E element) 将指定的元素插入此列表中的指定位置(可选操作)。 |
boolean | addAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到此列表中的指定位置(可选操作)。 |
E | get(int index) 返回此列表中指定位置的元素。 |
int | indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。 |
int | lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。 |
ListIterator | listIterator() 返回列表中的列表迭代器(按适当的顺序)。 |
ListIterator | listIterator(int index) 从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。 |
E | remove(int index) 删除该列表中指定位置的元素(可选操作)。 |
default void | replaceAll(UnaryOperator operator) 将该列表的每个元素替换为将该运算符应用于该元素的结果。 |
E | set(int index, E element) 用指定的元素(可选操作)替换此列表中指定位置的元素。 |
default void | sort(Comparator<? super E> c) 使用随附的 Comparator排序此列表。 |
List | subList(int fromIndex, int toIndex) 返回此列表中指定的 fromIndex (含)和 toIndex之间的部分。 |
ArrayList类的优点是实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的索引位置插入对象或删除对象的速度较慢,因为ArrayList实质上是使用数组来保存集合中的元素的,在增加和删除指定位置的元素时,虚拟机会创建新的数组,效率低,所以在对元素做大量的增删操作时不适合使用ArrayList集合。
Constructor and Description |
---|
ArrayList() 构造一个初始容量为10的空列表。 |
ArrayList(Collection<? extends E> c) 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。 |
ArrayList(int initialCapacity) 构造具有指定初始容量的空列表。 |
Modifier and Type | Method and Description |
---|---|
Object | clone() 返回此 ArrayList实例的浅拷贝。 |
void | ensureCapacity(int minCapacity) 如果需要,增加此 ArrayList实例的容量,以确保它可以至少保存最小容量参数指定的元素数。 |
void | trimToSize() 修改这个 ArrayList实例的容量是列表的当前大小。 |
在大量插入元素前,可以使用ensureCapacity()方法主动增加ArrayList对象的容量,减少容量递增式再分配的数量,从而提高插入效率。
删除元素时容量不会自动减小,可以使用trimToSize()方法。
LinkedList类采用链表结构保存对象,这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入、删除对象时,使用LinkedList类实现的List集合的效率较高;但对于随机访问集合中的对象,使用LinkedList类实现List集合的效率较低。
LinkedList是个双向链表
Constructor and Description |
---|
LinkedList() 构造一个空列表。 |
LinkedList(Collection<? extends E> c) 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。 |
技巧:实例化List接口对象时,建议优先使用ArrayList,只有在插入和删除操作特别频繁时,才使用LinkedList。
Set 就是数学领域的集合
不包含重复元素的集合。 更正式地,集合不包含一对元素e1和e2 ,使得e1.equals(e2)
HashSet集合允许保存null,TreeSet集合不能保存null
Set接口只是简单的继承了Collection接口,没有声明新的成员方法。
散列集。哈希表。散列表
此类实现Set接口,由哈希表(实际为HashMap实例)支持。 对集合的迭代次序不作任何保证。 这个类允许null元素。
HashSet是Set 接口的一个实现类,它不允许有重复元素。HashSet主要依据哈希算法直接将元素指定到一个地址上。当向HashSet集合中添加一个元素时,会调用equals方法来判断该位置是否有重复元素。判断是通过比较它们的HashCode来进行比较的。HashSet集合的常用方法都是重写了Set接口中的方法。
元素的排序很能和插入顺序不同
有子类LinkedHashSet
Constructor and Description |
---|
HashSet() 构造一个新的空集合; 背景HashMap实例具有默认初始容量(16)和负载因子(0.75)。 |
HashSet(Collection<? extends E> c) 构造一个包含指定集合中的元素的新集合。 |
HashSet(int initialCapacity) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。 |
HashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子。 |
TreeSet树集实现了SortedSet接口,先看一下SortedSet接口
提供排序操作,数据会根据元素值从小到大排列
插入到排序集中的所有元素必须实现Comparable接口(或被指定的比较器接受)。 所有这些元素都必须是可相互比较 :e1pareTo(e2)(或comparatorpare(e1, e2))
Modifier and Type | Method and Description |
---|---|
Comparator<? super E> | comparator() 返回用于对该集合中的元素进行排序的比较器,或null |
E | first() 返回此集合中当前的第一个(最低)元素。 |
E | last() 返回此集合中当前的最后(最高)元素。 |
SortedSet | headSet(E toElement) 返回该集合的部分的视图,其元素严格小于 toElement 。 |
SortedSet | tailSet(E fromElement) 返回此组件的元素大于或等于 fromElement的部分的视图。 |
SortedSet | subSet(E fromElement, E toElement) 返回该集合的部分的视图,其元素的范围为 fromElement (含),为 toElement ,独占。 |
============================================================================================
比较器相关内容
Modifier and Type | Method and Description |
---|---|
int | compareTo(T o) 将此对象与指定的对象进行比较以进行排序。 |
接口中两个的方法
Modifier and Type | Method and Description |
---|---|
int | compare(T o1, T o2) 比较其两个参数的顺序。 |
boolean | equals(Object obj) 指示某个其他对象是否等于此比较器。 |
equals方法:如果obj也是一个比较器,并且与此比较器有相同的排序,则返回true,否则返回false。
如果希望用树集或树图管理某类的对象,就要使该类实现Comparable接口或者重写一个比较器类实现Comparator接口并将比较器类的对象传给集合构造方法
不能比较的对象加入TreeSet或TreeMap中会报错 cannot be cast to java.lang.Comparable
两种解决方法(下面两个例子中的比较规则是,根据student的sno比较,具体方法是调用String类中的compareTo方法比较)
在重写对象的比较方法的同时有必要重写equals方法,使两种方法逻辑同步
// 法一: 实现Comparable接口,重写compareTo方法
package pc;import java.util.TreeSet;public class Student implements Comparable<Student>{private String sno;private String name;public Student(String sno, String name) {this.sno = sno;this.name = name;}// 重写compareTo方法@Overridepublic int compareTo(Student o) {return this.snopareTo(o.sno);}public static void main(String[] args) {Student s1 = new Student("201", "jack");Student s2 = new Student("202", "peter");TreeSet<Student> l = new TreeSet<>();l.add(s1);l.add(s2);}
}
// 法二: 重写比较类实现Comparator接口,并重写compare方法
package pc;import java.util.Comparator;
import java.util.TreeSet;public class Student2 {private String sno;private String name;public Student2(String sno, String name) {this.sno = sno;this.name = name;}public String getSno() {return sno;}public void setSno(String sno) {this.sno = sno;}public String getName() {return name;}public void setName(String name) {this.name = name;}public static void main(String[] args) {Student2 s1 = new Student2("201", "jack");Student2 s2 = new Student2("202", "peter");MyComparator myComparator = new MyComparator();TreeSet<Student2> l = new TreeSet<>(myComparator);l.add(s1);l.add(s2);}
}// 重写比较类实现Comparator接口,并重写compare方法
class MyComparator implements Comparator<Student2>{@Overridepublic int compare(Student2 o1, Student2 o2) {Sno()Sno()); }
}
============================================================================================
TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以制定排序规则,让集合按照我们想要的方式进行排序。
此集合不能保存null。
Constructor and Description |
---|
TreeSet() 构造一个新的,空的树组,根据其元素的自然排序进行排序。 |
TreeSet(Collection<? extends E> c) 构造一个包含指定集合中的元素的新树集,根据其元素的 自然排序进行排序 。 |
TreeSet(Comparator<? super E> comparator) 构造一个新的,空的树集,根据指定的比较器进行排序。 |
TreeSet(SortedSet s) 构造一个包含相同元素的新树,并使用与指定排序集相同的顺序。 |
Map没有继承Collection接口,也没有继承Iterable接口
存储元素是键值对, Interface Map<K,V> ,K可以比作数组的下标,V 比作值。
不能存在重复的key
Modifier and Type | Method and Description |
---|---|
void | clear() 从该地图中删除所有的映射(可选操作)。 |
default V | compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 尝试计算指定键的映射及其当前映射的值(如果没有当前映射, null )。 |
default V | computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 如果指定的键尚未与值相关联(或映射到 null ),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非 null 。 |
default V | computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定的密钥的值存在且非空,则尝试计算给定密钥及其当前映射值的新映射。 |
boolean | containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。 |
boolean | containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true 。 |
Set<Map.Entry<K,V>> | entrySet() 返回此地图中包含的映射的Set视图。 |
boolean | equals(Object o) 将指定的对象与此映射进行比较以获得相等性。 |
default void | forEach(BiConsumer<? super K,? super V> action) 对此映射中的每个条目执行给定的操作,直到所有条目都被处理或操作引发异常。 |
V | get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。 |
default V | getOrDefault(Object key, V defaultValue) 返回到指定键所映射的值,或 defaultValue如果此映射包含该键的映射。 |
int | hashCode() 返回此地图的哈希码值。 |
boolean | isEmpty() 如果此地图不包含键值映射,则返回 true 。 |
Set | keySet() 返回此地图中包含的键的Set视图。 |
default V | merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) 如果指定的键尚未与值相关联或与null相关联,则将其与给定的非空值相关联。 |
V | put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。 |
void | putAll(Map<? extends K,? extends V> m) 将指定地图的所有映射复制到此映射(可选操作)。 |
default V | putIfAbsent(K key, V value) 如果指定的键尚未与某个值相关联(或映射到 null )将其与给定值相关联并返回 null ,否则返回当前值。 |
V | remove(Object key) 如果存在(从可选的操作),从该地图中删除一个键的映射。 |
default boolean | remove(Object key, Object value) 仅当指定的密钥当前映射到指定的值时删除该条目。 |
default V | replace(K key, V value) 只有当目标映射到某个值时,才能替换指定键的条目。 |
default boolean | replace(K key, V oldValue, V newValue) 仅当当前映射到指定的值时,才能替换指定键的条目。 |
default void | replaceAll(BiFunction<? super K,? super V,? extends V> function) 将每个条目的值替换为对该条目调用给定函数的结果,直到所有条目都被处理或该函数抛出异常。 |
int | size() 返回此地图中键值映射的数量。 |
Collection | values() 返回此地图中包含的值的Collection视图。 |
Map.Entry<K,V>是entrySet()方法返回的类型
Modifier and Type | Method and Description |
---|---|
static <K extends Comparable<? super K>,V>Comparator<Map.Entry<K,V>> | comparingByKey() 返回一个比较器,按键自然顺序比较Map.Entry 。 |
static <K,V> Comparator<Map.Entry<K,V>> | comparingByKey(Comparator<? super K> cmp) 返回一个比较器,比较Map.Entry按键使用给定的Comparator 。 |
static <K,V extends Comparable<? super V>>Comparator<Map.Entry<K,V>> | comparingByValue() 返回一个比较器,比较Map.Entry的自然顺序值。 |
static <K,V> Comparator<Map.Entry<K,V>> | comparingByValue(Comparator<? super V> cmp) 返回一个比较器 ,使用给定的Comparator比较Map.Entry的值。 |
boolean | equals(Object o) 将指定的对象与此条目进行比较以获得相等性。 |
K | getKey() 返回与此条目相对应的键。 |
V | getValue() 返回与此条目相对应的值。 |
int | hashCode() 返回此映射条目的哈希码值。 |
V | setValue(V value) 用指定的值替换与该条目相对应的值(可选操作)。 |
// 对Map进行遍历
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : Set()) {System.out.println("Key = " + Key() + " Value = " + Value());
}
散列图。实际上是一个数组和链表的组合体。
允许存在空值和空键
还有个子类LInkedHashMap
Constructor and Description |
---|
HashMap() 构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。 |
HashMap(int initialCapacity) 构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。 |
HashMap(int initialCapacity, float loadFactor) 构造一个空的 HashMap具有指定的初始容量和负载因子。 |
HashMap(Map<? extends K,? extends V> m) 构造一个新的 HashMap与指定的相同的映射 Map 。 |
和SortedSet类似
Modifier and Type | Method and Description |
---|---|
Comparator<? super K> | comparator() 返回此map中的键的比较器,或null |
Set<Map.Entry<K,V>> | entrySet() 返回此map中包含的映射的Set视图。 |
K | firstKey() 返回此map中当前的第一个(最低)键。 |
SortedMap<K,V> | headMap(K toKey) 返回该map的部分密钥严格小于 toKey 。 |
Set | keySet() 返回此map中包含的键的Set视图。 |
K | lastKey() 返回当前在此map中的最后(最高)键。 |
SortedMap<K,V> | subMap(K fromKey, K toKey) 返回此map部分的视图,其关键字范围为 fromKey (含),不 toKey toKey。 |
SortedMap<K,V> | tailMap(K fromKey) 返回此map部分的视图,其键大于或等于 fromKey 。 |
Collection | values() 返回此map中包含的值的Collection视图。 |
实现了SortedMap接口,能够按照键的自然顺序进行排序,也可以自定义
不允许有空键
添加的TreeMap中的元素的key必须是可排序的
Constructor and Description |
---|
TreeMap() 使用其键的自然排序构造一个新的空树状图。 |
TreeMap(Comparator<? super K> comparator) 构造一个新的,空的树图,按照给定的比较器排序。 |
TreeMap(Map<? extends K,? extends V> m) 构造一个新的树状图,其中包含与给定map相同的映射,根据其键的 自然顺序进行排序 。 |
TreeMap(SortedMap<K,? extends V> m) 构造一个包含相同映射并使用与指定排序映射相同顺序的新树映射。 |
本文参考源码、jdk api文档、《深入浅出java程序设计》朱颢东 张志峰等编著、《java从入门到精通》明日学院 编著、《java程序设计与计算思维》 赵军 吴灿铭编著
本文发布于:2024-01-31 02:56:30,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170664099324833.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |