Java 集合

1、为什么需要集合

  1. java是面向对象的语言,为了方便操作多个对象,我们需要把对象存储起来。

  2. 既然要存储多个对象,那么就需要一个容器

  3. java为我们提供了集合

2、数组和集合的区别

  • 长度的区别

    • 数组长度固定
    • 集合长度可变
  • 元素的数据类型

    • 数组只能够存储的基本数据类型,也可以存储引用类型(String)
    • 集合只能存储引用类型(假设你存储的是int,java是会动装箱成integer)

集合的大致结构:
在这里插入图片描述

3 List集合

List集合主要有三个子类

  1. ArrayList (底层是数组)
  2. LinkList (底层是链表)
  3. Vector (底层是数组)

3.1 ArrayList集合

查看ArrayList的层次结构图:

​ 右键类
在这里插入图片描述

在这里插入图片描述

ArrayList底层其实就是⼀个数组,ArrayList中有扩容这么⼀个概念,正因为它扩容,所以它能够实现“动态”增⻓

常用方法:

ArrayList 常用方法列表如下:
(点击对应的方法到相应网站查看详解。)

方法描述
add()将元素插入到指定位置的 arraylist 中
addAll()添加集合中的所有元素到 arraylist 中
clear()删除 arraylist 中的所有元素
clone()复制一份 arraylist
contains()判断元素是否在 arraylist
get()通过索引值获取 arraylist 中的元素
indexOf()返回 arraylist 中元素的索引值
removeAll()删除存在于指定集合中的 arraylist 里的所有元素
remove()删除 arraylist 里的单个元素
size()返回 arraylist 里元素数量
isEmpty()判断 arraylist 是否为空
subList()截取部分 arraylist 的元素
set()替换 arraylist 中指定索引的元素
sort()对 arraylist 元素进行排序
toArray()将 arraylist 转换为数组
toString()将 arraylist 转换为字符串
ensureCapacity()设置指定容量大小的 arraylist
lastIndexOf()返回指定元素在 arraylist 中最后一次出现的位置
retainAll()保留 arraylist 中在指定集合中也存在的那些元素
containsAll()查看 arraylist 是否包含指定集合中的所有元素
trimToSize()将 arraylist 中的容量调整为数组中的元素个数
removeRange()删除 arraylist 中指定索引之间存在的元素
replaceAll()将给定的操作内容替换掉数组中每一个元素
removeIf()删除所有满足特定条件的 arraylist 元素
forEach()遍历 arraylist 中每一个元素并执行特定操作
public class ArrayList01 {
    /**
     * ArrayList的常用方法
     */

    public static void main(String[] args) {
        //add方法 add(E element) 默认再末尾进行加入
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        System.out.println(arrayList.get(0));
        System.out.println(arrayList.get(1));
        
        //List的遍历,forEach方法
        System.out.println("add--------");
        for (Integer element : arrayList) {
            System.out.println(element);
        }
        
        //List的遍历,常规方法
        System.out.println("------------");
        int size = arrayList.size();	//获取集合的长度
        for (int i = 0; i < size; i++) {
            System.out.println(arrayList.get(i));
        }
        
        //使用迭代器:
        //add(int index,E element) 在下标中插入
        //arrayList.add(1,3);
        System.out.println("------------");
 		Iterator iter = arrayList.iterator();
		while(iter.hasNext()) {
			int element = (Integer) iter.next();
			System.out.println(element );
		}

        //set方法  set(int index,E element) 替换下标为index的元素,新的元素为element
		//arrayList.set(1,2);
        System.out.println("Set--------");
        for (Integer element : arrayList) {
            System.out.println(element);
        }

        //remove方法  remove(int index) 删除下标为index的元素
		//arrayList.remove(1);
        System.out.println("remove------");
        arrayList.forEach(integer -> {
            System.out.println(integer);
        });

    }

}

由于ArrayList是List的子类,所以定义的时候也是可以这样定义的:
List<?> list = new ArrayList<>();

3.2 LinkedList集合

