java-集合1

一、集合介绍

1、集合和数组的区别

数组:
(1)长度是指定的,一旦指定就不能更改,不便于扩展。
(2)数组保存的必须为同一类型元素。
(3)数组中提供的属性和方法少,不便于进行添加、删除、插入等操作,且效率不高。

集合:
(1)可以动态保存任意多个对象。
(2)提供了一系列操作对象的方法(增删改查)

2、集合体系图

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

(1)集合分为单列集合和双列集合。
(2)Collection接口有两个重要的子接口List和Set,他们实现的子类都是单列集合
(3)Map接口实现子类是双列集合

二、Collection

1、Collection接口和常用方法

(1)Collection接口没有直接的实现子类,而是通过它的子接口List和Set实现的
(2)List接口的实现子类存放元素是有序可重复的,Set接口的实现子类是无序不可重复的。
(3)Collection接口方法:
● 添加单个元素
○ add(Object obj)
● 添加多个元素
○ addAll(Collection coll)
● 获取有效元素的个数
○ int size()
● 清空集合
○ void clear()
● 是否是空集合
○ boolean isEmpty()
● 是否包含某个元素
○ boolean contains(Object obj): 查找obj元素是否存在,存在返回true
○ boolean containsAll(Collection c): 查找c中元素是否全部存在,存在返回true
● 删除
○ boolean remove(Object obj) : 通过元素的equals方法判断是否是要删除的那个元素。 只会删除找到的第一个元素
○ boolean removeAll(Collection coll): 取当前集合的差集
● 取两个集合的交集
○ boolean retainAll(Collection c): 把交集的结果存在当前集合中,不影响c
● 集合是否相等
○ boolean equals(Object obj)
● 转成对象数组
○ Object[] toArray()
● 遍历
○ iterator(): 返回迭代器对象,用于集合遍历

2、迭代器遍历 Iterator

(1)Iterator对象称为迭代器(设计模式的一种),主要用于遍历 Collection 集合中的元素。
(2)所有实现了collection接口的集合类都有一个iterator()方法
(3)迭代器原理:

语法:
while (iterator.hasNext()) {
Object next = iterator.next();
}

hashNext() :判断是否还有下一个元素,返回boolean值。
iterator.next() :将指针下移并返回下移位置上的元素,如果后面没有元素,会停留在最后的位置。
在这里插入图片描述
案例:

public static void main(String[] args) {
        //创建集合
        Collection col = new ArrayList();
        //循环赋值5次
        for (int i = 0; i < 5; i++) {
            col.add(i);
        }
        //通过list.iterator()方法获取迭代器对象
        Iterator iterator = col.iterator();
        //遍历集合
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }
    }

在这里插入图片描述

注意:iterator.next()必须和hashNext()配合使用。如果不使用hashNext(),且下一个元素记录为空,直接调用iterator.next()会抛出NoSuchElementException异常
在这里插入图片描述
在这里插入图片描述

(4)当遍历完集合,指针就会停在集合最后一个元素,如果想再次遍历集合,可以再次通过集合的iterator()获取Iterator对象实例赋给已存在iterator的对象,相当于重置了迭代器。

public static void main(String[] args) {
        //创建集合
        Collection col = new ArrayList();
        //循环赋值5次
        for (int i = 0; i < 5; i++) {
            col.add(i);
        }
        //通过list.iterator()方法获取迭代器对象
        Iterator iterator = col.iterator();
        //遍历集合
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }
        System.out.println("------------------");
        //重置迭代器
        iterator=col.iterator();
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }
    }

在这里插入图片描述

3、增强for循环遍历集合

增强for循环可以代替迭代器遍历集合,但底层会调用next()和hashNext()方法,本质还是迭代器。

语法:
for(元素类型 元素名:集合名或数组名){
访问元素
}

案例:

public static void main(String[] args) {
        //创建集合
        Collection col = new ArrayList();
        //循环赋值5次
        for (int i = 0; i < 5; i++) {
            col.add(i);
        }
        //增强for循环遍历集合
        for (Object o :col) {
            System.out.println(o);
        }
    }

在这里插入图片描述

三、List

1、List接口和常用方法

(1)List和Set都是Collection的子接口,List和Set有各自的方法和实现子类。
(2)List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
(3)List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
(4)List接口方法:
● void add(int index, Object ele):在index位置插入ele元素
● boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
● Object get(int index):获取指定index位置的元素
● int indexOf(Object obj):返回obj在集合中首次出现的位置
● int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
● Object remove(int index):移除指定index位置的元素,并返回此元素
● Object set(int index, Object ele):设置指定index位置的元素为ele
● List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合

2、List遍历

List接口实现的类有三种遍历方式(迭代器,增强for循环,普通for循环),迭代器和增强for循环遍历与Collection接口相同

普通for循环案例:

public static void main(String[] args) {
        //创建集合
        List list = new ArrayList();
        //循环赋值5次
        for (int i = 0; i < 5; i++) {
            list.add(i);
        }
        //普通for循环遍历集合
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

在这里插入图片描述

3、ArrayList

(1)ArrayList底层没有synchronized,因此线程不安全
(2)ArrayList底层是由数组实现的数据存储,合扩容时会创建更大的数组空间,把原有数据复制到新数组中。
(3)ArrayList扩容机制:
ArrayList底层维护了一个Object类型的elementDate数组
使用无参构造器创建ArrayList,开始会先创建一个长度为0的elementDate,当添加第一个元素时再创建一个始容量为10的elementDate,如果添加的元素大于ArrayList长度时,开始扩容。默认情况下,新的容量会是原容量的1.5倍。 新容量=旧容量右移一位(相当于除于2)再加上旧容量。

使用有参构造器指定elementDate长度,扩容时会根据指定的大小的1.5倍来扩容

4、LinkedList

(1)ArrayList是基于数组的,LinkedList是基于链表的。
(2) ArrayList是按下标查询元素,相比于LinkedList,LinkedList也可以按下标查询元素,但是LinkedList需要对底层链表进行遍历,才能找到指定下标的元素,而ArrayList不用,所以ArrayList查询效率比LinkedList高。
(3)使用普通的add(Object e)方法直接添加到数组或链表的结尾,ArrayList增添可能会触发扩容,会导致执行效率减慢。LinkedList中有单独的属性记录的链表的头结点和尾结点,而且链表是不用扩容的,所以使用LinkedList增添效率比ArrayList快
(4)如果使用指定下标的add(int index,Object element)方法,LinkedList就需要遍历链表找到指定位置,效率会稍慢一些。

(5)LinkedList常用方法:
removeFirst(); 删除并且返回第一个元素
removeLast(); 删除并且返回最后一个元素
add(int index, E e); 在index下标插入e元素
remove(int index); 删除index下标的值
remove(Object o);删除第一次出现的o元素
set(int index, E e); 将index下标的值修改为e
get(int index); 返回index下标的元素值
getFirst(); 查询第一个元素
getLast(); 查询最末尾元素

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值