Java入门系列教程#8 集合与Map
本文最后更新于 775 天前,其中的信息可能已经有所发展或是发生改变。

上一课学习了数组,那么这一节来学习一下集合和Map。

由一个或多个确定的元素所构成的整体被称为集合,集合具有无序性,但是Java内的集合多种多样,下面我们一起来学习Java中常用的集合。

学习目标

  1. 掌握ArrayList、HashSet的使用
  2. 掌握HashMap的使用

集合的好处

我们知道,数组有一个固定的长度,一旦固定下来,就不可更改了。

而集合的出现,正好解决了这个问题,而且Java的集合类还提供了很多实用的方法,方便我们对一个数组进行各种操作,下面我们一起先来了解一下Collection类。

Collection类

观察下面一幅图,箭头指向的是它们的父类,比如右下叫的ArrayList,它的父类是AbstractList,而AbstractList的父类是AbstractCollection。

最终,所有类的父类都指向了Collection,因此,它是Java集合类的顶级类。

在Collection下有Set、List、Queue三个子类,本期先学习Set和List,Queue日后再谈。

Collection类的常用方法

  • boolean add(E e) 向集合添加元素e,若指定集合元素改变了则返回true
  • boolean addAll(Collection c) 把集合C中的元素全部添加到集合中,若指定集合元素改变返回true
  • void clear() 清空所有集合元素
  • boolean contains(Object o) 判断指定集合是否包含对象o
  • boolean containsAll(Collection c) 判断指定集合是否包含集合c的所有元素
  • boolean isEmpty() 判断指定集合的元素size是否为0
  • boolean remove(Object o) 删除集合中的元素对象o,若集合有多个o元素,则只会删除第一个元素
  • boolean removeAll(Collection c) 删除指定集合包含集合c的元素
  • boolean retainAll(Collection c) 从指定集合中保留包含集合c的元素,其他元素则删除
  • int size() 集合的元素个数
  • T[] toArray(T[] a) 将集合转换为T类型的数组

这些方法我们会在下面的学习中逐个介绍,不管是List还是Set,它们也是最常用到的方法。

ArrayList

ArrayList是List的一种,还有另一种LinkedList,本期主要学习ArrayList的使用。

声明ArrayList

首先我们先声明一个变量:

List<String> arrayList = new ArrayList<>();

像上面这样,我们就声明了一个String类型的ArrayList。

概括出它的语法:List<数据类型> 变量名 = new ArrayList<>();

我们可以试着声明一个int类型的List:

List<Integer> arrayList = new ArrayList<>();
注意:数据类型不能使用int、float、double等基本数据类型,必须使用它们的封装类。对应的是Integer、Float、Double、Boolean、Short、Long、String。

添加/获取/删除元素

添加元素很简单,用 变量名.add(元素) 即可。

public static void main(String[] args) {
    List<Integer> arrayList = new ArrayList<>();
    arrayList.add(233);
    arrayList.add(16);
}

像这样,我们就给这个List添加了两个元素。

等同于一个长度为2的一维数组,List的添加顺序是添加到最后。

也就是说,这个List的第一个元素是233,第二个元素是16,对应的下标分别是0和1。

我们来试着获取一个元素,仍然用上面的List举例,我们试着获取第二个元素16:

public static void main(String[] args) {
    List<Integer> arrayList = new ArrayList<>();
    arrayList.add(233);
    arrayList.add(16);
    System.out.println(arrayList.get(1));
}

输出的结果就是16,这里我们就用了get方法。

接着我们试着删除第一个元素,再获取第二个元素试试看。

public static void main(String[] args) {
    List<Integer> arrayList = new ArrayList<>();
    arrayList.add(233);
    arrayList.add(16);
    arrayList.remove(0); // 移除下标为0的元素 即第一个元素
}
注意:remove()方法有两种,一种是传入下标,另一种是传入集合中的一个元素。这里的remove另一种写法就是arrayList.remove(new Integer(233)); 也就是传入一个在列表中的元素,这里只要学会用下标移除元素即可。

现在我们再试着获取一下第二个元素16,注意现在这个List只有一个元素16,所以这个元素的下标要向前移动一位,也就是从1到0,因为233被移除后,它就是第一项。

public static void main(String[] args) {
    List<Integer> arrayList = new ArrayList<>();
    arrayList.add(233);
    arrayList.add(16);
    arrayList.remove(0);
    System.out.println(arrayList.get(0));
}