在这里插入图片描述

  1. Java的LinkedList是一种常用的数据容器,与ArrayList相比,LinkedList的增删操作效率更高,而查改操作效率较低。
  2. LinkedList 实现了Queue接口,能当作队列使用。
  3. LinkedList 实现了List 接口,能对它进行列表操作。
  4. LinkedList 实现了Deque 接口,即能将LinkedList当作双端队列使用。
  5. LinkedList 实现了Cloneable接口,能克隆。
  6. LinkedList 实现了java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
1.public boolean add(E e),链表末尾添加元素,返回是否成功;
public void add(int index, E element),向指定位置插入元素;
public boolean addAll(Collection<? extends E> c),将一个集合的所有元素添加到链表后面,返回是否成功;
public boolean addAll(int index, Collection<? extends E> c),将一个集合的所有元素添加到链表的指定位置后面,返回是否成功;
public void addFirst(E e),添加到第一个元素;
public void addLast(E e),添加到最后一个元素;
public boolean offer(E e),向链表末尾添加元素,返回是否成功;
public boolean offerFirst(E e),头部插入元素,返回是否成功;
public boolean offerLast(E e),尾部插入元素,返回是否成功;
2.public void clear(),清空链表;
public E removeFirst(),删除并返回第一个元素;
public E removeLast(),删除并返回最后一个元素;
public boolean remove(Object o),删除某一元素,返回是否成功;
public E remove(int index),删除指定位置的元素;
public E poll(),删除并返回第一个元素;
public E remove(),删除并返回第一个元素;
3.public boolean contains(Object o),判断是否含有某一元素;
public E get(int index),返回指定位置的元素;
public E getFirst(), 返回第一个元素;
public E getLast(),返回最后一个元素;
public int indexOf(Object o),查找指定元素从前往后第一次出现的索引;
public int lastIndexOf(Object o),查找指定元素最后一次出现的索引;
public E peek(),返回第一个元素;
public E element(),返回第一个元素;
public E peekFirst(),返回头部元素;
public E peekLast(),返回尾部元素;
4.public E set(int index, E element),设置指定位置的元素; 

4、Set集合

Set是一个不能包含重复元素的Collection。它模拟了数学集合抽象。

Set接口仅包含从Collection接口继承的方法,并添加禁止重复元素的限制。

Set还为equalshashCode操作的行为添加了一个更强的规范,允许Set实例有意义地进行比较,即使它们的实现类型不同。

Set在HashSetTreeSetLinkedHashSet等各种类中都有实现。

Set声明的方法如下表中所示 -

编号方法描述
1add()添加一个对象到集合中。
2clear()从集合中删除所有对象。
3contains()如果指定的对象是集合中的元素,则返回true
4isEmpty()如果集合没有元素,则返回true
5iterator()返回集合的Iterator对象,该对象可用于检索对象。
6remove()从集合中删除指定对象。
7size()返回集合中的元素数。
8first()/last()返回集合第一个元素/返回集合最后一个元素。这是在TreeSet中的方法

4.2 hashSet

HashSet的要点:

  • 实现Set接⼝
  • 不保证迭代顺序
  • 允许元素为null
  • 底层实际上是⼀个HashMap实例
  • ⾮同步
  • 初始容量⾮常影响迭代性能

4.3 LinkedHashSet

解决了hasSet的无序

5、 Map集合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7k8gLwxt-1637117669640)(集合.assets\image-20210415175929048.png)]

Alt+7查看当前类的所有方法属性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jSehkwQS-1637117669642)(集合.assets\image-20210415180929123.png)]
注意Map同样和set是一个接口


Map接口的常用方法

V和Set代表返回的数据类型

方法名称说明
V get(Object key)返回 Map 集合中指定键对象所对应的值。V 表示值的数据类型
V put(K key, V value)向 Map 集合中添加键-值对,返回 key 以前对应的 value,如果没有, 则返回 null
V remove(Object key)从 Map 集合中删除 key 对应的键-值对,返回 key 对应的 value,如果没有,则返回null
Set entrySet()返回 Map 集合中所有键-值对的 Set 集合,此 Set 集合中元素的数据类型为 Map.Entry
Set keySet()返回 Map 集合中所有键对象的 Set 集合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cFcWDl4t-1637117669644)(集合.assets\image-20210415181234903.png)]

可见Map的子类有这些
hashMapLinkedHashMap

  • HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,==需要重写键的hashCode()方法、equals()方法。 ==

  • LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值