博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
集合(上)
阅读量:3900 次
发布时间:2019-05-23

本文共 5554 字,大约阅读时间需要 18 分钟。

1. 集合概述

1.1 集合的由来

  • 需要记录单个数据内容时,声明一个变量
  • 需要记录多个类型相同的数据内容时,声明一个数组
  • 需要记录多个类型不同的数据内容时,声明一个对象
  • 需要记录多个类型相同的对象时,声明一个对象数组
  • 需要记录多个类型不同的对象时,声明一个集合

简单的说,变量、数组、对象、集合,都可以看做是一个容器

1.2 集合的框架结构

  • Java集合框架的顶层是:java.util.Collection 集合,java.util.Map集合
    • Collection中:存储单个元素
    • Map中:存储价值对

在这里插入图片描述

  • 为什么说Collection结合、Map集合,明明是接口哒!我们说的集合,其实就是接口
    • 从语法上:称为接口
    • 从功能上:称为集合
  • 还有一个 Collections工具类,里面封装了大量操作集合的常用方法

2. Collection集合

2.1 基本概念

在这里插入图片描述

  • java.util.Collection 接口,是 List接口Queue接口Set接口的父接口。所以,父类接口中定义的方法,通用于 list集合、Queue集合、Set集合

  • 说到接口,就会想到多态

    接口类型的引用指向了实现类对象

    Collection
    st = new ArrayList
    ();

    回顾,匿名内部类:接口类型的引用指向了,匿名实现类

    // A 是一个接口 A a = new A(){
    @Override public void show(){
    System.out.println("这是接口的实现类!不过是匿名"); } };

2.2 Collection接口中的常用方法

方法声明 功能介绍
boolean add(E e); 向集合中添加元素
boolean addAll( Collection<? extends E> c); 将集合c 中的元素,全部添加到当前的集合中
boolean contains(Object o); 判断是否包含指定对象
boolean containsAll(Collection<? extends E> c); 在当前集合中,判断是否包含了集合c中的所有元素对象
boolean retainAll(Collection<? extends E> c); 在当前集合中,保留集合c中的所有元素对象
boolean remove(Object o); 在当前集合中,删除指定的元素
boolean removeAll(Collection<? extends E> c); 在当前集合中,删集合c中包含的所有元素对象
void clear(); 在当前集合中,删除所有的元素
int size() 返回集合中的元素对象个数
boolean isEmpty(); 判断集合是否为空
boolean equals(Object o); 判断这两个集合是否相等
int hashCode(); 获取当前集合的哈希值
Object[] toArray(); 将集合转换为对象数组
Iterator iterator(); 获取当前集合的迭代器对象

注意:

集合和 字符串数组的转换:

// 字符串数组 ---> 集合String[] str = {
"123", "wq", "dsa"};List
list = Arrays.asList(str);// 集合 ---> 字符串数组Object[] array = list.toArray();

3. Iterator接口

3.1 基本概念

  • java.util.Iterator 接口,主要用于描述迭代器对象,可以用来遍历Collection集合中的所有元素
  • java.util.Collection 接口,继承至Iterator接口,所以Collection的实现类都能够使用迭代器对象

3.2 Iterator接口中的常用方法

方法声明 功能介绍
boolean hasNext(); 判断集下一个位置是否有元素
E next(); 取出一个元素,并指向下一个元素
void remove() 用于删除访问到的最后一个元素( next方法获得的元素 )

举例:

Iterator
it = collection.iterator();while(it.hasNext()){
String s = it.next(); if("汪星人".equals(s)){
it.remove(); }}

3.3 迭代器实现原理

  • 获取迭代器对象,可以看成获取指针

在这里插入图片描述

在创建迭代器对象后(调用next方法之前),迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,

当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

总结:

  • next方法的作用:将索引后移,并且将指向的元素返回
  • hasNext:将索引后移,若指向的下一个元素位null,则返回false,反之返回true

3.4 用迭代器实现 toString的效果

Collection
list = new ArrayList
();list.add("悟空");list.add("八戒");list.add("悟能");// 使用StringBuilder,来拼接结果StringBuilder sb = new StringBuilder();// 获得迭代器对象,所谓的指针,指向null(第一个元素前)Iterator
iterator = list.iterator();// 不知道遍历多少次,用while// 迭代器对象调用hasNext(),来判断指针指向的下一个索引是否有元素sb.append("[");while (iterator.hasNext()) {
// 迭代器对象调用next(),指针移向下一个元素,并且将其返回 String element = iterator.next(); if (!iterator.hasNext()) {
// 满足条件,则为最后一个元素 sb.append(element).append("]"); } else {
// 不是最后一个元素,进行", "的拼接 sb.append(element).append(", "); }}System.out.println("最终效果为:" + sb);

运行结果:

在这里插入图片描述

实现了,list集合直接 toString 进行打印的效果

3.5 迭代过程中删除元素

1)使用迭代器对象删除

