Java高级特性 - 集合框架(1)
任务一:集合的基本使用
核心内容:
- 集合用于存储多个数据。
- 创建集合:ArrayList。
- 添加数据:add()方法。
- 获取数据:get(index)方法(索引从0开始)。
- 修改数据:set(index, element)方法。
- 删除数据:通过remove(index)或remove(element)方法。
任务二:ArrayList集合的增删改查
核心内容:- 创建新ArrayList对象。
- 使用add()方法添加多个元素。
- 使用get(0)获取第一个元素,“.get(1)”获取第二个元素。
- 使用“.remove(0)”删除第一个元素,“.remove(1)”删除第二个元素。
任务三:集合的体系结构
核心内容:- Collection家族包括List、Queue、Set三种类型。
- List允许重复元素且有序。
- Queue允许重复元素且无序(队列)。
- Set不允许重复元素且无序(集)。
- ArrayList基于动态数组实现List功能;LinkedList基于链表实现List功能;HashSet基于哈希表实现Set功能;HashMap基于键值对实现Map功能。
任务四:泛型
核心内容:- 泛型用于指定集合中存储的数据类型,默认为Object类型。
示例:
java public static void main(String[] args) { Scanner sc = new Scanner(System.in); List<String> list = new ArrayList<>(); for (int i = 0; i <3; i++) { list.add(sc.next()); } System.out.println("第1个:" + list.get(0)); System.out.println("第2个:" + list.get(1)); System.out.println("第3个:" + list.get(2)); }
目录
第1关:集合的基本使用
任务描述
相关知识
编程要求
测试说明
第2关:ArrayList集合的增删改查
任务描述
相关知识
编程要求
测试说明
第3关:集合的体系结构
任务描述
相关知识
编程要求
测试说明
第4关:泛型
任务描述
相关知识
编程要求
测试说明
第1关:集合的基本使用
任务描述
本关任务:创建集合并添加数据。
相关知识
为了完成本关任务你需要知道:
1.集合是什么;
2.为什么使用集合;
3.怎么创建集合;
4.如何向集合中添加数据。
集合是什么
Java编程语言中集合的功能就是作为核心工具来组织和管理数据元素。
例如:购物车是商品的集合,军队是军人的集合。
为什么使用集合
我们知道集合是一种能够高效地存储大量数据的容器类。然而,在Java入门学习中我们已经学习过数组这一种数据结构,它也是一种能够高效地存储大量数据的容器,虽然在某些情况下也能满足日常开发的需求,那么在什么情况下我们应该选择使用集合而不是数组呢?
类比于处理事务的有效工具——数组——我们正在学习的集合,则可以被看作是灵活多变的高效工具——如意金箍棒。
集合和数组有如下区别:
数组的长度固定,集合的长度可变;
数组主要依赖于下标来定位和获取元素,并且其数据类型的属性是固定的;然而,在某些情况下特定的数据结构却能够根据给定的数据类型查找对应的具体对象。
怎么创建集合
我们来创建一个简单的集合:
1.导包
import java.util.ArrayList;
2.创建集合
ArrayList list = new ArrayList();
如何向集合中添加数据
list.add("hello");list.add(2018);
编程要求
建议您仔细查看右侧的代码,在【
添加字符串类型数据:https:www.educoder.net;
添加double类型数据:2018.423;
在方法中返回你创建的集合对象。
测试说明
编写完成后,在线评测系统将自动进行代码测试环节。系统会针对所编写的代码展开测试,并在最终计算结果与预期输出完全吻合时判定为成功通过。
预期输出:
https:www.educoder.net
2018.423
开始你的任务吧,祝你成功!
package step1;
// 导包
/********** Begin **********/
import java.util.ArrayList;
/********** End **********/
public class HelloWorld {
@SuppressWarnings("unchecked")
public ArrayList getList() {
/********** Begin **********/
ArrayList List =new ArrayList();
List.add("https:www.educoder.net");
List.add(2018.423);
return List;
/********** End **********/
}
}
AI助手
第2关:ArrayList集合的增删改查
任务描述
本关任务:完成对集合中数据的增删改查。
相关知识
为了完成本关任务,你需要学习:
1.怎么获取集合中的数据;
2.怎么修改集合中的数据;
3.怎么删除集合中的数据。
获取集合中的数据
通过调用get(index)方法可以取出集合中的数据项,在这种情况下与数组具有相似的行为模式,请注意索引值是从0开始计数的。例如,在集合中取出元素时,请注意索引从0开始。
- 初始化一个ArrayList实例
- 将字符串"张无忌"添加到列表中
- 将整数18加入列表
- 空行
- 通过强制类型转换获取列表的第一个元素并将其转换为字符串
- 通过强制类型转换获取列表的第二个元素并将其转换为整数
- 空格后的代码改为:"打印出'姓名'和年龄的值"
输出:
姓名:张无忌 年龄:18
看到这里你可能会有疑问:
String name = (String)list.get(0);
在调用集合中的get()方法获取数据后为何需要进行强制转换为字符串类型的转换?
在定义集合时,并未指定具体的数据类型。因此,在集合中允许存储任何类型的对象(Object)。当将某个对象加入到集合中时,并不会考虑其具体的数据类型属性,并将其视为具有Object特性的通用实体进行处理。
在获取数据的过程中,默认将其视为Object类型。因此,在实际操作中需将其强制转换为相应的数据类型。
修改集合中的数据
通过调用set(index, element)的方法可以对集合中的数据进行修改。其中第一个参数用于指定要修改的位置索引(即表示要修改的位置),其中索引值从零开始计算;第二个参数index指定的是需要被替换的数据内容。
例如:
ArrayList list = new ArrayList();list.add("张无忌");list.add(18);-
String name = (String)list.get(0);
int age = (int)list.get(1);-
System.out.println("姓名:" + name + " 年龄:" + age);
-
list.set(0,"张三丰"); //修改集合的第一个元素
-
name = (String)list.get(0);
-
System.out.println("姓名:" + name + " 年龄:" + age);
输出:
姓名:张无忌 年龄:18
姓名:张三丰 年龄:18
删除集合中的数据
采用remove(index)或remove(element)的方式即可删除指定元素。这里对remove进行了重定义:第一种方法基于索引位置进行操作;第二种则基于元素引用来实现删除功能。
如下:
创建一个新的ArrayList对象并赋值给变量list
向列表中添加字符串"张无忌"
向列表中添加整数18
注:List集合调用toString方法可完整展示其内部数据
打印列表内容
通过索引0获取列表中的第一个元素赋值给obj1
移除指定对象obj1从列表中
再次打印列表内容
根据索引0移除列表中的一个元素
再次打印列表内容
输出:
[张无忌, 18]
[18]
[]
请你思考一个问题:
ArrayList list = new ArrayList();list.add("张无忌");list.add(18);
为了清除上述代码中的全部内容,请问您建议采用以下哪种方法:首先运行 remove(0) ;其次再次运行 remove(0) ;还是先运行 remove(0) 后紧接着运行 remove(1) ?
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:
删除集合的第一个和最后一个元素;
添加两个字符串:hello,educoder至集合中;
修改集合的第三个元素,改为:list;
输出集合中所有的元素。
测试说明
补充完相应的代码后进行提交测试操作,在线评测系统会自动对你的代码运行自动化测试任务。
一旦你的测试结果与预期输出完全一致,则视为任务完成并标记为通过状态
测试输入:
4
张三
李四
王五
赵六
预期输出:
李四
王五
list
educoder
提示,获取数组的长度:
创建一个名为list的ArrayList实例。
将整数1添加至列表中。
将整数3加入列表。
输出当前列表中的元素个数。
输出:2
开始你的任务吧,祝你成功!
package step2;
import java.util.ArrayList;
import java.util.Scanner;
public class HelloWorld {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
//获取输入的数据并添加至集合
Scanner sc = new Scanner(System.in);
ArrayList list = new ArrayList<>();
int length = sc.nextInt();
for(int i =0 ; i< length; i++){
list.add(sc.next());
}
/********** Begin *********/
list.remove(list.size()-1);
list.remove(0);
list.add("hello");
list.add("educoder");
list.set(2,"list");
int size=list.size();
for(int i=0;i<size;i++){
System.out.println(list.get(i));
}
/********** End **********/
}
}
AI助手
第3关:集合的体系结构
任务描述
本关任务:定义四种开发中常用的集合并添加数据。
相关知识
为了完成本关任务,你需要掌握:
1.集合的体系结构;
2.如何创建常见的集合。
在前面两个阶段里,我们学习了...这一类...仅仅是所有...中的一种基础类型;然而,在...语言中关于...的操作远远超出了简单的范畴;可以说,在现代编程语言的发展历程中,基于不同数据特性的需求形成了众多不同的数据结构家族;接下来我们就来见识一下这个家族吧。
集合的体系结构
在Java编程语言中,默认将集合分为两大类别。其中之一是名为Collection的家族。该家族包括三种基础类型:List、Queue和Set。这些基础类型各自拥有多个子类(实际上还有许多其他类型并未在此列举),例如常见的有ArrayList、LinkedList以及HashSet等。值得注意的是,在此分类中具有一个显著的特点即它们均为独立个体,在这种结构中每个元素都以离散的形式存在而不与其他成员发生关联。
另一个重要的是Map家族。其显著特点是它们通常以成双成对的形式出现(即包含键值对:key value)。这使得Map家族在数据存储和检索方面展现出独特的优势。令Collection家族感到羡慕不已。
如何使用常见的集合
创建LinkedList集合,并添加数据
LinkedList list = new LinkedList();list.add("hello");
创建HashSet集合,并添加数据
HashSet set = new HashSet();set.add("hello");
创建HashMap集合,并添加数据
HashMap map = new HashMap();map.put("name","张三");
为了便于理解,我们可以列举几个常见集合的具体实现方式。观察发现,在实际应用中,默认情况下我们使用的都是父类的引用指向子类对象。相信你已经有所了解,在之前的多态知识讲解中提到了相关内容。实际上这种方法能够显著提升程序的灵活性和可维护性。
通过上述代码运行结果可以看出,在Map集合中添加数据与该家族其他成员相比呈现不同特征;值得注意的是,在这种情况下,默认情况下每个新增的数据项必须包含两个必要的字段——一个是键(Key),另一个是值(Value)。
面试官
Duang Duang Duang面试官来啦,快坐好,摆好姿势。
现在我准备开始提问了。
问: 集合与列表在哪些方面存在差异呢?
答: 在集合中不允许存在重复项,在不考虑顺序的前提下提供唯一的元素;而列表允许包含重复元素,并且按照一定的顺序排列。
哦!还有呢?[严肃脸]
另外,请问您提到的Set在检索方面表现欠佳,在执行删除与插入操作时速度较快。值得注意的是,在这些操作中并不会导致原有元素位置的变化。至于您提到的列表(List)与数组(Array)具有相似的功能特性,在数据量增长时列表会根据实际存储的数据量自动扩展其容量——即列表会根据实际存储的数据量自动扩展其容量。对于查找操作而言,则更为高效——查找操作较为高效;而插入与删除操作的速度则较慢——因为这些操作会导致其他元素的位置发生变化。
问:Map集合中的元素可以重复吗?
答: 不可以!
问:
答:
问: 咳咳咳,下一位!
答: 诶诶诶,别呀,我还没说完呢:
基于动态数组实现的数据结构是ArrayList,而LinkedList则是一种基于链表的线性数据结构。作为一种双向链表结构,** LinkedList 特别适合那些需要快速插入或删除节点的应用场景。
在随机访问操作方面(如get和set),实验结果表明ArrayList的表现更为优异。这是因为其内部节点之间的指针关系需要频繁更新,在这种情况下, ArrayList **展现出更快捷的操作效率。
面试官:嗯,这次算你过关,等下次通知吧!
我:......
编程要求
Begin-End
Begin-End
Begin-End
分别对以下四种集合进行说明与实现:HashSet、ArrayList、LinkedList和HashMap。具体操作包括:将元素"www.educoder.net"添加到每一个集合中,并将指定字符串作为键值存储在Map(HashMap)中(其中Map的键字段设置为address)。最后返回这四个实例。
具体步骤如下:
- 创建一个HashSet实例,并将其添加该元素。
- 创建一个ArrayList实例,并将其添加该元素。
- 创建一个LinkedList实例,并将其添加该元素。
- 创建一个HashMap实例(即Map),并将指定字符串作为键值存储在其中(其中Map的键字段设置为address)。
- 最后返回这四个实例。
测试说明
编写完成后进行评测以测试代码是否正确。当测试结果显示与预期一致时视为通过。
www.educoder.net
开始你的任务吧,祝你成功!
package step3;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
public class HelloWorld {
public HashSet getHashSet(){
/********** Begin **********/
HashSet hs=new HashSet();
hs.add("www.educoder.net");
return hs;
/********** End **********/
}
public ArrayList getArrayList(){
/********** Begin **********/
ArrayList al=new ArrayList();
al.add("www.educoder.net");
return al;
/********** End **********/
}
public LinkedList getLinkedList(){
/********** Begin **********/
LinkedList ll=new LinkedList();
ll.add("www.educoder.net");
return ll;
/********** End **********/
}
public Map getHashMap(){
/********** Begin **********/
HashMap hm=new HashMap();
hm.put("address","www.educoder.net");
return hm;
/********** End **********/
}
}
AI助手
第4关:泛型
任务描述
本关任务:使用泛型创建集合对象。
相关知识
为了完成本关任务,你需要掌握:
1.什么是泛型;
2.如何使用泛型。
什么是泛型
那么, 泛型到底是什么呢?简单地说, 泛型就是说它是一种*类型参数*。那什么是类型的参数呢?
我们了解一个方法void hello(String name)一旦声明了一个字符串类型的参数,则调用者必须仅传递String类型的参数才能正确使用此方法;否则就会报错。实际上,在这里泛型的概念被应用于集合数据结构中,即每个指定的数据结构都只能容纳一种特定类型的元素。
在往ATM机中存入资金时,请确保仅放入面值为人民币的纸币(如100元纸钞),而不允许放入非法定货币的纸币。这就是泛型的概念,在编程中我们通常会限定必须使用单一类型的物品。
如何使用泛型
泛型基于一对尖括号进行定义
接下来我们来一个对比评测,看一看使用泛型和不使用泛型的区别。
不使用泛型:
- 初始化为名为
list1的动态数组列表。 - 向
list1中添加字符串"www.educoder.net"。 - 将
list1的第一个元素转换为字符串类型并赋值给变量str1。
使用泛型:
-
将元素
"www.educoder.net"添加到列表中:javalist2.add("www.educoder.net"); -
获取索引为
0的第一个元素赋值给变量str2:javaString str2 = list.get(0); // 可以发现这里不需要强转数据类型
显然,泛型的应用远不止于此。在开发过程中无处不在地应用着泛型,在后续章节中我们将深入探讨这一主题。
你可能会有这样的疑问。你可能会有这样的疑问:为什么选择使用泛型?因为这可以帮助我们实现更加灵活的数据处理功能。具体有哪些优势?包括但不限于以下几点:提升代码复用性、增强功能扩展性以及简化业务逻辑处理等。
基于泛型定义变量的类型限制信息, 编译器能够更有效地增强Java程序的类型安全性.
取消源代码中的强转声明以规避强制类型转换,并对该处进行优化处理以提高代码可读性同时减少潜在错误风险;所有强转操作均为默认且隐藏的;
提高性能。
编程要求
Begin - End
Begin - End
创建一个只能存储String类型数据的List集合;
将程序输入的数据存入List集合中;
输出集合中所有的数据。
提示:list.size()方法可以获取集合的长度。
测试说明
编写完成后,请您点击测评按钮进入测试环节。系统会对您提交的代码进行自动化评估。当您的运行结果与预期相符时,即可完成验证过程。
测试输入:
张三
李四
王五
该集合的第一个数据是张三,
该集合的第二个数据是李四,
该集合的第三个数据是王五。
开始你的任务吧,祝你成功!
package step4;
import java.util.*;
public class HelloWorld {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//程序会输入三次数据
/********** Begin **********/
List<String> list=new ArrayList<String>();
for(int i=0;i<3;i++){
list.add(sc.next());
}
System.out.println("集合的第1个数据为:"+list.get(0));
System.out.println("集合的第2个数据为:"+list.get(1));
System.out.println("集合的第3个数据为:"+list.get(2));
/********** End **********/
}
}
AI助手
