• Java—集合概述(Collection/Map)


    集合简介

      在集合类之前,我们使用数组存储,数组既可以存储基本数据类型的值,也可以存储对象(对象的引用变量),但是集合只能存储对象。   Java集合类似于一种容器,将同类型的对象(实际为对象引用)存储在一起,就形成一个集合。之前的文章中,我们有介绍到,Java 5后增加了泛型,Java集合可以指定特定的对象类型。   Java集合类的基本接口是Collection接口和Map接口。该接口有两个基本方法:add()iterator()方法。

    public interface Collection<E> {
       boolean add(E element);
       Iterator<E> iterator();
       ...
    }
    

    其中,add()方法用于向集合添加元素,若添加元素时改变了集合,则返回true;反之,返回false。如该集合中已存在需要添加的元素,再次添加时,返回false。iterator()方法用于返回实现Iterator接口的对象,使用该迭代器对象依次访问集合的元素。

    集合体系

    Collection集合体系继承树

    在这里插入图片描述 Collection体系中,Set代表无序集合;List代表有序集合;Queue代表队列集合。

    Map集合体系继承树

    在这里插入图片描述 Map体系中,存储的是具有映射关系(key-value)的数据,Map中的key不可重复。

    集合分类

    • Set:无序、不可重复的集合;
    • List:有序、重复的集合;
    • Queue:队列集合;
    • Map:有映射关系的集合;

    Collection常用方法

    • boolean add(E e):向集合中添加一个元素,若集合改变了,则返回true;反之,返回false。
    • boolean addAll(Collection<? extends E> c):将集合c内的所有元素添加到指定集合中,若集合改变,则返回true;反之,返回false。
    • void clear():清楚集合内的所有元素,集合长度为0。
    • boolean remove(Object o):删除集合中指定元素o,当集合中包含一个或多个元素o时,只删除第一个符合的元素,并返回true。
    • boolean removeAll(Collection<?> c);:从本集合中删除集合c内的所有元素,等于求差集,若删除一个及以上的元素,就返回true。
    • boolean contains(Object o):判断集合内是否存在指定元素o,若存在,则返回true;反之,返回false。
    • boolean containsAll(Collection<?> c):判断集合内是否包含集合c里面的所有元素,若包含,则返回true;反之,返回false。
    • boolean isEmpty():判断集合是否为空,若为空,则返回true;反之,返回false。集合的长度为0,即为空。
    • Iterator iterator():返回一个Iterator对象,遍历集合元素。
    • int size():返回集合内的元素个数;
    • Object[] toArray():将集合转换为一个数组,所有的集合元素变为对应的数组元素。

    Lambda表达式遍历集合

       Java 8在Iterator接口中引入了Lambda表达式:forEach(Consumer<? super T> action),调用该方法去遍历集合元素时,集合元素传递给Consumer接口accept(T t)方法,而Consumer是函数式接口,所以这是一种函数式编程。 源码如下:

        default void forEach(Consumer<? super T> action) {
            Objects.requireNonNull(action);
            for (T t : this) {
                action.accept(t);
            }
        }
    

    其中retuireNonNull(T obj)是Object的方法,源码如下:

        public static <T> T requireNonNull(T obj) {
           if (obj == null)
               throw new NullPointerException();
           return obj;
       }
    

    实战示例

    public class DemoApplication {
    
       public static void main(String[] args) {
    
           Collection collection = new ArrayList();
           // 添加元素
           collection.add("add()方法");
           collection.add(1);
           collection.add(2.7);
           collection.add("value1");
           collection.add("value2");
    
           System.out.println("collection 集合元素为:" + collection);
           
           //lambda表达式遍历
           collection.forEach(c -> System.out.println("forEach: " + c.toString()));
    
           // 删除指定元素
           System.out.println("删除指定元素1:" + collection.remove(1));
           System.out.println("删除指定元素2:" + collection.remove(2));
    
           //判断是否包含指定元素
           System.out.println("是否包含2.7:" + collection.contains(2.7));
           System.out.println("是否包含2:" + collection.contains(2));
    
    
           //判断是否包含某个集合
           Collection valueSet = new HashSet();
           valueSet.add("value1");
           valueSet.add("value2");
           System.out.println("是否包含集合: " + collection.containsAll(valueSet));
    
           //求差集:去除另一个集合的所有元素
           collection.removeAll(valueSet);
           System.out.println("求差集后:" + collection);
    
           //清空集合元素
           collection.clear();
           System.out.println("清空集合后: " + collection);
    
           //集合长度
           System.out.println("集合长度: " + collection.size());
    
           //求交集:只保留另一个集合的元素
           valueSet.retainAll(collection);
           System.out.println("求交集: " + valueSet);
           }
    }
    

    运行结果:

    collection 集合元素为:[add()方法, 1, 2.7, value1, value2]
    forEach: add()方法
    forEach: 1
    forEach: 2.7
    forEach: value1
    forEach: value2
    删除指定元素1:true
    删除指定元素2:false
    是否包含2.7:true
    是否包含2:false
    是否包含集合: true
    求差集后:[add()方法, 2.7]
    清空集合后: []
    集合长度: 0
    求交集: []
    
    

    参考书籍 《疯狂Java》 《Java核心技术卷一》

  • 相关阅读:
    快速得到栈、队列的最大值
    原型与原型链
    人家跟你谈生意,你连份明码标价的菜单都拿不出来,有什么资格好撒气的?
    一个坑:java.sql.ResultSet.getInt==》the column value; if the value is SQL NULL, the value returned is 0
    static在实例Extends、Overload中理解
    JVM-ClassLoader(转)
    关于eclipse和javac编译结果不一致的问题的分析与解决 (转)
    蜗牛—JSP学习之JavaBean初识
    ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解
    关于64位Linux配置android开发环境出现 No such file or directory
  • 原文地址:https://www.cnblogs.com/Andya/p/12548619.html
Copyright © 2020-2023  润新知