简介
Java
集合框架对于数据的操作提供了良好的接口,是Java
语言中非常普遍,也是非常重要的部分,熟练掌握很重要。 本实训将从整个集合框架的体系介绍重要的集合框架类,及其基本原理和使用方法。
任务描述
本关任务:创建集合并添加数据。
相关知识
为了完成本关任务你需要知道:
1.集合是什么;
2.为什么使用集合;
3.怎么创建集合;
4.如何向集合中添加数据。
集合是什么
JAVA
中的集合:是一个工具类,就像是容器,存储任意数量具有共同属性的集合。
例如:购物车是商品的集合,军队是军人的集合。
为什么使用集合
我们已经知道集合就是能存储大量数据的一个容器,但是咱们在Java入门的时候学过数组,数组也是一个能存储大量数据的容器,好像也可以满足日常开发的需求,那我们为什么要使用集合呢?
如果说之前学习的数组是一根打狗棒的话,那我们将要学习的集合就可以看做是一根如意金箍棒了。
集合和数组有如下区别:
数组的长度固定,集合的长度可变;
数组只能通过下标访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象。
怎么创建集合
我们来创建一个简单的集合:
1.导包
import java.util.ArrayList;
2.创建集合
ArrayList list = new ArrayList();
如何向集合中添加数据
list.add("hello");
list.add(2018);
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,创建ArrayList
集合并且向集合中添加数据,具体要求如下:
添加字符串类型数据: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 **********/
}
}
任务描述
本关任务:完成对集合中数据的增删改查。
相关知识
为了完成本关任务,你需要学习:
1.怎么获取集合中的数据;
2.怎么修改集合中的数据;
3.怎么删除集合中的数据。
获取集合中的数据
使用get(index)
即可获取集合中的数据,和数组相同,index
为角标,从0开始。 例如:
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);
输出:
姓名:张无忌 年龄:18
看到这里你可能会有疑问:
String name = (String)list.get(0);
为什么使用集合的get()
方法获取到数据之后还需要(String)
强转数据类型呢?
这是因为我们在定义集合的时候并没有给定一个数据类型,所以集合中的元素,可以是任意类型的对象(Object
),如果把某个对象放入集合,则会忽略它的类型,而把它当做Object
类处理。
这样我们在从集合中获取数据的时候,默认也会将它看做是Object
类型,所以我们在使用的时候需要强转成对应类型。
修改集合中的数据
使用set(index, element)
方法即可修改集合中的数据,第一个参数代表索引,即修改集合第几个位置的元素,index
从0
开始,第二个参数element
是要修改的数据。
例如:
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 = new ArrayList();
list.add("张无忌");
list.add(18);
//List集合的toString可以输出数组中所有的数据
System.out.println(list.toString());
Object obj1 = list.get(0);
list.remove(obj1); //根据元素的引用删除元素
System.out.println(list.toString());
list.remove(0); //根据索引删除元素
System.out.println(list.toString());
输出:
[张无忌, 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
提示,获取数组的长度:
ArrayList list = new ArrayList();
list.add(1);
list.add(3);
System.out.println(list.size());
输出: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
任务描述
本关任务:定义四种开发中常用的集合并添加数据。
相关知识
为了完成本关任务,你需要掌握:
1.集合的体系结构;
2.如何创建常见的集合。
在前两个关卡中我们学习的ArrayList
集合只是集合的一个部分,Java
中的集合可没那么简单呢,Java
中的集合是一个大家族,接下来我们就来见识一下这个家族吧。
集合的体系结构
Java
中的集合分为两大家族,一个是Collection
家族,Collection
家族有三大成员:List
、Queue
、Set
,这三大成员有三个子类(实际还有很多,这里不一一列举)分别是,ArrayList
,LinkedList
,HashSet
,这个家族有一个特点,那就是他们都是单身,集合中的元素都是独立存在的。
另一个就是Map
家族了,这个家族的特点就是他们都是成双成对(key
和value
)一起出现的,让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","张三");
以上就是创建几个常用集合创建实例并添加数据的方式,可以看到我们使用的方式除了LinkedList
之外都是父类的引用指向子类对象,相信你还不陌生,这个我们在学习多态这个知识点的时候讲过,这种方式可以大大的提高程序的可扩展性。
通过上述代码可以发现Map
集合添加数据和Collection
家族成员添加数据的方式不一样,Map
集合添加数据必须有两个,即一个是Key
一个是Value
。
面试官
Duang Duang Duang
面试官来啦,快坐好,摆好姿势。
好了,我要开始提问了: 问:Set
集合与List
集合有什么区别呢? 答:Set
集合中的数据不可重复,数据是无序的,List
集合的数据可以重复,数据是有序的。
问:就没啦?[严肃脸] 答:哦哦,还有,Set
检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变,List
和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List
的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变。
问:Map
集合中的元素可以重复吗? 答:不可以!
问:你说一说,LinkedList
和ArrayList
的区别吧。 答:好嘞,LinkedList
集合增删速度更快,ArrayList
改查更快。
问:咳咳咳,下一位! 答:诶诶诶,别呀,我还没说完呢:
ArrayList
是实现了基于动态数组的数据结构,LinkedList
基于链表的数据结构。LinkedList
是双向链表。get
和set
,ArrayList
觉得优于LinkedList
,因为LinkedList
要移动指针。面试官:嗯,这次算你过关,等下次通知吧!
我:……
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
HashSet
、ArrayList
、LinkedList
、HashMap
集合。并向每一个集合中添加www.educoder.net
,Map
集合的key
设置为address
,最后将每一个集合返回。测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入:无
预期输出: www.educoder.net
www.educoder.net
www.educoder.net
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 **********/
}
}
任务描述
本关任务:使用泛型创建集合对象。
相关知识
为了完成本关任务,你需要掌握: 1.什么是泛型;
2.如何使用泛型。
什么是泛型
什么是泛型呢?简单的来说,泛型可以理解为:类型参数,那什么又是类型参数呢?
我们知道一个方法void hello(String name)
如果指定了一个字符串类型的参数,那方法的调用者就只能传递String
类型的参数才能正确的使用这个方法了,否则就报错,其实泛型也是一样,只不过在这里泛型用在集合上,即指定集合中只能放某一种类型的元素。
你要往ATM
机中存钱,就只能放毛爷爷,而不能放冥币,这就是泛型,指定只能用一种类型。
如何使用泛型
泛型使用的是一对尖括号定义的,如:List
指定的就是在List
集合中只能放String
类型的数据。
接下来我们来一个对比评测,看一看使用泛型和不使用泛型的区别。
不使用泛型:
List list1 = new ArrayList();
list1.add("www.educoder.net");
String str1 = (String)list1.get(0);
使用泛型:
List list2 = new ArrayList();
list2.add("www.educoder.net");
String str2 = list.get(0); //可以发现在这里我们不用强转数据类型了
当然泛型不仅仅只有这么一点用途,在开发中处处可见泛型,在之后的章节中我们会更深一步的了解。
可能你会有疑问,为什么我要使用泛型啊,使用泛型有什么好处呢? 答:好处如下:
类型安全,通过知道使用泛型定义的变量的类型限制,编译器可以更有效地提高Java程序的类型安全;
消除强制类型转换,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。所有的强制转换都是自动和隐式的;
提高性能。
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
创建一个只能存储String
类型数据的List
集合;
将程序输入的数据存入List
集合中;
输出集合中所有的数据。
提示:list.size()
方法可以获取集合的长度。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
测试输入: 张三
李四
王五
预期输出: 集合的第1个数据为:张三
集合的第2个数据为:李四
集合的第3个数据为:王五
开始你的任务吧,祝你成功!
package step4;
import java.util.*;
public class HelloWorld {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//程序会输入三次数据
/********** Begin **********/
List 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));
/********** End **********/
}
}
任务描述
本关任务:对Map
集合进行增删改查操作。
相关知识
为了完成本关任务,你需要掌握: 1.Map
集合的特点;
2.如何操作Map
集合。
Map集合的特点
有三点需要你记住:
Map
提供了一种映射关系,其中的元素是以键值对(key-value
)的形式存储的,能够根据key
快速查找value
;
键(key
)值不可重复,值(value
)是可以的,通过key
可以查找value
;
Map
支持泛型,形式如:Map
。
如何操作Map集合
1.定义和添加数据:Map
集合支持泛型,所以我们定义的时候一般会带有泛型,公式:Map
,K
和V
可以是指定为任何对象,注意:泛型指的是类,也就是K
和V
只能是对象而不能是基础数据类型。
2.删除、修改和获取数据。
Map map = new HashMap();
map.put("name","张三");
map.put("sex","男");
System.out.println("姓名:" + map.get("name") + "性别:" + map.get("sex"));
//修改数据 使用 map.put(key) 方法
map.put("name","李四");//因为key不能重复,所以修改数据和添加数据使用的同一个方法
System.out.println("姓名:" + map.get("name") + "性别:" + map.get("sex"));
//删除数据 使用 map.remove(key)方法
map.remove("name");
System.out.println(map.toString());//map.toString方法可以直接输出map集合中的数据
输出结果:
姓名:张三性别:男
姓名:李四性别:男
{sex=男}
编程要求
请仔细阅读右侧代码,根据方法内的提示,在Begin - End
区域内进行代码补充,具体任务如下:
向menuDict
集合中添加一道菜名lamb
,它的价格是50
;
获取menuDict
集合中的fish
的价格并打印出来;
将menuDict
集合中的fish
的价格改为100
;
删除menuDict
集合中noodles
这道菜;
输出新的menuDict
菜单。
测试说明
补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。
pizza
40
noodles
30
carrot
20
turkey
34
fish
37
预期输出:
37
{pizza=40,turkey=34,fish=100,lamb=50,carrot=20}
开始你的任务吧,祝你成功!
package step5;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
Map menuDict = new HashMap<>();
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 5; i++) {
menuDict.put(sc.next(),sc.nextInt());
}
/********** Begin **********/
menuDict.put("lamb",50);
System.out.println(menuDict.get("fish"));
menuDict.put("fish",100);
menuDict.remove("noodles");
System.out.println(menuDict.toString());
/********** End **********/
}
}
任务描述
本关任务:根据所学知识完成选择测试题。
1.
在Java中,以下( C )类的对象以键值对(key-value)的方式存储对象
A、java.util.List
B、java.util.ArrayList
C、java.util.HashMap
D、java.util.LinkedList