所以输出的结果就是16。

是否包含某个元素

若要检查集合中是否存在某一个元素,我们需要用到contains函数,它的返回值是布尔型。

public static void main(String[] args) {
    List<Integer> arrayList = new ArrayList<>();
    arrayList.add(233);
    arrayList.add(16);
    System.out.println("列表中是否存在233" + arrayList.contains(233));
}

// 运行结果

// 列表中是否存在233 > true

将某个集合添加到ArrayList

现在如果有两个ArrayList,分别为a和b,我们要把b的所有元素添加到a后面,也就是a的尾部与b的头部进行拼接,这时我们可以用addAll来实现。

这个操作并不会改变b的元素,可以认为是将b的元素复制一份加载了a后面。

public static void main(String[] args) {
    List<Integer> a = new ArrayList<>();
    a.add(1);
    a.add(3);
    a.add(5);
    
    List<Integer> b = new ArrayList<>();
    b.add(6);
    b.add(10);
    
    a.addAll(b);
}

这里两个List的元素分别由1、3、5和6、10。

当我们使用addAll后,b的所有元素就被添加到了a中,此时a的长度为5,下标最大就是4。

现在我们用get方法来获取一下下标为4的元素:

public static void main(String[] args) {
    List<Integer> a = new ArrayList<>();
    a.add(1);
    a.add(3);
    a.add(5);
    List<Integer> b = new ArrayList<>();
    b.add(6);
    b.add(10);
    a.addAll(b);
    System.out.println(a.get(4));
}

运行结果就是10。

获取集合长度

直接使用 集合变量.size(); 即可。

public static void main(String[] args) {
    List<Integer> a = new ArrayList<>();
    a.add(1);
    a.add(3);
    a.add(5);
    System.out.println("a集合的长度为 > " + a.size());
}
// 运行结果
// a集合的长度为 > 3

HashSet

Set不同于List,最大的特点就是无序性和不重复性,满足数学上的集合。

HashSet没有get方法,因为它是无序的。

因此我们使用add添加元素后,无法获取具体的某个元素,但我们可以用for循环来遍历它,这个方法我们将会在下一课学到。

那么有关于HashSet的各种方法,详见ArrayList的介绍。

HashMap

HashMap是Map的子类,Map不同于集合,它们的对比如下:

Collection中的元素是独立的,使用add将元素一个个添加进去。

Map的键不能重复,而值可以,这类似于函数的性质。x自变量不重复,而y可以由多个x对应。

Map中常用的集合为HashMap集合、LinkedHashMap集合,本期我们学习HashMap。

声明HashMap

和ArrayList一样,也需要用到一个<>来表示数据类型:

public static void main(String[] args) {
    Map<Integer, String> map = new HashMap<>();
}

这里的不同点就是,<>需要传入两个类,第一个是键的数据类型,第二个是值的数据类型。

可以看到,这里的Map是整数对应一个字符串。

Map的常用方法

  • get(Object key) 通过键获取值
  • put(Object key, Object value) 将键值对添加到Map
  • remove(Object key) 移除某个键值对

下面我们来看看它们的用法:

public static void main(String[] args) {
    Map<Integer, String> map = new HashMap<>();
    map.put(0, "这里是0对应的值");
    map.put(192, "这里是192");
}

像这样,我们就传入了两个键值对,接下来我们试着获取它们:

public static void main(String[] args) {
    Map<Integer, String> map = new HashMap<>();
    map.put(0, "这里是0对应的值");
    map.put(192, "这里是192");
    System.out.println(map.get(192));
}

// 运行结果

// 
这里是192

而要移除一个键值对也很简单,使用remove即可:

public static void main(String[] args) {
    Map<Integer, String> map = new HashMap<>();
    map.put(0, "这里是0对应的值");
    map.put(192, "这里是192");
    System.out.println(map.get(192));
    map.remove(192);
    System.out.println(map.get(192));
}

// 运行结果

// 这里是192
// null

观察发现,在移除192之后再尝试获取192对应的值,发现输出的是null空值,说明这个键值对已经被移除了。

课后练习

  1. 声明一个ArrayList和Map,自行练习增删查改。
  2. 集合与Map的区别是什么?
  3. 对于List和Map,你能想到哪些实际应用可以用它们实现?
未经允许禁止转载本站内容,经允许转载后请严格遵守CC-BY-NC-ND知识共享协议4.0,代码部分则采用GPL v3.0协议
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