9.集合进阶

集合进阶

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,键和值,不能包含重复的键 hashmap采用put方法进行元素的添加,当键已经存在于哈希map中,会修改相应的值 map的基本功能: - put,添加元素 - remove,根据键删除键值对,结果会返回对应的值,未找到对应键会返回null - clear,移除所有键值对 - containsKey,判断集合中是否包含指定键 - containsValue,判断集合中是否包含指定值 - isEmpty,判断集合是否为空 - size,集合的长度,即集合中键值对个数 map集合的获取功能: - get,根据键获得值 - keySet,获取所有键的集合 - values,获取所有值的集合 - entrySet,返回键值对集合 map集合的遍历: - 使用keySet方法获得键的集合,然后get方法获得键对应的值,进行遍历 - entrySet方法,使用增强for得到每一个Map.Entry,然后使用getKey和getValue得到对应键和值 HashMap:输出结果是无序的 TreeMap:对其中的键进行了排序的 **9.7 Collections:** Collections与Collection不同,后者是单面集合的底层接口 sort,对列表进行排序 reverse,对列表元素进行翻转 shuffle,使用默认的随机源随机排列列表 ArrayList可以通过Collections实现对内部元素的排序,类似TreeSet结构,v>

9.集合进阶

上一篇:判断质数


下一篇:软件测试分类