java基础-8-集合

本文详细介绍了Java中的Collection接口及其子接口List和Set,包括它们的实现类如ArrayList、Vector、LinkedList、HashSet、LinkedHashSet和TreeSet。讲解了迭代器的使用,以及List和Set在数据结构和特性的对比,重点突出了它们在有序性、重复性和性能上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 集合
    • Collection接口
      • Collection方法
      • 迭代器
      • List接口
        • ArrayList
        • Vector
        • LinkedList
      • Set接口
        • HashSet
        • LinkedHashSet
    • TreeSet
      - List和Set的区别

集合

集合主要是两组(单列集合,双列集合),
Collection接口有两个重要的子接口List Set,他们的实现子类都是单列集合,存放单个的数据
Map接口的实现子类都是双列集合,存放的键值对

继承关系:

IMG_20240214_170521.jpg

IMG_20240214_170447.jpg

Collection接口

Collection方法

  • add:添加单个元素
  • remove:删除指定元素
  • contains:查找元素是否存在
  • size:获取元素个数
  • isEmpty:判断是否为空
  • clear:清空
  • addAll:添加多个元素
  • containsAll:查找多个元素是否都存在
  • removeAll:删除多个元素

迭代器

所有实现了Collection接口的集合类都有一个iterator方法,用于返回一个实现了Iterator接口的对象,即可以返回一个迭代器。

  1. 先用一个Iterator对象接收集合中的iterator迭代器
  2. hasNext方法用于判断是否有下一个对象
  3. next方法用于切换到下一个对象
    while循环时快捷键itit

示例如下

ArrayList list=new ArrayList();  
list.add("红楼梦");  
list.add("三国");  
list.add("asfas");  
list.add(1232);  
System.out.println("list="+list);  
  
  
Iterator iterator= list.iterator();  
  
int number=0;//序号  
  
while (iterator.hasNext()) {//快捷键按itit  
    number++;  
    Object object =  iterator.next();  
    System.out.println(number+" 为 "+object);  
}

增强for循环:
基本语法:
for(元素类型 元素名:集合名和数组名){
访问元素
}
快捷键:大写的I

List接口

List接口是Collection接口的子接口。
实现了List的集合类中元素有序,且可重复,且支持索引(用来替换或删除)。

常用的方法有:

  • void add(int index,object ele)即支持按索引增加
  • Object remove(int index)删除指定index位置的元素,并返回此元素
  • Object set(int index,Object ele)设置指定index位置的元素为ele,即替换(改)
  • Object get(int index)获取指定index位置的元素
ArrayList list = new ArrayList();  
list.add(new Book("红楼梦",15,"曹雪芹"));  
list.add(new Book("红楼梦213",115,"曹雪芹"));  
list.add(new Book("红楼梦124241",75,"曹雪芹"));  
  
for(int i=0;i<list.size()-1;i++)  
{  
    for(int j=0;j<list.size()-1-i;j++)  
    {  
        Book book1=(Book) list.get(j);  
        Book book2=(Book) list.get(j+1);  
  
        if(book1.price>book2.price)  
        {  
  
            list.set(j,book2);  
            list.set(j+1,book1);  
  
        }  
    }  
}  
  
for (Object o:list)  
{  
    System.out.println(o);  
}

ArrayList

底层原理:

  • ArrayList中维护了一个Object类型的数组elementData用于储存数据
  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第一次添加后扩容容量为10,如需再次扩容,则扩容为1.5倍。
  • 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
    增删的效率较低,数组扩容,改查的效率较高
    线程不安全

Vector

Vector底层也是一个对象数组,Object类型的数组elementData用于储存数据
Vector是线程安全的
扩容每次2倍

LinkedList

实现了双向链表,有first和last两个属性,可以指向链表中的first对象和last对象。
线程不安全
无须扩容,对象间通过next连接,增删的效率较高,改查的效率较低,不浪费空间

Set接口

set接口的实现类的特点:

  • 无序(即添加的顺序和取出的顺序不一致),但取出的顺序是固定的
  • 没有索引,即不能通过get方法获取对象
  • 不能重复,所以只能有一个null
Set Set = new HashSet();  
Set.add("jack");  
Set.add("john");  
Set.add("john");//Set里只会有一个john  
Set.add(null);  
Set.add(null);  
  
System.out.println("Set="+Set);  
  
Iterator iterator = Set.iterator();  
while (iterator.hasNext()) {  
    Object next =  iterator.next();  
    System.out.println(next);  
}

HashSet

HashSet底层是HashMap,HashMap底层是数组+链表+红黑树

根据Set接口的特点,我们知道HashSet里的对象不能重复,这里的判断是否重复,是先判断hash值是否相等,再调用equals方法,判断是否是同一个对象等。

可以用alt+insert快捷键重写hashcode方法和equals方法,自定义判断机制,即自定义判断对象是否重复的标准。
如:当Car类对象的name和price属性一样时,返回相同的hashcode,equals返回true

LinkedHashSet

LinkedHashSet底层是LinkedHashMap,LinkedHashMap底层是数组+双向链表

是HashSet的子类

看起来是有序的,加入顺序和取出顺序一致

与HashSet一样,不能重复

TreeSet

有序,可以自定义排序规则

List和Set的区别

  1. List集合存储的数据有序可以重复,Set集合存储的数据无序不可以重复。
  2. List是一个有序的容器,可以保证每一个插入元素的顺序,输出顺序就是输入顺序。
  3. List可以插入多个null值,而Set只能插入一个null值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值