文章目录
第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)
}
}
使用说明:
- 运行程序。
- 根据提示输入字符串,例如:“hello world java”。
- 观察输出结果,程序将统计并显示每个字符及其出现的次数。
预期输出示例:
Please enter a string:
h(1)e(1)l(3)o(2)w(1)r(1)d(1)j(1)a(2)v(1)