集合


集合概述

集合是 java 中提供的一种容器,可以用来存储多个数据

  • 数组的长度是固定的,集合的长度是可变的

  • 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

集合框架

集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map

  • Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.Listjava.util.Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有java.util.ArrayListjava.util.LinkedList,Set 接口的主要实现类有java.util.HashSetjava.util.TreeSet
  • Map

Collection 集合

java.util.Collection接口

所有单列集合(List、Set)的最顶层的接口,里面定义了所有单列集合共性的方法,任意的单列集合都可以使用 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 接口

java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对
象称为 List 集合。在 List 集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过
索引来访问集合中的指定元素。另外,List 集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

  • 特点
  1. 有序的集合,存储元素和取出元素的顺序是一致的
  2. 有索引,包含了一些带索引的方法
  3. 集合中可以有重复的元素,通过元素的equals()方法,来比较是否为重复的元素
  • 常用方法
public void add(int index,E element) //将指定的元素,添加到该集合中的指定位置

public E get(int index) //返回集合中指定位置的元素

public E remove(int index) //移除列表中指定位置的元素,返回被移除的元素

public E set(int index,E element) //用指定元素替换集合中指定位置的元素,返回更新前的元素

public int size()  //返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界

ArrayList 集合

java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为
查询数据、遍历数据,所以 ArrayList 是最常用的集合。
许多程序员开发时非常随意地使用 ArrayList 完成任何需求,并不严谨,这种用法是不提倡的

  • 常用方法
public boolean add(E e) //将指定的元素添加到此集合的尾部。

public E remove(int index) //移除此集合中指定位置上的元素。返回被删除的元素。

public E get(int index) //返回此集合中指定位置上的元素。返回获取的元素。

public int size()  //返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界

LinkedList 集合

java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。

LinkedList 是一个双向链表

  • 常用方法
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) //将元素推入此列表所表示的堆栈。

public boolean isEmpty() //如果列表不包含元素,则返回true。

Set 接口

java.util.Set 接口和 java.util.List 接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方
法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比 Collection 接口更加严格了。与 List 接口不
同的是, Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。

tips:Set 集合取出元素的方式可以采用:迭代器、增强 for

  • 特点
    1. 不允许存储重复的元素
    2. 没有索引,没有带索引的方法,不能使用普通的 for 循环遍历

HashSet 集合

java.util.HashSetSet 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序
不一致)。 java.util.HashSet 底层的实现其实是一个 java.util.HashMap 支持.

  • 特点
    1. 不允许存储重复的元素
    2. 没有索引,没有带索引的方法
    3. 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
    4. 底层是一个哈希表结构(查询速度非常快)

LinkedHashSet 集合

在 HashSet 下面有一个子类 java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构。

  • 特点

    底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序

Collections 类

java.utils.Collections 是集合工具类,用来对集合进行操作。

  • 常用方法
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> ) //将集合中元素按照指定规则排序。

Comparable 接口

public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。

  • 使用前提

    被排序的集合里面存储的元素,必须实现Comparable接口,重写comparaTo()定义排序的规则

  • 排序规则

    this-参数 :升序

两个对象比较的结果有三种:大于,等于,小于。
如果要按照升序排序, 则 o1 小于 o2,返回(负数),相等返回 0,o1 大于 o2 返回(正数)

如果要按照降序排序 ,则 o1 小于 o2,返回(正数),相等返回 0,01 大于 02 返回(负数)

Comparator 接口

public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序

Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器

  • 排序规则
public int compare(String o1, String o2) //比较其两个参数的顺序。
     // o1 - o2 :升序

Comparable 和 Comparator 两个接口的区别

Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()方法
被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现
此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中
的键或有序集合中的元素,无需指定比较器。
Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort
Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set
有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

Map 集合

  • 特点

    1. Map 集合是一个双列集合,一格元素包含两个值(key,value)
    2. Map 集合中的元素,key 和 value 的数据类型可以相同,也可以不同
    3. Map 集合中的元素,key 是不允许重复的,value 是可以重复的
    4. Map 集合中的元素,key 和 value 是一一对应的
  • 常用方法

    public V put(K key, V value) // 把指定的键与指定的值添加到Map集合中。
    
    public V remove(Object key) // 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
    
    public V get(Object key) // 根据指定的键,在Map集合中获取对应的值。
    
    public Set<K> keySet() // 获取Map集合中所有的键,存储到Set集合中。
    
    public Set<Map.Entry<K,V>> entrySet() // 获取到Map集合中所有的键值对对象的集合(Set集合)。
  • 遍历 Map 的方法

    1. 键找值方式:即通过元素中的键,获取键所对应的值

      • 步骤:

        1. 获取 Map 中所有的键,由于键是唯一的,所以返回一个 Set 集合存储所有的键。 keyset()
        2. 遍历键的 Set 集合,得到每一个键。
        3. 根据键,获取键所对应的值。get(K key)
      • 演示:

        public class Test {
            public static void main(String[] args) {
                Map<String, Integer> map = new HashMap<>();
                map.put("张三", 168);
                map.put("李四", 165);
                map.put("王五", 178);
        
                Set<String> keySet = map.keySet();
                for (String string : keySet) {
                    Integer value = map.get(string);
                    System.out.println(value);
                }
            }
        }
    2. 键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

      • 步骤

        1. 使用Map集合中的方法entrySet(),把 Map 集合中多个Entry对象取出来,存储到一个Set集合中
        2. 遍历Set集合,获取每一个 Entry 对象
        3. 使用Entry对象中的方法getKey()getValue()获取键与值
        public class Test {
            public static void main(String[] args) {
                Map<String, Integer> map = new HashMap<>();
                map.put("张三", 168);
                map.put("李四", 165);
                map.put("王五", 178);
        
                Set<Map.Entry<String, Integer>> set = map.entrySet();
                for (Map.Entry<String,Integer> entry : set) {
                    System.out.println(entry.getKey() + ":" + entry.getValue());
                }
            }
        }

HashMap

java.util.HashMap<K,V> implements Map<K,V>

  • 特点:
    1. HashMap 集合底层是哈希表:查询速度特别快
      jdk1.8 之前:数组+单向链表
      jdk1.8 之后,数组+单向链表|红黑树(链表的长度超过 8):提高查询速度
    2. HashMap 集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致

LinkedHashMap

java.util.LinkedHashMap<K,V> extends HashMap<K,V>

  • 特点:
    1. LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
    2. LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的

文章作者: Wujiu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Wujiu !
  目录