祭出神图:
Collecttion:单列集合
单列集合根接口Collection
所有单列集合的最顶层的接口,里边定义了所有单列集合共性的方法
任意的单列集合都可以使用Collection接口中的方法
常用方法
public boolean add(E e): 把给定的对象添加到当前集合中 。
public void clear(): 清空集合中所有的元素。
public boolean remove(E e): 把给定的对象在当前集合中删除。
public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
public boolean isEmpty(): 判断当前集合是否为空。
public int size(): 返回集合中元素的个数。
public Object[] toArray(): 把集合中的元素,存储到数组中。
List接口 extends Collection接口
List接口特点:
-
它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
-
它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
-
集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
List常用方法
public void add(int index, E element)`: 将指定的元素,添加到该集合中的指定位置上。
public E get(int index)`:返回集合中指定位置的元素。
public E remove(int index)`: 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element)`:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
注意:
操作索引的时候,一定要防止索引越界异常
IndexOutOfBoundsException:索引越界异常,集合会报
ArrayIndexOutOfBoundsException:数组索引越界异常
StringIndexOutOfBoundsException:字符串索引越界异常
ArrayList extends List
java.util.ArrayList
集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList
是最常用的集合。
LinkedList extends List
LinkedList集合的特点:
1.底层是一个链表结构:查询慢,增删快
2.里边包含了大量操作首尾元素的方法
注意:使用LinkedList集合特有的方法,不能使用多态
LinkedList是一个双向链表
LinkedList集合也可以作为堆栈,队列的结构使用
LinkedList常用方法
public void addFirst(E e)`:将指定元素插入此列表的开头。
public void addLast(E e)`:将指定元素添加到此列表的结尾。
public void push(E e)`:将元素推入此列表所表示的堆栈。
public E getFirst()`:返回此列表的第一个元素。
public E getLast()`:返回此列表的最后一个元素。
public E removeFirst()`:移除并返回此列表的第一个元素。
public E removeLast()`:移除并返回此列表的最后一个元素。
public E pop()`:从此列表所表示的堆栈处弹出一个元素。
public boolean isEmpty()`:如果列表不包含元素,则返回true。
Set extends Collection
java.util.Set
接口和java.util.List
接口一样,同样继承自Collection
接口,它与Collection
接口中的方法基本一致,并没有对Collection
接口进行功能上的扩充,只是比Collection
接口更加严格了。与List
接口不同的是,Set
接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
tips:Set集合取出元素的方式可以采用:迭代器、增强for。
Set接口的特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
java.util.HashSet集合 implements Set接口
哈希表和链表实现了Set接口,具有可预测的迭代次序
HashSet集合
java.util.HashSet
是Set
接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。java.util.HashSet
底层的实现其实是一个java.util.HashMap
支持.
HashSet
是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于:hashCode
与equals
方法。
HashSet
中存放自定义类型元素时,需要重写对象中的hashCode
和equals
方法,建立自己的比较方式,才能保证HashSet
集合中的对象唯一.
HashSet
特点:
1.不允许存储重复的元素
2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4.底层是一个哈希表结构(查询的速度非常的快)
常用方法
public boolean add(E e)
将指定的元素添加到此集合(如果尚未存在)。
public void clear()
从此集合中删除所有元素。
public boolean contains(Object o)
如果此集合包含指定的元素,则返回 true 。
public boolean isEmpty()
如果此集合不包含元素,则返回 true 。
public Iterator<E> iterator()
返回此集合中元素的迭代器。
public boolean remove(Object o)
如果存在,则从该集合中删除指定的元素。
public int size()
返回此集合中的元素数(其基数)。
LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
该类提供了所有可选的Set
操作,并允许null元素。 像HashSet
,它提供了基本操作(add,contains和remove)稳定的性能
Map集合
Map
集合的特点:
1.Map
集合是一个双列集合,一个元素包含两个值(一个key
,一个value
)
2.Map
集合中的元素,key和value的数据类型可以相同,也可以不同
3.Map
集合中的元素,key是不允许重复的,value是可以重复的
4.Map
集合中的元素,key和value是一一对应
Collection 中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
Map 中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
Collection中的集合称为单列集合,Map中的集合称为双列集合。
需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
tips:Map
接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。
常用方法:
public V put(K key, V value)`: 把指定的键与指定的值添加到Map集合中。
public V remove(Object key)`: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
public V get(Object key)` 根据指定的键,在Map集合中获取对应的值。
boolean containsKey(Object key) ` 判断集合中是否包含指定的键。
public Set<K> keySet()`: 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet()`: 获取到Map集合中所有的键值对对象的集合(Set集合)。
tips:
使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;
若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
Map
集合的第一种遍历方式:通过键找值的方式
Map
集合中的方法:
Set<K> keySet()
返回此映射中包含的键的 Set 视图。
实现步骤:
1.使用Map
集合中的方法keySet()
,把Map
集合所有的key
取出来,存储到一个Set
集合中
2.遍历set
集合,获取Map
集合中的每一个key
3.通过Map
集合中的方法get(key)
,通过key
找到value
HashMap<k,v>集合 implements Map<k,v>接口
HashMap
集合的特点:
1.HashMap
集合底层是哈希表:查询的速度特别的快
JDK1.8之前:数组+单向链表
JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
2.hashMap
集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
HashMap存储自定义类型键值
Map集合保证key是唯一的:
作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
当给HashMap
中存放自定义对象时,如果自定义对象作为key
存在,这时要保证对象唯一,必须复写对象的hashCode
和equals
方法(如果忘记,请回顾HashSet
存放自定义对象)
LinkedHashMap<K,V> entends HashMap<K,V>
如果要保证map中存放的key和取出的顺序一致,可以使用java.util.LinkedHashMap
集合来存放
Map
接口的哈希表和链接列表实现,具有可预知的迭代顺序。
底层原理:哈希表+链表(记录元素的顺序)
LinkedHashMap
的特点:
1.LinkedHashMap
集合底层是哈希表+链表(保证迭代的顺序)
2.LinkedHashMap
集合是一个有序的集合,存储元素和取出元素的顺序是一致的
LinkedHashMap<K,V>:HashMap
下有个子类LinkedHashMap
,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()
方法、equals()
方法。
Entry键值对对象
Map集合遍历的第二种方式:使用Entry对象遍历
Map集合中的方法:
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。
实现步骤:
1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
2.遍历Set集合,获取每一个Entry对象
3.使用Entry对象中的方法getKey()和getValue()获取键与值
Map
中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map
中是一一对应关系,这一对对象又称做Map
中的一个Entry(项)
。Entry
将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map
集合时,就可以从每一个键值对(Entry
)对象中获取对应的键与对应的值。
public K getKey()`:获取Entry对象中的键。
public V getValue()`:获取Entry对象中的值。
public Set<Map.Entry<K,V>> entrySet()`: 获取到Map集合中所有的键值对对象的集合(Set集合)
Hashtable<K,V>集合 implements Map<K,V>接口
Hashtable:
底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMap:
底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
HashMap
集合(之前学的所有的集合):可以存储null值,null键
Hashtable
集合,不能存储null值,null键
Hashtable
和Vector
集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList
)取代了
Hashtable
的子类Properties
依然活跃在历史舞台
Properties
集合是一个唯一和IO流相结合的集合
迭代器Iterator
public Iterator iterator()`: 获取集合对应的迭代器,用来遍历集合中的元素的。
public E next()`:返回迭代的下一个元素。
pboolean hasNext() 如果仍有元素可以迭代,则返回 true。
判断集合中还有没有下一个元素,有就返回true,没有就返回false
Iterator
迭代器,是一个接口,我们无法直接使用,需要使用Iterator
接口的实现类对象,获取实现类的方式比较特殊
Collection
接口中有一个方法,叫iterator()
,这个方法返回的就是迭代器的实现类对象
Iterator<E> iterator()
返回在此 collection
的元素上进行迭代的迭代器。
迭代器的使用步骤(重点):
1.使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
3.使用Iterator接口中的方法next取出集合中的下一个元素
for-each循环
增强for循环:底层使用的也是迭代器,使用for循环的格式,简化了迭代器的书写
是JDK1.5之后出现的新特性
Collection<E>extends Iterable<E>:所有的单列集合都可以使用增强for
public interface Iterable<T>实现这个接口允许对象成为 "foreach" 语句的目标。
增强for循环:用来遍历集合和数组
格式:
for(集合/数组的数据类型 变量名: 集合名/数组名){
sout(变量名);
}
Collections
java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
public static void sort(List list):将集合中元素按照默认规则排序。
注意:
sort(List<T> list)使用前提
被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法compareTo定义排序的规则
Comparable接口的排序规则:
自己(this)-参数:升序
常用方法:
public static <T> boolean addAll(Collection<T> c, T... elements) `:往集合中添加一些元素。
public static void shuffle(List<?> list) 打乱顺序`:打乱集合顺序。
public static <T> void sort(List<T> list)`:将集合中元素按照默认规则排序。
public static <T> void sort(List<T> list,Comparator<? super T> )`:将集合中元素按照指定规则排序。
Comparator比较器
java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
Comparator和Comparable的区别
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
Comparator:相当于找一个第三方的裁判,比较两个
Comparator的排序规则:
o1-o2:升序