Collection集合类
单列集合类体系:
Collection是单列集合的根接口,有两个重要的接口,分别是:
java.util.List:List接口的特点是元素有序,元素可重复
- List接口的主要实现类是
- ArrayList:实现类,查询快,增删慢,底层是数组
- LinkedList:实现类,查询慢,增删快,底层是集合
java.util.Set:Set接口的特点是元素不可重复,元素无索引
- Set接口的主要实现类是
- HashSet:存取无序
- LingkedHashSet:存取有序
- TreeSet:对元素进行排序
Callection常用的功能:
因为它是所有集合的父类,所以它的方法所有集合都可以使用
- boolean add(E e):把给定的对象添加到集合中
- void clear():清空集合中所有的元素
- boolean remove(E e):在集合中删除指定的对象
- boolean contains(Object obj):判断给定的对象在不在集合中
- boolean isEmpty():判断当前集合是否为空
- int size():返回集合中的元素个数
- Object[ ] toArray():把集合中的元素,存储到数组中
iterator迭代器:(接口)
主要用于遍历集合中的所有元素
迭代器的构造方法是泛型,所以所有的引用类型都可以使用
常用的方法有两个:
- boolean hasNext():如果下一个还有元素,那么返回true
- E next():返回迭代的下一个元素
使用方法:先进行hasNext()方法判断下一个话有没有元素,有的话就next()迭代
// 获取迭代器对象 Iterator<String> it = col.iterator(); // 循环判断集合中是否有元素可以迭代 while (it.hasNext()){ // 说明有元素可以迭代 String e = it.next(); System.out.println(e);
注意:
- 如果集合中没有元素可以迭代,那么使用next()就会报错
- 迭代完了还想迭代,那么必须重新创建新的迭代器对象
- 在进行迭代的过程中,如果添加或则删除元素,将无法继续迭代
- 当迭代完一个元素,将这个元素通过迭代器对象名调用remove方法,就可以删除该元素
增强for:
增强for循环是专门为了遍历数组和集合的,它的原理就是iterator迭代器
for(元素的数据类型 变量 : Collection集合or数组){ //写操作代码 }
泛型:
在使用集合的时候不写类型,那么存的时候啥都能存,但取得时候啥也不是,这就很尴尬了
什么时候使用泛型:如果一个类中,某个方法的参数类型或者返回值类型不确定的时候,可以把该方法定义为含有泛型的方法
所以我们在编译阶段直接对类型进行控制,定义存储泛型的数据
修饰符 class 类名<代表泛型的变量> { } 代表泛型的变量: 可以是任意字母 例如: T,E...
泛型是使用场景:
定义类:修饰符 class 类名<代表泛型的接口>{ }
定义方法:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ };
定义接口:修饰符 interface 接口名 <代表泛型的变量>{ };
- 如果实现类还是不确定,那么实现类也可以定义成泛型:
- public class 实现类名<代表泛型的变量> implements 接口名<代表泛型的接口>{ };
泛型通配符:
在不知道使用什么类型来接收的时候,可以使用?表示,这个时候只能接收数据,不可以往集合中存储数据
受限泛型:
上限:类型名称 <? extends 类> 对象名称。只能接收该类型及其子类
下限:类型名称 <? super 类> 对象名称。只能接收该类型及其父类
List接口
特点:
- 专门存储有序的集合,比如说存的是1,2,3那么在集合中存储的顺序也是1,2,3.
- 它是一个有索引值的集合,通过索引就可以精确的找到要操作的元素
- 可以存储重复的元素
子类:
ArrayList集合:数组结构存储,日常开发中多用于查询数据,遍历数据。
LinkedList集合:链表结构存储,方便元素tianjia、删除的集合
- `public void addFirst(E e)`:将指定元素插入此列表的开头。 - `public void addLast(E e)`:将指定元素添加到此列表的结尾。 - `public E getFirst()`:返回此列表的第一个元素。 - `public E getLast()`:返回此列表的最后一个元素。 - `public E removeFirst()`:移除并返回此列表的第一个元素。 - `public E removeLast()`:移除并返回此列表的最后一个元素。 - `public E pop()`:从此列表所表示的堆栈处弹出一个元素。 - `public void push(E e)`:将元素推入此列表所表示的堆栈。
Collections集合工具类的常用功能:
常用方法:
- 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>):将集合中的元素按照指定的规则排序
public static <T>void sort (List <T> list):
当我们需要改变默认顺序进行排序时,需要使用Comparator比较器:
- 第一步:创建一个类去实现Comparator接口
- 第二步:在该类中创建你要依据比较的成员变量(比如:年龄age)
- 第三步:重写compareTo方法(this表示前,参数表示后,前减后表示升序)
- 第四步:在main方法中调用该类,创建集合对象,添加数据,调用sort方法
public static <T> void sort(List <T> list,Comparator<? super T>):
将集合中元素按照指定规则排序-->按照年龄升序排序
Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // 指定排序规则 // 前减后 升序 // 后减前 降序 // 前: 第一个参数o1 后:第二个参数o2 return o2 - o1; } });
可变参数:
通过定义一个方法接收多个参数:参数的类型必须一致
格式:修饰符 返回值类型 方法名(参数类型。。。形参名){ }
需要注意的是:
- 一个方法只能有一个可变参数
- 如果方法中有多个阐述,可变参数要放在最后(因为系统会把参数从第一个位置开始放,如果第一个参数是可变的,那么后面其它的参数都会放到第一个类型中)
method3("itheima",10,20); public static void method3(String str,int... nums){ }
在Collections中的应用场景:
// 往list集合中添加批量元素 Collections.addAll(list,"2","A","K","Q","J","10","9","8","7","6","5","4","3");
Set接口:
特点:
- 元素无索引,元素不可重复(唯一性)
- HashSet集合:实现类--元素存取无序
- LinkedHashSet集合:实现类--元素存取有序
- TreeSet集合:--对元素进行排序
注意:
- set集合没有特殊的方法,都是使用Collection接口的方法
- set集合没有索引,只能通过增强for遍历
Set的实现类:
HashSet:哈希表存储
使用哈希表存储保证了元素的唯一性
HashSet的使用方法和Collection基本相同
使用HashSet集合存储自定义元素:
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己比较的方式,才能保证集合对象的唯一性。
- 在自定义的类中重写hashCode和equals方法
- 这样就不会因为集合的地址不一样而使得相同的数据被传入进HashSet中
LinkHashSet:哈希表加链表存储
LinkHashSet实现类和HashSet的区别在于底层增加了链表,这样使得LinkHashSet拥有了有序的属性(是存储有序,但是还是没有索引值,元素不可重复)
TreeSet集合:红黑树
特点:元素唯一,没有索引,使用元素的自然顺序进行排序,或者根据TreeSet提供的Comparator比较器进行排序
TreeSet<Integer> set2 = new TreeSet<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { /* 指定排序规则: 前减后 升序 后减前 降序 前:第一个参数 后:第二个参数 */ return o1 - o2; } });
Map集合:
特点:
- Map集合定义的是双列集合的规范
- Map集合存储元素是以键值对的形式存储的,每一个键值对都有键和值
- Map集合的键是唯一的,值是可以重复的,但是如果键重复就会被覆盖(班和任课老师)
- 根据键取值
Map的常用方法:
-
-
public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 -
public V get(Object key)
根据指定的键,在Map集合中获取对应的值。 -
public boolean containsKey(Object key)
:判断该集合中是否有此键 -
public Set<K> keySet()
: 获取Map集合中所有的键,存储到Set集合中。 -
public Set<Map.Entry<K,V>> entrySet()
通过键找值:先使用KeySet方法找到所有键,再用增强for,通过get方法找到值
键值对找键,值:通过entrySet方法找到所有键值对,再用增强for,通过getKey和getValue方法分别找到键和值
HashMap集合:(数组(查询快)+单行链表/红黑树)
HashMap:存储无序,不能存储重复值(使用的时候要重写hasCode和equals方法)
LinkHashMap集合:(哈希表+链表)
相比HashMap底层多了链表结构,使得它存储有序
TreeMep集合:(红黑树)
同样可以使用自然排序和比较器排序
- 自然排序:直接使用TreeMap无参构造方法,默认升序
- 比较器排序:使用TreeMap构造方法new Comperator,第一个参数限制键的类型,第二个参数限制值得类型