相关文章

  1. 《集合 (一) ----- 集合的基本概念与Collection集合详解》
  2. 《集合 (二) ----- Map集合详解》

文章目录

  • 集合的基本概念
    • 一、集合的分类
    • 二、常用集合的继承结构图
  • Collection集合详解
    • 一、常用方法
    • 二、Collection集合及其子类通用的遍历方式——使用迭代器
  • 范型机制
  • Collection集合子接口之一 ----- List集合详解
    • 一、List集合基本概念
    • 二、List集合特有的方法
    • 三、ArrayList
    • 四、LinkedList
  • Collection集合子接口之一 ----- Set集合详解
    • 一、Set集合基本概念
    • 二、构造方法

集合的基本概念

一、集合的分类

在java中,集合分为两大类

  • 单个方式存储元素,这一类集合的超级父接口为:java.util.Collection
  • 以键值对的方式存储元素,这一类集合的超级父接口为:java.util.Map
二、常用集合的继承结构图
  1. Collection集合

  2. Map集合

Collection集合详解

一、常用方法
返回值 方法名 说明
boolean add(E e)
boolean remove(Object o)
boolean contains(Object o) 判断是否包含某个元素
int size() 返回集合中的元素个数
boolean isEmpty() 判空
void clear() 清空集合
Object[] toArray() 集合转为数组
Iterator iterator() 获取集合的迭代器

注意:

  1. 关于Collection集合中的contains(Object o)方法

    使用该方法时,其底层在比较元素时,会调用equals()方法,意味着比较的是集合中元素的内容而不是内存地址(前提是该元素的类重写了equals()方法),所以只要存储在集合中的元素的内容和要查找的元素的内容一致,则会判定为同一个元素,元素属于该集合。

  2. 关于Collection集合中的remove(Object o)方法

    使用该方法时,其底层在比较元素时,也会调用equals()方法,原理同上,只要传入的元素的内容和集合中元素的内容相等,那么就会判定为同一个元素,相应的元素就会被删除。

二、Collection集合及其子类通用的遍历方式——使用迭代器
  1. 前言
     由于Collection集合实现了Iterable接口,因此其所有子类集合都可使用迭代器来遍历。

  2. 迭代器Iterator类中的方法

    返回值 方法名及形参 说明
    boolean hasNext() 判断迭代器指针的前方是否有元素
    E next() 让迭代器指针前移一位,然后返回其指向的元素
    void remove() 移除迭代器指针指向的元素
  3. 测试

    Collection<String> c = new HashSet<>();
    c.add("123");
    c.add("456");
    c.add("789");Iterator<String> iterator = c.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());iterator.remove();
    }System.out.println(c.isEmpty());// true
  4. 注意:当集合结构改变(增、删元素)后,需要重新获取集合的迭代器对象,否则遍历时会报异常,但是使用迭代器的remove方法来删除元素时可以不用重新获取迭代器对象。

    
    Collection<String> c = new HashSet<>();c.add("123");
    c.add("456");
    c.add("789");Iterator<String> iterator = c.iterator();while (iterator.hasNext()) { iterator.next();iterator.remove();
    }/*
    /* 下列循环删除元素的方式会报错
    while (iterator.hasNext()) {c.remove(iterator.next());
    }
    */

范型机制

  1. 范型的优缺点
    (1) 以下代码不使用范型机制

    
    List list = new ArrayList();Cat c = new Cat();list.add(c);Iterator iterator = list.iterator();while(iterator.hasNext()) {Object o = iterator.next();if( o instanceof Cat) {((Cat) o).eat();}}static class Cat {public void eat() {System.out.println("猫吃鱼");}}

    (2) 以下代码使用范型机制

    
    List<Cat> list = new ArrayList<>();Cat c = new Cat();list.add(c);Iterator<Cat> iterator = list.iterator();while(iterator.hasNext()) {Cat cat = iterator.next();cat.eat()     }static class Cat {public void eat() {System.out.println("猫吃鱼");}}

    优点:集合中的元素变得统一,迭代器取出的元素不用再强制类型转换。
    缺点:集合中存储的元素缺乏多样性。

  2. 自定义范型

    
    Integer[] arr1 = {2,3,1,2,5,2};
    Double[] arr2 = {7.2,9.2,0.1,6.7};
    String[] arr3 = {"D","A","C"};new PrintArr<Integer>().print(arr1);
    new PrintArr<Double>().print(arr2);
    new PrintArr<String>().print(arr3);static class PrintArr<E> {public void print(E[] e) {System.out.println(Arrays.toString(e));}
    }
  3. foreach

    (1) 语法格式:for(元素类型 变量名 : 数组或集合的引用)

    (2) 说明:每次循环都会从数组或集合中取出一个元素,这个元素由冒号":"前的变量表示

    (3) 测试

       int[] arr = {3, 1, 7, 2, 10};LinkedList list = new LinkedList();list.add("ABC");list.add(123);list.add(321);// [3][1][7][2][10]for (int i : arr) {System.out.print("[" + i + "]");}// [ABC][123][321]for (Object o : list) {System.out.print("[" + o + "]");}

    (4) 注意:

    1. 我们不能在foreach中对集合进行元素的增删
    2. 若需要循环移除元素请使用Iterator中的remove()方法

