java高级特性 集合框架 educoder

本文介绍了Java集合框架的使用,包括创建、添加、修改和删除元素,对比了集合与数组的区别,并探讨了为何使用集合。文章还提到了集合的两大家族:Collection和Map,分别介绍了List、Set、LinkedList、HashSet以及HashMap的使用。此外,文章阐述了泛型的概念,解释了泛型在集合中限制元素类型的作用,并展示了使用泛型的优势。

JAVA中的集合:是一个工具类,就像是容器,存储任意数量具有共同属性的集合。

例如:购物车是商品的集合,军队是军人的集合。
为什么使用集合

我们已经知道集合就是能存储大量数据的一个容器,但是咱们在Java入门的时候学过数组,数组也是一个能存储大量数据的容器,好像也可以满足日常开发的需求,那我们为什么要使用集合呢?

如果说之前学习的数组是一根打狗棒的话,那我们将要学习的集合就可以看做是一根如意金箍棒了。

集合和数组有如下区别:

数组的长度固定,集合的长度可变;

数组只能通过下标访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象。

怎么创建集合

我们来创建一个简单的集合:

1.导包

import java.util.ArrayList;

2.创建集合

ArrayList list = new ArrayList();

如何向集合中添加数据

list.add("hello");
list.add(2018);
获取集合中的数据

使用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)?
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要移动指针。

面试官:嗯,这次算你过关,等下次通知吧!

我:……

什么是泛型

什么是泛型呢?简单的来说,泛型可以理解为:类型参数,那什么又是类型参数呢?

我们知道一个方法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<String> list2 = new ArrayList<String>();
list2.add("www.educoder.net");
String str2 = list.get(0);    //可以发现在这里我们不用强转数据类型了

当然泛型不仅仅只有这么一点用途,在开发中处处可见泛型,在之后的章节中我们会更深一步的了解。

可能你会有疑问,为什么我要使用泛型啊,使用泛型有什么好处呢?
答:好处如下:

类型安全,通过知道使用泛型定义的变量的类型限制,编译器可以更有效地提高Java程序的类型安全;

消除强制类型转换,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。所有的强制转换都是自动和隐式的;

提高性能。

Map集合的特点

有三点需要你记住:

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够根据key快速查找value;

键(key)值不可重复,值(value)是可以的,通过key可以查找value;

Map支持泛型,形式如:Map<K,V>。

如何操作Map集合

1.定义和添加数据:Map集合支持泛型,所以我们定义的时候一般会带有泛型,公式:Map<K,V>,K和V可以是指定为任何对象,注意:泛型指的是类,也就是K和V只能是对象而不能是基础数据类型。

2.删除、修改和获取数据。

Map<String,String> map = new HashMap<String,String>();
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=男}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一介书生-007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值