【Java】第7章 集合


第7章 集合

1. 集合概述

1.1 什么是集合

集合是为了存储不同类型的多个对象,Java提供了一系列特殊的类,这些类可以存储任意类型的对象,并且存储的长度可变,被统称为集合。集合可以简单理解为一个长度可变,可以存储不同数据类型的动态数组。

1.2 集合的核心继承体系

Java集合体系主要包含以下几个核心接口:

  • Collection:最基本的集合接口,用于存储一组无序、不唯一的对象。
  • List:继承自Collection接口,用于存储一组有序、不唯一的对象。
  • Set:继承自Collection接口,用于存储一组无序、唯一的对象。
  • Map:与Collection接口不同,用于存储一组键值对象。

2. Collection接口

2.1 Collection接口概述

Collection接口是Java单列集合中的根接口,定义了各种具体单列集合的共性。

2.2 Collection接口常用方法

Collection<String> collection = new ArrayList<>();
collection.add("Java");
collection.add("Python");
collection.addAll(Arrays.asList("C++", "JavaScript"));

collection.remove("Python");
collection.removeAll(Arrays.asList("C++", "JavaScript"));

System.out.println(collection.isEmpty()); // false
System.out.println(collection.contains("Java")); // true
System.out.println(collection.containsAll(Arrays.asList("Java", "JavaScript"))); // false

Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
System.out.println(collection.size()); // 1

输出结果:

false
true
false
Java
1

3. List接口

3.1 List接口的特点

List接口继承自Collection接口,可以存储重复的元素,所有元素以线性方式进行存储,可以通过索引访问。

3.2 List接口常用方法

List<String> list = new ArrayList<>();
list.add("Java");
list.add(1, "Python");
list.addAll(1, Arrays.asList("C++", "JavaScript"));

String element = list.get(1); // Python
list.remove(1); // 移除Python

list.set(0, "Kotlin");

System.out.println(list.indexOf("Java")); // 0
System.out.println(list.lastIndexOf("Java")); // -1

List<String> subList = list.subList(1, 3);
System.out.println(subList); // [C++, JavaScript]

输出结果:

Python
0
-1
[C++, JavaScript]

4. ArrayList和LinkedList

4.1 ArrayList

ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
arrayList.add("Java");

System.out.println(arrayList); // [Java, Python, Java]

输出结果:

[Java, Python, Java]

4.2 LinkedList

LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Java");
linkedList.addFirst("Python");
linkedList.addLast("JavaScript");

System.out.println(linkedList); // [Python, Java, JavaScript]
System.out.println(linkedList.getFirst()); // Python
System.out.println(linkedList.getLast()); // JavaScript

输出结果:

[Python, Java, JavaScript]
Python
JavaScript

5. Set接口

5.1 Set接口概述

Set接口继承自Collection接口,保证元素唯一性。

5.2 HashSet

HashSet<String> hashSet = new HashSet<>();
hashSet.add("Java");
hashSet.add("Python");
hashSet.add("Java"); // 重复元素,不会被添加

System.out.println(hashSet); // [Java, Python]

输出结果:

[Java, Python]

5.3 LinkedHashSet

LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Java");
linkedHashSet.add("Python");
linkedHashSet.add("JavaScript");

System.out.println(linkedHashSet); // [Java, Python, JavaScript]

输出结果:

[Java, Python, JavaScript]

5.4 TreeSet

TreeSet<String> treeSet = new TreeSet<>();
treeSet.add("Java");
treeSet.add("Python");
treeSet.add("JavaScript");

System.out.println(treeSet); // [Java, JavaScript, Python]

输出结果:

[Java, JavaScript, Python]

6. Map接口

6.1 Map接口概述

Map接口是一种双列集合,存储键值对。

6.2 HashMap

HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("Java", "Island");
hashMap.put("Python", "Cobra");
hashMap.put("Java", "SE"); // 替换已有键的值

System.out.println(hashMap); // {Java=SE, Python=Cobra}

输出结果:

{Java=SE, Python=Cobra}

6.3 LinkedHashMap

LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("Java", "Island");
linkedHashMap.put("Python", "Cobra");
linkedHashMap.put("JavaScript", "Spider");

System.out.println(linkedHashMap); // {Java=Island, Python=Cobra, JavaScript=Spider}