Collection集合子接口之一 ----- List集合详解

一、List集合基本概念
  1. List集合的继承结构图

  2. List集合的特点

    (1) 元素按照什么顺序放进去,取出来也是这种顺序
    (2) 相同的元素可以重复存储
    (3) List集合中的元素有下标

  3. List集合的常用实现类

    (1) ArrayList:底层是数组,非线程安全。
    (2) LinkedList:底层是双向链表。
    (3) Vector:底层是数组,线性安全。

二、List集合特有的方法
返回值 函数名和形参 说明
void add(int index, E element) 指定下标添加元素,后面的元素往后移
E reomve(int index) 删除指定下标的元素,后面的元素往前移
E get(int index) 获取指定下标位置处的元素
E set(int index, E element) 修改指定下标的元素
int indexOf(Object o) 获取元素在列表中第一次出现的下标
int lastIndexOf(Object o) 获取元素在列表中最后一次出现下标
List subList(int from, int to) 截取子列表

因为List集合有下标,所以除了使用迭代器遍历,还可以使用下面方式遍历


List<String> list = new LinkedList<>();list.add("A");
list.add("B");
list.add("C");
list.add("D");for(int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}
三、ArrayList
  1. 构造方法

    构造方法 说明
    ArrayList() 默认初始化一个容量为10的列表
    ArrayList(int initialCapacity) 指定容量初始化列表
    ArrayList(Collection<? extends E> c) 用Collection集合初始化列表
  2. 优点:检索效率较高,向数组末尾添加元素效率很高

  3. 缺点:随机增删元素效率较低,无法存储大量数据

  4. 优化:因为ArrayList底层是数组,扩容时效率较低,所以建议在创建ArrayList对象时预估一个容量,也可以使用void trimToSize():修整当前列表的容量为size大小

四、LinkedList
  1. 构造方法

    构造方法 说明
    LinkedList() 初始化一个空列表
    LinkedList(Collection<? extends E> c) 用Collection集合初始化列表
  2. 实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。

    常用方法:

    返回值 函数名和形参 说明
    void addFirst(E e) 将指定元素插入此列表的开头
    void addLast(E e) 将指定元素添加到此列表的结尾
    E getFirst() 返回此列表的第一个元素(链表为空,抛出NoSuchElementException)
    E getLast() 返回此列表的最后一个元素
    E removeFirst() 移除并返回此列表的第一个元素
    E removeLast() 移除并返回此列表的最后一个元素
    E peekFirst() 获取但不移除此列表的第一个元素(链表为空,返回null)
    E pollFirst() 获取但不移除此列表的第一个元素(列表为空,返回 null)
  3. 优点:随机增删元素效率较高(链表增删元素不涉及到大量元素的位移)

  4. 缺点:查找效率较低(内存空间不是连续的)

Collection集合子接口之一 ----- Set集合详解

一、Set集合基本概念
  1. Set集合继承结构图

  2. Set集合特点
    (1) 元素按一定顺序放入集合,不一定会按原顺序取出
    (2) Set集合中的元素没有下标

  3. Set集合的子接口SortedSet集合的特点
    (1) 元素按一定顺序放入集合,不一定会按原顺序取出
    (2) Set集合中的元素没有下标
    (3) 存放到该集合中的元素会按照大小自动排序

  4. 实现类
    Set接口的实现类 ----- HashSet
     创建HashSet集合对象时,底层实际上new了一个HashMap对象,其key值用来存放HashSet的元素。

    SortedSet接口的实现类 ----- TreeSet
     创建TreeSet集合时,底层实际上new了一个TreeMap对象,其key值用来存放TreeSet的元素。

  5. 测试

    
    HashSet<Integer> set1 = new HashSet<>();
    // 存放元素:10 10 10 12 3
    set1.add(10);
    set1.add(10);
    set1.add(10);
    set1.add(12);
    set1.add(3);// 输出:3 10 12(无序)
    for (int i : set1) {System.out.print(i);
    }TreeSet<Integer> set2 = new TreeSet<>();
    // 存放元素:3 3 2 10 8
    set2.add(3);
    set2.add(3);
    set2.add(2);
    set2.add(10);
    set2.add(8);// 输出:2 3 8 10
    for (int i : set2) {System.out.print(i);
    }
二、构造方法

HashSet

