集合进阶
9.1 集合体系结构:
Collection,单列集合
- List,可重复(ArrayList、LinkedList)
- Set,不可重复(HashSet、TreeSet)
Map,双列集合(HashMap)
9.2 Collection:
单列集合的顶层接口,表示一组对象
不提供此接口的任何实现形式
常用方法:
- add:添加元素
- remove:移除指定元素
- clear:清空集合元素
- contains:判断某元素是否在集合中
- isEmpty:判断集合是否为空
- size:集合的长度,即集合的个数
Collection遍历:
Iterator:迭代器,集合的专用遍历方式
next(),返回迭代中的下一个元素
hasNext(),如果迭代具有更多元素,则返回true
集合使用步骤:
- 创建集合对象
- 添加元素
- 遍历集合:通过集合对象获取迭代器对象、通过迭代器hasNext判断是否有元素、通过next获取下一个元素内容
9.3 List:
List集合概述:List集合是有序集合,可以控制每个元素插入位置,与Set集合不同,列表通常允许重复元素
List集合特有方法:
- add(int index, E element),在集合指定位置插入指定元素
- remove(int index),根据索引删除元素,返回被删除元素
- set(int index, E element),修改指定位置元素,返回被修改元素
- get(int index),返回指定索引处元素
可以通过List具有index这一属性进行集合的遍历操作
ConcurrentModificationException(并发修改异常)
原因:迭代器遍历过程中,通过集合对象修改了集合中元素长度,造成迭代器获取元素中判断预期修改值和实际修改值不一致
解决方案:用for循环遍历,然后用集合对象做对应的操作即可
ListIterator(列表迭代器)
通过List集合的listIterator方法得到,是List集合特有的迭代器
允许程序沿任意方向遍历列表的迭代器,在迭代期间可以修改列表,获取列表中迭代器当前位置
- next、hasNext
- previous、hasPrevious
- add
增强for循环:简化数组和Collection集合的遍历
内部构造是一个Iterator迭代器,所以可能报并发修改异常
for(int i: arr){
System.out.println(i);
}
栈:后进先出
队列:先进先出
数组:查询快,增删慢 ==> ArrayList
链表:增删快,查询慢 ==> LinkedList
List集合常用子类:ArrayList、LinkedList
LinkedList集合特有功能:
- addFirst:在列表开头插入指定元素
- addLast:在列表最后插入指定元素
- getFirst:返回此列表第一个元素
- getLast:返回列表最后一个元素
- removeFirst:删除并返回第一个元素
- removeLast:删除并返回最后一个元素
9.4 Set:
不包含重复元素的集合
没有带索引的方法,不能使用普通for循环进行遍历
哈希值:JDK根据对象的地址或字符串或数字算出来的int类型数值
Object.hashCode,获取对象的哈希值
相同对象多次调用hashCode相同,不同对象hashCode不同
通过方法重写,可以实现不同对象的哈希值是相同的
HashSet:
-
底层数据结构是哈希表
-
对集合的迭代顺序不做任何保证(不保证元素的存储和读取顺序一致)
-
没有带索引的方法,不能使用普通for循环遍历
-
由于是Set集合,所以不包含重复元素的集合
保证set里面元素的唯一性,通过哈希值进行判断add(a)是否应该加入到set集合中
重写hashCode和equals方法可以实现相同的成员变量判断为同一对象
哈希表:数组加链表
基本组成是一个数组,数组中的每个位置都是一个链表,当哈希值对16取余冲突时添在后方
检查是否为相同元素,首先计算哈希值是否相同,若哈希值相同再比较插入对象值相同不
LinkedHashSet:
哈希表和链表实现的Set接口,具有可预测的迭代次序
不可存储重复的对象(由哈希表结构提供)
TreeSet:
-
元素有序,这个顺序不是存储和取出顺序,而是按照一定的规则进行排序,方法取决构造器
TreeSet():根据元素的自然排序进行排序
TreeSet(Comparator comparator):根据指定比较器进行排序
-
没有带索引的方法,不能使用普通for循环遍历
-
由于是Set集合,是不包含重复元素的集合
在TreeSet中添加自己定义的对象类型时,需要自己手动实现Comparable接口。其中要重写一个compareTo方法,当返回值为正时,按照输入顺序进行输出;当返回值为负时,按照输入的相反顺序进行输出;当返回值为0时,仅能保存一个输入,其他对象因为冲突都不能被写入集合中
@Override
public int compareTo(Student s) {
return (this.age - s.age) ? this.name.toCompare(s.name) : (this.age - s.age)
}
TreeSet中比较器方法的使用(Comparator)
TreeSet集合的带参构造方法,使用比较器排序对元素进行排序
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
9.5 泛型:
泛型概述:形参 - 实参
好处:运行时异常可在编译过程中查看,也避免了强制类型转换
泛型类:
class Generic<T> {
private T t;
public void setT(T t){
this.t = t;
}
public T getT(){
return t;
}
}
泛型方法
public <T> void show(T t){
System.out.println(t)
}
泛型接口
public interface Generic<T>{}
类型通配符
,类型通配符 ,类型通配符上限 ,类型通配符下限 可变参数 ```java public void show(int... num){} ``` 其中num是一个数组 如果一个方法有多个参数,包含可变参数,可变参数要放到最后 Arrays.asList:返回指定数组支持的固定大小列表,不能做增删操作,可以修改 List.of:返回包含任意数量元素的不可变列表,不能进行增删改操作 Set.of:返回包含任意数量元素的不可变集合,不能进行增删操作,没有修改方法,不能给重复值 **9.6 Map:** map概述:Map