使用工具IntelliJ IDEA Community Edition 2023.2.4
使用语言 Java8
本章只负责讲一些基本集合框架接口实现类,剩下的Map集合框架接口和泛式集合交给下一章节来进行讲解,代码速成小秘诀,看完代码自己再敲一遍,绝对学得快
目录
2.List
List集合是一类存储元素有序、可重复的集合,集合中每个元素都有其对应的索引。List集合允许使用重复元素,可以通过索引访问指定位置的集合元素。
2.1 List概述
List接口作为Collection接口的子接口,可以使用Collection接口定义的全部方法。由于List集合是有序集合,所以List接口在Collection接口方法(这个在上篇有讲解噢)的基础上,另外扩展了一些根据索引操作集合元素的方法,如下所示:
2.1.1 List扩展方法
void add(int index,Object element)
- 将元素(element)插入List集合的指定位置(index)
- 在原索引(index)数据位置前插入数据
boolean addAll(int index,Collection c)
- 将集合c所包含的所有元素都插入List集合的指定位置(index)
Object get(int index)
- 返回集合index索引处的元素
int indexOf(Object o)
- 返回对象o在List集合中第一次出现的位置索引
int lastIndexOf(Object o)
- 返回对象o在List集合最后一次出现的位置索引
Object remove(int index)
- 从集合中删除指定位置的元素
- 按照索引删除
boolean remover(Object o)
- 从集合中删除指定对象
- 按照对象删除
Object set(int index,Object element)
- 将index索引处的元素替换成Element对象,返回新元素
- 调用set(int index,Object element)方法改变List集合指定索引处的元素时,指定的索引必须是List集合的有效索引。例如长度是4,不能指定替换index值为4的元素,即该方法不会改变List集合的长度。
List subList(int fromIndex,int toIndex)
- 返回从索引包含(fromIndex)到索引不包含(toIndex)处所有集合元素组成的子集合
- 就是截取从索引fromIndex到索引toIndex中的所有元素,不包含toIndex索引的那一个元素,但是包含fromIndex索引的那个元素及在toIndex前的所有元素
2.1.2 List的常用实现类
所有的List集合都可以调用以上的方法操作集合元素。List集合比Collection接口扩充了更多的方法,而且这些方法操作起来很方便,需要通过List接口的子类实例化对象调用。常用的子类有ArrayList类和LinkedList类,它们的集合对象都可以容纳所有类型的元素对象,包括null,允许重复,并且保证元素按顺序存储。
- ArrayList类对数组进行了封装,实现了长度可变的数组。ArrayList集合存储数据的方式和数组相同,都是在内存中分配连续的空间。
- LinkedList集合存储数据的方式为双向链表存储方式,它的每个节点中都有两个指针,分别指向直接后继和直接前驱。它提供了额外的addFirst()、addLast()、removeFirst()和removeLast()等方法,可以在链表的首部或尾部进行插入或删除操作。
2.2 ArrayList集合类详解
元素个数不确定,但有一定顺序,可以使用List接口的实现类ArrayList完成该需求。
由于ArrayList集合类是List的实现类,因此可以使用List接口的扩展方法;
ArrayList集合类中要获取元素的索引值需要ArrayList中的对象名.get(索引);
2.2.1 ArrayList贯通案例
案例需求
- 向集合中添加水果信息
- 向指定排序位置新增水果信息
- 删除指定排序位置的水果信息
- 更新指定位置的水果信息
- 截取指定部分的水果信息集合
具体实现步骤
- 创建多个Fruit对象,将其添加到ArrayList集合对象中
- 使用remove(int index)、remove(object o)方法实现删除水果
- 使用set()方法实现更新指定位置水果信息
- 使用subList()方法实现截取子集合
实现代码
package com.testPack;
import java.util.ArrayList;
import java.util.List;
/**
* 测试类
*/
public class ArrayListTest {
public void show(List list){
/**
* List遍历方法1
*/
for(Object obj : list){
Fruit fruit=(Fruit) obj;
System.out.println(fruit.name+",每斤"+fruit.money+"元。");
}
/**
* List遍历方法2
*/
// for (int i = 0; i < list.size(); i++) {
// Fruit fruit=(Fruit) list.get(i);
// System.out.println(fruit.name+",每斤"+fruit.money+"元。");
// }
}
public static void main(String[] args) {
ArrayListTest arrayListTest=new ArrayListTest();
List list=new ArrayList();
Fruit fruit1=new Fruit("苹果1号",2.5);
Fruit fruit2=new Fruit("苹果2号",2.0);
Fruit fruit3=new Fruit("苹果3号",3.5);
Fruit fruit4=new Fruit("苹果4号",3.0);
System.out.println("向集合中存储信息");
list.add(fruit1);
list.add(fruit2);
list.add(fruit3);
arrayListTest.show(list);
System.out.println("将4号苹果插入第2个位置");
list.add(1,fruit4);
arrayListTest.show(list);
System.out.println("删除第三个元素");
list.remove(2);
arrayListTest.show(list);
System.out.println("将第二个元素替换成新元素");
list.set(1,new Fruit("无名苹果",1.0));
arrayListTest.show(list);
System.out.println("截取子字符串");
arrayListTest.show(list.subList(1,2));
}
}
打印结果
由于遍历方法2中的List集合中放的都是Object类型对象,所以add(Object o)方法的参数是Object类的对象,即使在调用时实际参数是Fruit类的对象,但系统认为里面只是Object类的参数,所以在通过get(int i)方法获取元素时必须进行强制转换;
2.3 LinkedList集合类详解
2.3.1 ArrayList集合的缺陷
由于ArrayList集合采用了和数组相同的存储方式,在内存中分配连续的空间,当添加和删除非尾部元素时会导致后面所有元素的移动,性能低下,所以在插入、删除操作较频繁时,可以考虑使用LinkedList集合提高效率。
2.3.2 LinkedList的常用特有方法
这些方法是LinkedList特有的方法,如果是父父new子就无法调用这些方法
LinkedList类是List接口的实现类,这就意味着LinkedList集合和ArrayList集合都是一个List集合,可以根据索引随机访问集合中的元素。除此之外,LinkedList集合还具有双向链表结构,更加方便实现添加和删除操作。基于LinkedList集合的特征,它除了List的扩展方法外,还提供了实现链表操作的方法,如下所示:
void addFirst(Object o)
在链表的首部添加元素
void addLast(Object o)
在链表的末尾添加元素
Object getFirst()
返回链表中第一个元素
Object getLast()
返回链表中最后一个元素
Object removeFirst()
删除并返回链表中的第一个元素
Object removeLast()
删除并返回链表中的最后一个元素
2.3.3 LinkedList贯通案例
打印结果
2.4 ArrayList和LinkedList的优缺点
2.4.1 ArrayList集合
ArrayList集合的底层是数组:
优点:
基于数组实现,读取操作效率高;
缺点:
不适合频繁进行插入和删除操作,因为每次执行该类操作都需要频繁移动其中的元素;
2.4.2 LinkedList集合
优点:
增加、删除操作只需修改链表节点指针,无需进行频繁的移动;
缺点:
遍历效率低;
3.Set
Set接口和List接口一样,都是Collection的子接口,它类似于一个罐子,丢进Set集合里的多个对象没有明显的顺序。Set集合与Collection集合基本一样,没有提供额外的方法,只是行为上略有不同,Set集合不允许包含重复元素。
3.1 HashSet集合
3.1.1 HashSet类特征
HashSet类是Set接口的典型实现,使用HashSet集合可以实现对无序不重复数据的存储,具有很好的存取和查找性能。它具有以下特征:
- 不允许存储重复的元素;
- 没有索引,没有包含索引的方法,不能用索引遍历;
- 是无序集合,存储元素和取出元素的顺序可能不一致;
3.2 HashSet贯穿案例
打印结果
3.3 底层逻辑中Set和List的区别
从上面的运行结果中可以看出,向Set集合中添加重复的对象fruit1时,添加操作失败。在执行该操作时,程序会将新添加的对象依次和集合中现有的元素进行比较,判断集合中是否存在与所添加对象相同的元素(通过执行集合元素的hascode()方法和equals()方法进行判断),如果不存在则添加成功,否则,添加失败。
由于Set集合中存储的元素是无序的,无法使用索引,所以不能使用索引进行遍历,这是和List集合明显的区别。
4. Map
继续敬请期待吧!!