构造方法 说明
HashSet() 创建一个默认容量为16,加载因子为0.75的集合对象
HashSet(Collection<? extends E> c) 用Collection集合初始化
HashSet(int initialCapacity) 设置指定容量初始化
HashSet(int initialCapacity, float loadFactor) 设置指定容量和加载因子初始化

TreeSet

构造方法 说明
TreeSet() 创建一个空集合
TreeSet(Collection<? extends E> c) 用Collection集合初始化
TreeSet(SortedSet<? extends E> c) 用SortedSet集合初始化
TreeSet(Comparator<? super E> comparator) 设置一个比较器来初始化集合

集合 (一) ----- 集合的基本概念与Collection集合详解相关推荐

  1. Laravel学习笔记汇总——Collection方法详解

    ## Laravel学习笔记汇总--Collection方法详解 本文参考:https:// laravel.com/docs/8.x/collections // 返回整个底层的数组 collect ...

  2. 2接口详解_java集合【2】——— Collection接口详解

    一.Collection接口简介 二.Collection源码分析 三.Collection的子类以及子类的实现 3.1 List extend Collection 3.2 Set extend C ...

  3. java中集合什么时候有索引,JavaSE中Collection集合框架學習筆記(1)——具有索引的List...

    前言:因為最近要重新找工作,Collection(集合)是面試中出現頻率非常高的基礎考察點,所以好好惡補了一番. 復習過程中深感之前的學習不系統,而且不能再像剛畢業那樣死背面試題,例如:String是 ...

  4. java集合框架的接口_Java集合框架之Collection接口详解

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  5. java集合Collection常用方法详解

    前言 出去面试的时候,对java的集合框架考察的知识点还是蛮多的.除了基础的集合常见API使用,对集合底层的实现原理以及数据结构等也有很多考察方面.而自己对这方面知之甚少,特地抽空进行研究和学习一下. ...

  6. Collection接口详解

    文章目录 前言 一.Collection接口是什么? 二.Collection接口提供的方法 1.boolean addAll(Collection<? super T> c, T... ...

  7. Java Collection接口详解

    Collection 接口是 List.Set 和 Queue 接口的父接口,通常情况下不被直接使用.Collection 接口定义了一些通用的方法,通过这些方法可以实现对集合的基本操作.定义的方法既 ...

  8. 矩概念与图像矩详解及其hu矩的运用

    一.矩概念详解 矩这个东西,能组成的名词太多了,矩形,就是长方形,矩阵,就是m行n列的二维数组,所以想了解矩,就要从其具体的场景中去理解. 今天我们要讲的图像矩,就是一个新的概念,图像矩就是图像的矩, ...

  9. JAVA集合框架之List HashSet去重及TreeSet排序详解

    无图言屌!先上图 说到List去重,很多人都知道用contains()方法,其实contains()方法依据的equals()方法,比较两个对象的引用是否相同,如果要List比较两个自定义定义对象是否 ...

最新文章

  1. Vista下硬盘管理
  2. Diango博客--14.使用 Django 项目中的 ORM 编写伪造测试数据脚本
  3. [OI学习笔记]最小生成树之Prim算法
  4. python new init_python的new与init
  5. 计算机信息管理是学什么课程设计,毕业论文计算机专业学生信息管理系统(数据库课程设计)...
  6. Windows操作系统的缘由
  7. 简单数据查询——单表无条件和有条件查询
  8. 指纹匹配算法matlab,指纹识别算法matlab程序
  9. 鼠标右键中新建选项消失
  10. win10右键没有新建选项,无法新建文件夹
  11. Bootstrap系列之面包屑导航(Breadcrumb)
  12. 2020年下半期第一次实训
  13. pyqt 事件更新图片显示_暗黑战神3D网游ARPG实战案例(Unity 2017.3)更新
  14. 开源文档协作套件CryptPad
  15. 我的理想作文400字计算机,我的理想作文400字5篇
  16. HDU - 1873
  17. 存储基础:LUN、ThickLUN与Thin LUN的联系和区别
  18. 【年度榜单】2020大数据产业创新服务产品丨数据猿·金猿榜
  19. 计算机没有音频驱动程序,电脑有驱动却没有高清晰音频管理器华硕主板应该装什么声卡驱动...
  20. Hi-End音箱真伪(3)-巴汉著文

热门文章

  1. 机智云产品、功能、服务一览表
  2. VxWorks 6.9 内核编程指导之读书笔记 -- VxWorks kernel application (一)
  3. CoreData之增删改查
  4. java 过滤器(参数传递中文乱码)
  5. JBoss3.0 下配置和部署EJB简介
  6. 几个 XmlTextReader 的例子, 帮了我大忙.
  7. 【重识 HTML + CSS】定位
  8. 【JavaScript 笔记】— 函数高级(变量作用域、解构赋值、方法、高阶函数、闭包、箭头函数、generator)
  9. notepad++行首行尾添加字符
  10. o3命令 linux,linux文本处理命令 一