输出结果:

{Java=Island, Python=Cobra, JavaScript=Spider}

6.4 TreeMap

TreeMap<String, String> treeMap = new TreeMap<>();
treeMap.put("Java", "Island");
treeMap.put("Python", "Cobra");
treeMap.put("JavaScript", "Spider");

System.out.println(treeMap); // {Java=Island, JavaScript=Spider, Python=Cobra}

输出结果:

{Java=Island, JavaScript=Spider, Python=Cobra}

6.5 Properties

Properties properties = new Properties();
properties.setProperty("name", "Kimi");
properties.setProperty("version", "1.0");

System.out.println(properties.getProperty("name")); // Kimi
System.out.println(properties.getProperty("version")); // 1.0

输出结果:

Kimi
1.0

7. Collections和Arrays工具类

7.1 Collections工具类

List<String> list = new ArrayList<>(Arrays.asList("Java", "Python", "JavaScript", "C++"));
Collections.reverse(list);

System.out.println(list); // [C++, JavaScript, Python, Java]

输出结果:

[C++, JavaScript, Python, Java]

7.2 Arrays工具类

int[] array = {1, 2, 3, 4, 5};
Arrays.sort(array);

System.out.println(Arrays.toString(array)); // [1, 2, 3, 4, 5]

输出结果:

[1, 2, 3, 4, 5]

8. Lambda表达式

8.1 Lambda表达式概述

Lambda表达式用于简化代码,取代匿名内部类。

8.2 Lambda表达式示例

List<String> list = new ArrayList<>(Arrays.asList("Java", "Python", "JavaScript", "C++"));
list.forEach(e -> System.out.println(e));

输出结果:

Java
Python
JavaScript
C++

9. 上机练习

9.1 ArrayList和HashSet练习

  • 统计字符串中各个字符的数量
    题目:利用键盘录入,输入一个字符串,统计该字符串中各个字符的数量
    如用户输入字符串:“hello world java”,程序输出结果:h(1)e(1)l(3)o(2) (2)w(1)r(1)d(1)j(1)a(2)v(1)。
    (1)创建键盘输入对象
    (2)使用nextLine从键盘中读取一行内容
    (3)将字符串转换成字符数组
    (4)创建map集合,用来存放字符:key是字符 value是字符出现的个数
    (5)遍历字符数组
    (6)拿到每个字符,去map中查看是否有保存对应的次数
    (7)如果这个字符没有保存次数,就设置为1次
    (8)如果这个字符有保存次数,就设置为原来的次数+1次
    (9)按题目要求拼接字符串
    (10)输出结果

代码示例:统计字符串中各个字符的数量

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class CharacterCount {
    public static void main(String[] args) {
        // (1)创建键盘输入对象
        Scanner scanner = new Scanner(System.in);

        // (2)使用nextLine从键盘中读取一行内容
        System.out.println("Please enter a string:");
        String input = scanner.nextLine();

        // (3)将字符串转换成字符数组
        char[] characters = input.toCharArray();

        // (4)创建map集合,用来存放字符:key是字符,value是字符出现的个数
        Map<Character, Integer> charCountMap = new HashMap<>();

        // (5)遍历字符数组
        for (char c : characters) {
            // (6)拿到每个字符,去map中查看是否有保存对应的次数
            // (7)如果这个字符没有保存次数,就设置为1次
            // (8)如果这个字符有保存次数,就设置为原来的次数+1次
            charCountMap.put(c, charCountMap.getOrDefault(c, 0) + 1);
        }

        // (9)按题目要求拼接字符串
        for (Map.Entry<Character, Integer> entry : charCountMap.entrySet()) {
            System.out.println(entry.getKey() + "(" + entry.getValue() + ")");
        }

        // (10)输出结果
        // 结果将显示类似: h(1)e(1)l(3)o(2)w(1)r(1)d(1)j(1)a(2)v(1)
    }
}

使用说明:

  1. 运行程序。
  2. 根据提示输入字符串,例如:“hello world java”。
  3. 观察输出结果,程序将统计并显示每个字符及其出现的次数。

预期输出示例:

Please enter a string:
h(1)e(1)l(3)o(2)w(1)r(1)d(1)j(1)a(2)v(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浪里个浪的1024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值