Collection
list = new ArrayList
();list.add(1);list.add(2);list.add(3);/*------ 迭代中删除元素2 ——————*/// 获取迭代器Iterator
ite = list.iterator();while (ite.hasNext()) {
Integer element = ite.next(); if (2 == element) {
// 删除指针指向的元素 (就是next方法获取的元素) ite.remove(); }}System.out.println(list);

2)迭代中,使用集合中的方法删除

会报错,并发修改异常:ConcurrentModificationException

就是指,Collection在迭代的过程中,不允许有其他线程来修改它。不然,迭代的结果是不正确的

3.6 增强for循环,foreach

增强for循环,本质上也是一个迭代器的简化版


4. List集合

4 .1 基本概念

  • java.util.List接口,是Collection集合的子接口。该集合允许重复的元素有序排列

  • 主要实现类有:

    • ArrayList
    • LinkedList
    • Vector
  • ArrayList:底层采用了动态数组进行数据管理,支持索引访问元素,增删不便

  • LinkedList:底层采用双向链表进行数据管理,访问不便,增删方便

  • ArrayList更适合于元素的查改,LinkedList更适合于元素的增删。(在性能要求不是特别严格情况下,可以忽略该条)

  • Vector:底层采用动态数组,和ArrayList相比,属于线程安全,效率低(基本不用,过时了)

4.2 ArrayList

动态数组

List
list = new ArrayList
();list.add("1");
  • 特点:多态,无参构造

  • 源码分析:

    1. 最开始调用了 ArrayList的无参构造

      public ArrayList() {
      this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}
      • DEFAULTCAPACITY_EMPTY_ELEMENTDATA:空数组

      结论:

      ArrayList的无参构造,构造了一个长度为0 的空数组。所以,由源码可知:当new对象时并没有申请数组的内存空间

      在这里插入图片描述

    2. 调用add方法,添加元素时:

      • 先给数组申请长度为10的一维数组
      • 扩容原理:当容量慢后,会扩容至原始长度的1.5倍

4.3 LinkedList

底层采用双向链表进行数据管理,访问不便,增删方便

在这里插入图片描述

  • 双向链表,就是指前驱和后继都能找到。
  • 指针是一种数据类型,存放的是地址值
List
list = new LinkedList
();list.add("1");
  • 特点:多态,无参构造

  • 源码分析:

    1. 调用LinkedList的无参构造

      public LinkedList() {
      }
      • 创建一个空列表
    2. 调用add方法

      // 参数 e 就是我们待添加的元素public boolean add(E e) {
      linkLast(e); return true;}

      进入 linkLast 方法:

      void linkLast(E e) {
      // 让一个变量l = 指向最后一个节点的指针 final Node
      l = last; // 创建一个新的节点 (l= last:前驱,e:待添加的元素,null:后继) final Node
      newNode = new Node<>(l, e, null); // 让last指向newNode last = newNode; if (l == null) first = newNode; else l.next = newNode; // 元素个数+1 size++; modCount++;}

4.4 Vector(过时)

  • Vector 被 ArrayList取代,在开发中基本不用
  • Vector底层也是动态数组,不过自动扩容是扩大2倍

4.5 List集合的常用方法

方法声明 功能介绍
void add(int index, E element); 向指定位置添加元素
boolean addAll ( int index,Collection<? extends E> c); 向指定位置,添加集合c中的所有元素
E get (int index); 从List集合中,获取指定索引的元素
int indexOf(Object o); 返回List集合中,指定元素的首次出现的索引
int lastIndexOf(Object o); 返回List集合中,指定元素最后一次出现的索引
E set(int index, E element); 用指定的元素替换List集合中指定索引的元素
E remove( int index ) 删除指定位置的元素
List subList(int fromIndex, int toIndex); 获取子List ( 从fromIndex索引开始,截取到 toIndex-1)

5. Queue集合

5.1 基本概念

  • 是Collection接口的子接口,和List集合属于平级关系
  • 主要用于描述先进先出特征的数据结构,叫队列
  • 该集合的主要实现类是LinkedList

在这里插入图片描述

5.2 常用方法

方法声明 功能介绍
boolean offer(E e); 将一个对象添加到队尾,成功返回true
E poll(); 删除并返回队列中的头元素,
E peek(); 返回队列中的头元素,不删除

转载地址:http://bhuen.baihongyu.com/

你可能感兴趣的文章
【MacOS】Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew
查看>>
为窗口添加鼠标HOVER和LEAVE事件
查看>>
VC小技巧20个
查看>>
MFC Feature Pack for Visual C++ 2008的BUG之一
查看>>
POJ - 2739 Sum of Consecutive Prime Numbers
查看>>
STL map映照容器(一)map创建、元素插入、元素删除和遍历访问
查看>>
Leetcode - 557反转字符串中的单词III
查看>>
Leetcode - 160相交链表
查看>>
Leetcode - 11盛最多水的容器
查看>>
Leetcode - 141环形链表
查看>>
Leetcode - 14最长公共前缀
查看>>
Leetcode - 7整数反转
查看>>
PAT---B1022. D进制的A+B (20)
查看>>
PAT---B1037. 在霍格沃茨找零钱(20)
查看>>
PAT---A1019. General Palindromic Number (20)
查看>>
PAT---A1027. Colors in Mars (20)
查看>>
PAT---1058. A+B in Hogwarts (20)
查看>>
PAT---A1001. A+B Format (20)
查看>>
PAT---A1005. Spell It Right (20)
查看>>
PAT---A1035. Password (20)
查看>>