JAVA集合

集合的框架体系

  1. 集合主要是两组(1.单列集合:存放的是单列对象,2.双列集合:存放的是键值对形式)在这里插入图片描述

在这里插入图片描述
ArrayList 单列集合,HashMap 双列集合
3. Collection 接口有两个重要的子接口 List,Set,他们的实现子类都是单列集合
4. Map接口的实现子类 是双列集合,存放的K-V

单列集合

Collection常用方法

在这里插入图片描述
在这里插入图片描述

Iterator 迭代器

在这里插入图片描述

在这里插入图片描述

迭代器的使用

在这里插入图片描述

在这里插入图片描述

增强for循环遍历
  1. 使用增强for,在Collection集合
  2. 增强for,底层仍然是迭代器
  3. 增强for可以理解成就是简化版本的迭代器遍历
  4. 快捷方式 大写i I
    在这里插入图片描述

List接口方法

Collection有List和Set两个子接口,List接口是Collection的子接口。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

List的三种遍历方式{ArrayList,LinkedList,Vector}

ArrayList,LinkedList,Vector都是List接口的实现子类所以以下三种遍历方式通用
在这里插入图片描述

集合结合冒泡排序,根据价格从小到大排序

在这里插入图片描述
在这里插入图片描述

ArraryList的注意事项

  1. ArrayList可以放入空元素
  2. ArrayList底层是由数组来实现数据存储的
  3. Arraylist基本等同于Vector,除了ArrayList是线程不安全的但是执行效率高,多线程情况下不建议用ArrayList考虑用Vector
    为什么说ArrayList是线程不安全的?
    咱们可以看他的源码 没有synchronized线程安全控制关键字
	//ArrayList是线程不安全的,可以看源码 没有 synchronized
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
ArrayList底层结构和源码分析

在这里插入图片描述
1.分析使用无参构造器,创建和使用ArrayLIst的源码
创建一个ArrayList对象
在这里插入图片描述
在这里插入图片描述

创建了一格空的elementData数组={}

执行list.add
在这里插入图片描述

Vector的注意事项

在这里插入图片描述

Vector底层结构和ArrayList的比较

在这里插入图片描述
ArrayList是线程不同步的所以线程不安全,效率高,Vector做了线程同步所以是线程安全的,但是效率就低了
在这里插入图片描述
无参构造器

LinkedList的底层结构

LinkedList的全面说明
  1. LinkedList底层实现了双向链表和双端队列特点
  2. 可以添加任意元素(元素可以重复),包括null
  3. 线程不安全,没有实现同步
LinkedList的底层操作机制

5
LinkedList添加、删除,不是通过数组来完成,不涉及到数组的扩容所以说效率较高
比如删除:比如删除A对象,让A的下一个对象prev(指向前一个节点)属性指向A对象的前一个对象,A前一个对象的next(指向后一个节点)属性指向A后一个对象,完成连接就执行完删除A对象的操作。

代码模拟双向链表
/**
 * @Autohr Yren
 * Date: 2021-11-7
 */

public class LinkedList_ {
    public static void main(String[] args) {
        //模拟一个简单的双向链表
        Node jack = new Node("jack");
        Node jack1 = new Node("jack1");
        Node jack2 = new Node("jack2");

        //连接三个节点,形成双向链表
        //jack -> jack1 -> jack2
        jack.next = jack1;
        jack1.next = jack2;
        //jack2 -> jack1 -> jack
        jack2.pre = jack1;
        jack1.pre = jack;

        Node first = jack;//让first引用指向jack,jack就是双向链表的尾节点
        Node last = jack2;//让last引用指向jack2,jack2就是双向链表的尾节点


        //演示,从头到尾进行遍历
        System.out.println("从头到尾:从jack到jack2遍历");
        while (true) {
            if (first == null) {
                break;
            } else {
                //输出first信息
                System.out.println(first);
                first = first.next;
            }
        }
        //演示,从尾到头进行遍历
        System.out.println("从尾到头:从jack到jack2遍历");
        while (true) {
            if (last == null) {
                break;
            } else {
                //输出last信息
                System.out.println(last);
                last = last.pre;
            }
        }

        //演示链表的添加对象/数据,是多么方便迅速
        //要求:是在jack1------jack2之间插入一个jack3
        //1.县创建一个Node(节点),name就是jack3
        Node jack3 = new Node("jack3");
        //关联他们的关系,下面这样就把jack3加入到双向链表了
        jack3.next = jack2;
        jack3.pre = jack1;
        jack1.next = jack3;
        jack2.pre = jack3;
        first = jack;
        while (true) {
            if (first == null) {
                break;
            } else {
                System.out.println(first);
                first = first.next;
            }
        }
    }
}

class Node {
    public Object item;
    public Node next;
    public Node pre;

    public Node(Object item) {
        this.item = item;
    }

    public String toString() {
        return "Node name=" + item;
    }
}

LinkedList的增删改查案例

在这里插入图片描述

ArrayList和LinkedList的比较

在这里插入图片描述
ArrayList:底层结构是数组,增删因为有扩容涉及到数据的拷贝所以效率较低,改查因为根据索引定位所以效率较快。
LinkedList:底层结构是双向链表,增删根据链表追加,查找时会根据链表的头一个一个找所以效率较低

Set接口方法

Set接口的基本介绍

在这里插入图片描述

Set接口的常用方法

在这里插入图片描述

双列集合

Map接口和常用方法

Map和Collection并列存在,用于保存具有映射关系的数据:Key-Value(双列元素)
在这里插入图片描述

Map接口的特点

在这里插入图片描述

在这里插入图片描述
存进去是no1,no2,取出为什么是no2,no1呢?
取出无序是因为底层是hash,是单链表
在已有no1的情况下再存入
map.put(“no1”,“张三”) 张三会覆盖韩顺平

Map六大遍历方式

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值