Collection集合类

单列集合类体系:

Collection是单列集合的根接口,有两个重要的接口,分别是:

java.util.List:List接口的特点是元素有序,元素可重复

  • List接口的主要实现类是
  1. ArrayList:实现类,查询快,增删慢,底层是数组
  2. LinkedList:实现类,查询慢,增删快,底层是集合

java.util.Set:Set接口的特点是元素不可重复,元素无索引

  • Set接口的主要实现类是
  1. HashSet:存取无序
  2. LingkedHashSet:存取有序
  3. 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);

 

注意:

  1. 如果集合中没有元素可以迭代,那么使用next()就会报错
  2. 迭代完了还想迭代,那么必须重新创建新的迭代器对象
  3. 在进行迭代的过程中,如果添加或则删除元素,将无法继续迭代
  4. 当迭代完一个元素,将这个元素通过迭代器对象名调用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 put(K key, V value): 把指定的键与指定的值添加到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(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

通过键找值:先使用KeySet方法找到所有键,再用增强for,通过get方法找到值

键值对找键,值:通过entrySet方法找到所有键值对,再用增强for,通过getKey和getValue方法分别找到键和值

HashMap集合:(数组(查询快)+单行链表/红黑树)

HashMap:存储无序,不能存储重复值(使用的时候要重写hasCode和equals方法)

LinkHashMap集合:(哈希表+链表)

相比HashMap底层多了链表结构,使得它存储有序

TreeMep集合:(红黑树)

同样可以使用自然排序和比较器排序

  • 自然排序:直接使用TreeMap无参构造方法,默认升序
  • 比较器排序:使用TreeMap构造方法new  Comperator,第一个参数限制键的类型,第二个参数限制值得类型

 

posted @ 2020-09-15 21:01  化蛹  阅读(110)  评论(0编辑  收藏  举报