15.集合框架(※重点※)List

本文详细介绍了集合框架的基本概念、集合的特点及框架结构,并对比了数组与集合的异同。此外,还深入探讨了Collection中的常用方法,List接口及其两种具体实现:ArrayList与LinkedList,包括它们的特性、适用场景及区别。

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

一.集合的特点:

1、长度是随意的 动态变化
2、集合可以存放任意引用类型的数据


二.集合的框架结构:(重点)

在这里插入图片描述

※集合与数组的对比:
相同点:

  • 都是数据的容器,在一个数组或集合中可以声明(存储)多个数据

不同点:

  • 元素:
    数组中的元素只能是相同(相兼容类型)
    集合中的元素是任意的(泛型)
    数组中可以存储基本类型和引用类型,集合只能存储引用类型
  • 长度(元素个数)
    数组是定长的,一旦初始化长度就不可以修改
    集合长度可以修改,可以删除元素和添加元素

三.collection中的常用方法

add(参数) 追加元素
add(参数1,参数2)插入元素
addAll(Collection<? >extends E c) 将指定 collection 中的所有元素都添加到此 collection 中
clear() 清空此 collection 中的所有元素
contains(Object o) 如果此 collection 包含指定的元素,则返回true
containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true
equals(Object o) 比较此 collection 与指定对象是否相等
isEmpty() 如果此 collection 不包含元素,则返回true
iterator() 返回在此 collection 的元素上进行迭代的迭代器
remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话
removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素
retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素
size() 返回此 collection 中的元素数
toArray() 返回包含此 collection 中所有元素的数组
get()索引

[说明]:
1.可以利用迭代器遍历集合
2.当删除元素或插入元素后,删除或插入的元素之后的元素的索引会重新调整.不能通过索引跟踪元素

四.List接口

add(int index, E element) 在列表的指定位置插入指定元素
addAll(int index, Collection<?> extends E c) 将指定 collection 中的所有元素都插入到列表中的指定位置
containsAll(Collection<?> c) 如果列表包含指定 collection 的所有元素,则返回true
get(int index) 返回列表中指定位置的元素
indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1
lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1
listIterator() 返回此列表元素的列表迭代器
remove(int index) 移除列表中指定位置的元素
set(int index, E element) 用指定元素替换列表中指定位置的元素
subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的元素

1.List接口的存储特点:

有序,允许重复,可以通过下标访问集合元素
List接口中可以使用独有的迭代器ListIterator,具有反向遍历的功能

2.ArrayList类(有序,可重复,内存空间连续,允许null元素)

ArrayList类是List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。

例子:

/**
 * @author CC
 * ArrayList可以存任何类型的数据
 */
public class ArrayListDemo {

	public static void main(String[] args) {
		//创建ArrayList集合
		ArrayList<Object> arr = new ArrayList<Object>();
		//集合长度(集合中元素的个数)
		System.out.println("集合长度:"+arr.size());
		//存放数据
		arr.add("胖虎");
		System.out.println("集合长度:"+arr.size());
		arr.add(1);
		System.out.println(arr.toString());
		//初始化时指定了长度
		ArrayList<Object> arrayList = new ArrayList<Object>(10);
		//集合的长度由其中元素的个数决定,和初始化的长度没关系
		System.out.println("集合长度:"+arrayList.size());//长度0
		arr.remove(1);//删除
		System.out.println(arr);
	}
}

public class ArrayListDemo2 {

	public static void main(String[] args) {
		ArrayList<Object> arrayList = new ArrayList<Object>();
		arrayList.add(1);
		arrayList.add(2);
		System.out.println("集合1:"+arrayList);
		
		ArrayList<Object> arrayList2 = new ArrayList<Object>();
		arrayList2.add(3);
		//把一个集合添加到另一个集合中
		arrayList2.addAll(arrayList);
		System.out.println("添加后的集合2:"+arrayList2);
		
		//删除一个集合中的另一个集合
		arrayList2.remove(arrayList);
		System.out.println(arrayList2);
		//add(参数1)追加
		arrayList2.add(2,"abc");
		System.out.println(arrayList2);
		System.out.println("----------------");
		
		//集合遍历
		for (int i = 0; i < arrayList2.size(); i++) {
			System.out.println(arrayList2.get(i));
		}
		System.out.println("----------------");
		//增强for
		for (Object object : arrayList2) {
			System.out.println(object.toString());
		}
		System.out.println("----------------");
		//迭代器遍历
		Iterator<Object> it = arrayList2.iterator();
		while(it.hasNext()) {
			System.out.println(it.next().toString());
		}
	}
}

在这里插入图片描述

3.LinkedList类(有序,可重复,内存空间不连续,允许null元素)

LinkedList类是List接口的链表实现。实现所有可选的列表操作,并且允许所有元素(包括null)。
在这里插入图片描述

public class LinkedListDemo {

	public static void main(String[] args) {
		LinkedList list = new LinkedList();
		list.add("aaaa");
		list.add("bbbb");
		list.add("cccc");
		System.out.println(list);
		//头部元素的方法
		list.addFirst("dddd");
		System.out.println(list);
		System.out.println("头部元素:"+list.getFirst());
		list.removeFirst();
		//尾部
		list.addLast("zzzz");
		System.out.println(list);
		System.out.println("尾部元素:"+list.getLast());
		list.removeLast();
		System.out.println(list);
	}
}

五.ArrayList和LinkedList的区别?

1、ArrayList和LinkedList可想从名字分析,它们一个是**Array(动态数组)的数据结构,一个是Link(链表)**的数据结构,此外,它们两个都是对List接口的实现。

前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列

2、当随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

3、当对数据进行增加和删除的操作时(add和remove操作)LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。

4、从利用效率来看,ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用

5、ArrayList主要空间开销在于需要在List列表预留一定空间;而LinkList主要空间开销在于需要存储结点信息以及结点指针信息。
在这里插入图片描述

简单来说:

  • LinkedList集合适用在对元素插入和删除操作较频繁的时候
  • ArrayList集合适用在对元素查询操作较频繁的时候

六.分析

1). List接口下的集合分析:

  • 1、存入的数据都会转换为Object (降低效率)
  • 2、取出数据时容易发生异常

2)泛型:(泛型集合是对集合中存放数据的类型的约束非约定的类型,不允许存入集合中)

  • 1、约定限制了集合中存放元素的类型
  • 2、不做类型转换,效率高,且安全
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值