集合框架体系结构,list、set操作数据,泛型(一)

本文介绍了Java集合框架的基本概念,包括集合与数组的区别,以及集合框架的体系结构,如List、Set接口和Queue、Map接口。重点讨论了List接口中的ArrayList、LinkedList以及Set接口中的HashSet,同时讲解了如何通过泛型限制集合中存储对象的类型。还涵盖了List的添加、获取、修改和删除元素的操作,并对比了List与Set的操作区别。

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

集合的概念
现实生活中:很多的事物凑在一起。
数学中的集合:具有共同属性的事物的总体。
Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象。

集合的作用
1.在类的内部,对数据进行组织。
2.简单而快速的搜索大数量的条目。
3.有的集合接口,提供了一系列排列有序的元素,并且可以在序列中间快速的插入/删除有关元素。
4.有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型。

集合与数组的区别
数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。
数组的长度固定,集合长度可变。
数组只能通过下标访问元素,下标的类型固定是整型,当不知道元素的位置时,需要遍历,而有的集合可以通过任意类型查找所映射的具体对象。
数组是一种可读/可写数据结构没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方 只读方式来使用集合。该方法将返回一个集合的只读版本。

java集合框架的体系结构
由两大家族组成:
collection接口:是List、set、Queue接口的父接口,定义了可用于操作List、set、Queue的方法–增删改查。和Map接口
collection包括:
List:序列。常用的,存储的元素是排列有序的,并且可以重复,可以精确的控制每个元素的插入位置,或者删除某个位置元素。Arraylist:数组序列list的实现类,底层是由数组实现的。
Queue:队列。存储的元素是排列有序的,并且可以重复。LinkedList:链表,Queue的实现类,同时也是list的实现类
Set。集:常用的,存储的元素是排列无序的,并且不可以重复。如何区分是否重复:Set里的元素是不能重复的,那么用iterator()方法。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
HashSet:哈希集,Set的实现类
Map:重要的是HashMap实现类。

它们内部如何来存储对象,collection中存储的是一个一个的对象,Map:中运用<key,Value>键值对key和value可以是任意类型的对象,用两个对象,一个映射来存储对象。

list操作数据

添加

boolean add(E e):向列表的尾部添加指定的元素,e表示要添加的元素。

//创建list,以及要添加的元素
List coursesToSelect=new ArrayList();
Course cr1 = new Course("1" , "数据结构");  
coursesToSelect.add(cr1);

void add(int index,E e):向列表的指定位置添加元素,index表示添加的位置,list的位置是从0开始的,e表示要添加的数据。将当前处于该位置的元素和所有后续元素向右移动。

coursesToSelect.add(0, cr1);

boolean addAll(Collection<? extends E> c):添加指定 collection 中的所有元素到此列表的结尾,新元素将按照它们通过指定 collection 的迭代器所返回的顺序出现在此列表中。

//要添加的内容,此处是一个数组
Course[] course = {new Course("3", "离散数学"), new Course("4", "汇编语言")};
//将数组转换为list之后再添加
coursesToSelect.addAll(Arrays.asList(course));

boolean addAll(int index, Collection<? extends E> c):将指定 collection 中的所有元素都插入到列表中的指定位置。将当前处于该位置的元素和所有后续元素向右移动。新元素将按照它们通过指定 collection 的迭代器所返回的顺序出现在此列表中。
注意:在添加到指定位置的方法要注意数组下标越界异常。

coursesToSelect.addAll(2, Arrays.asList(course));       

获得list中的元素

E get(int index):返回列表中指定位置的元素,index是位置,对象存入集合都变成Object类型,取出时需要类型转换。

Course cr = (Course) coursesToSelect.get(i);

遍历list

1.通过迭代器iterator,只是用来遍历集合中的元素,本身不具备任何存储元素的功能,它是依赖于某个集合存在的,不能独立存在是一个接口。

//通过集合的iterator方法,取得迭代器的实例
Iterator<Course> it = coursesToSelect.iterator();
System.out.println("有如下课程待选(通过迭代器访问):");
while(it.hasNext()) {
    Course cr = it.next();
    System.out.println("课程:" + cr.id + ":" + cr.name);
}

2.foreach:它是迭代器的简单写法

for (Object obj : coursesToSelect) {
    Course cr = (Course) obj;
    System.out.println("课程:" + cr.id + ":" + cr.name);
}

修改

E set(int index, E element):用指定元素替换列表中指定位置的元素。index方法索引位置,element要修改为的值。

coursesToSelect.set(4, new Course("7", "毛概"));

删除

E remove(int index):移除列表中指定位置的元素。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。

coursesToSelect.remove(4);

boolean remove(Object o):从此列表中移除第一次出现的指定元素。

Course cr = (Course) coursesToSelect.get(4);
coursesToSelect.remove(cr);

boolean removeAll(Collection<?> c) :列表中移除指定 collection 中包含的其所有元素。

 Course[] courses = {(Course) coursesToSelect.get(4), (Course)coursesToSelect.get(5)};
 coursesToSelect.removeAll(Arrays.asList(courses));

泛型

提出一个问题,给list中添加一个与之前添加的类型(课程)不同的类型,如String,在遍历时就会报错,原因是不能将String类型强转为课程类型。这时要考虑有没有什么方法可以控制往集合或list添加数据的类型,泛型就可以做到这一点。

集合中的元素,可以是任意类型的对象,其实就是对象的引用,如果把某个对象放入集合,则会忽略其类型,把它当作Object处理,泛型规定了某个集合只可以存放特定类型的对象,它会在编译期间进行类型检查,可以直接按指定类型获取集合元素,而不需要转型。

下面代码中<>中的内容就是泛型:

List<Course> courses = new ArrayList<Course>();

1.泛型集合中,不能添加泛型规定的类型及其子类型以外的对象,否则会报错!

courses.add("能否添加一些奇怪的东西呢??");

如上面代码中泛型是Course,但添加的是String类型就会报如下错误:

这里写图片描述

2.泛型集合可以添加泛型的子类型的对象实例。
3.泛型集合中的限定类型不能使用基本类型,可以通过使用其对应的包装类存入基本数据类型。
4.在list的遍历中,带有泛型的与之前有所不同,每次循环的变量类型不在是Object。

for (Course cr : courses) {
    System.out.println(cr.id + ":" + cr.name);
}

与list操作数据的区别与联系

1.得到set里面的值,因为它是无序的,不能查询指定位置上的值,只能通过遍历的方式一个一个的显示出来,每次迭代出来的结果都是不一样的。
2.Set中,添加某个对象,无论添加多少次, 最终只会保留一个该对象(的引用), 并且,保留的是第一次添加的那一个。
3.添加,删除的方式都是一样的,都支持泛型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值