(蓝桥杯软件赛Java研究生组/A组)第一章语言基础-第三节:集合框架
一:数组
(1)概述
在Java中,数组是一种用于存储固定大小、相同类型元素的数据结构。它具有以下特点:
- 固定大小:一旦创建,数组的大小就不能改变。
- 同类型元素:数组中的所有元素必须是相同的数据类型。
- 连续内存分配:数组中的元素在内存中是连续存储的,这有助于快速访问和操作数组元素。
- 零索引:数组的索引从0开始,第一个元素的索引是0,第二个是1,以此类推。
在使用数组时,我们可以声明、初始化和访问数组元素,可以获取数组的长度,并且可以进行多维数组的创建。另外,数组也可以作为方法的参数传递
// 声明并分配了长度为5的整型数组
int[] arr = new int[5];
// 声明并初始化整型数组
int[] arr2 = {1, 2, 3, 4, 5};
// 访问数组元素
int firstElement = arr2[0]; // 访问第一个元素
// 获取数组的长度
int length = arr2.length;
// 声明并分配了一个3x3的二维数组
int[][] matrix = new int[3][3];
(2)Java.util.Arrays
在Java中,java.util.Arrays类提供了许多有用的方法来操作数组。这些方法包括数组的排序、搜索、复制等操作。以下是java.util.Arrays类的一些常用方法:
- . 排序(Sorting):
sort(int[] array): 对指定的整型数组进行升序排序。sort(T[] array): 对指定的对象数组进行升序排序(需要数组中的元素实现Comparable接口)。sort(int[] array, int fromIndex, int toIndex): 对指定的整型数组的指定范围进行升序排序。sort(T[] array, Comparator<? super T> c): 使用指定的比较器对对象数组进行排序。
- 搜索(Searching):
binarySearch(int[] array, int key): 使用二分查找算法在指定的整型数组中搜索指定的值。binarySearch(T[] array, T key): 使用二分查找算法在指定的对象数组中搜索指定的值。binarySearch(int[] array, int fromIndex, int toIndex, int key): 在指定范围内使用二分查找算法搜索指定的值。binarySearch(T[] array, int fromIndex, int toIndex, T key, Comparator<? super T> c): 在指定范围内使用指定的比较器进行二分查找。
- 复制(Copying):
copyOf(boolean[] original, int newLength): 复制指定的boolean数组,截取或填充0(false)以使副本具有指定的长度。copyOf(int[] original, int newLength): 复制指定的int数组,截取或填充0以使副本具有指定的长度。copyOf(T[] original, int newLength): 复制指定的对象数组,截取或填充null以使副本具有指定的长度。
- 数组填充(Filling):
fill(int[] array, int val): 使用指定的值填充整型数组的所有元素。fill(int[] array, int fromIndex, int toIndex, int val): 使用指定的值填充整型数组的指定范围内的元素。
- 数组转换为列表(Converting to List):
asList(T... a): 将指定数组转换为列表。
- 数组比较(Comparing):
equals(Object[] a, Object[] a2): 比较两个对象数组是否相等
关于降序排序
import java.util.Arrays;
import java.util.Comparator;
public class ArrayDescendingSortingExample {
public static void main(String[] args) {
Integer[] numbers = {5, 2, 8, 1, 9, 3};
System.out.println("Before sorting: " + Arrays.toString(numbers));
// 使用自定义的比较器进行降序排序
Arrays.sort(numbers, new Comparator<Integer>() {
@Override
public int compare(Integer num1, Integer num2) {
return num2.compareTo(num1); // 降序排序
}
});
System.out.println("After sorting: " + Arrays.toString(numbers));
}
}
更为简单的lambda表达式写法
// 升序
Arrays.sort(arr, (o1,o2)->o1-o2);
// 降序
Arrays.sort(arr, (o1,o2)->o2-o1);
二:List
在Java中,List是一个接口,它继承自Collection接口,代表了一个有序的集合,允许存储重复元素。List接口的实现类包括ArrayList、LinkedList、Vector等,其中ArrayList是最常用的
- 有序性:
List中的元素按照它们被插入的顺序进行存储,并且可以通过索引访问元素 - 允许重复元素:
List中可以存储重复的元素 - 可变大小:
List的大小可以根据需要动态改变,可以添加、删除、插入元素 - 索引访问: 可以通过索引来访问
List中的元素,索引从0开始 - Iterator遍历: 可以使用迭代器(Iterator)来遍历
List中的元素 - 替代数组:
List通常被用作数组的替代,因为它提供了更灵活的功能,如动态大小调整和更多的操作方法 - 支持泛型:
List支持泛型,可以指定存储的元素类型,提高了类型安全性和代码可读性
import java.util.ArrayList;
import java.util.List;
public class ListExample {
public static void main(String[] args) {
// 创建一个ArrayList对象
List<String> myList = new ArrayList<>();
// 添加元素到列表
myList.add("Apple");
myList.add("Banana");
myList.add("Orange");
// 访问列表中的元素
System.out.println("Elements in the list:");
for (String element : myList) {
System.out.println(element);
}
// 在指定位置插入元素
myList.add(1, "Grape");
// 移除指定位置的元素
myList.remove(2);
// 获取列表的大小
int size = myList.size();
System.out.println("Size of the list: " + size);
// 检查列表是否包含某个元素
boolean containsBanana = myList.contains("Banana");
System.out.println("List contains Banana: " + containsBanana);
}
}
另外对集合排序和数组差不多,使用Collection.sort()
package environment;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
numbers.add(9);
numbers.add(3);
System.out.println("Before sorting: " + numbers);
// 使用 Collections.sort() 对集合进行排升序
Collections.sort(numbers);
// 使用 Collections.sort() 对集合进行排降序(方法1)
Collections.sort(numbers, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
// 使用 Collections.sort() 对集合进行排降序(方法2)
Collections.sort(numbers, (o1,o2)->(o2-o1));
System.out.println("After sorting: " + numbers);
}
}
三:Set
在Java中,Set是一个接口,它继承自Collection接口,代表了一种不允许包含重复元素的集合。Set接口的实现类通常包括HashSet、TreeSet、LinkedHashSet等
- 不允许重复元素:
Set中不允许包含重复的元素,即集合中的每个元素都是唯一的 - 无序性:
Set中的元素没有特定的顺序,即集合中的元素不按照它们被插入的顺序进行存储 - 可包含null元素:
Set中可以包含一个null元素,但不能包含多个 - 基于哈希表或树结构实现: 不同的
Set实现类可能使用不同的底层数据结构来存储元素。例如,HashSet使用哈希表实现,TreeSet使用红黑树实现 - 高效的查找操作:
Set提供了高效的查找操作,可以快速判断一个元素是否存在于集合中 - 不可变性: 一旦创建了
Set对象,其内容不能被更改。但是可以向集合中添加或删除元素 - 用于去重和快速查找:
Set常用于去重操作,即从一个包含重复元素的集合中去除重复元素。另外,由于Set提供了快速的查找操作,它也经常用于快速查找某个元素是否存在于集合中
import java.util.HashSet;
import java.util.Set;
public class SetExample {
public static void main(String[] args) {
// 创建一个HashSet对象
Set<String> set = new HashSet<>();
// 添加元素到集合
set.add("Apple");
set.add("Banana");
set.add("Orange");
set.add("Apple"); // 尝试添加重复元素
// 输出集合的内容
System.out.println("Set: " + set);
// 检查集合中是否包含某个元素
boolean containsOrange = set.contains("Orange");
System.out.println("Set contains Orange: " + containsOrange);
// 删除集合中的元素
set.remove("Banana");
System.out.println("Set after removing Banana: " + set);
}
}
四:Map
Java 中的 Map 是一种键值对的集合,常用于存储和操作数据,其中每个键都是唯一的,但值可以重复。Map 接口提供了丰富的方法,使得可以方便地添加、获取、移除和遍历键值对数据。常用的实现类包括 HashMap、TreeMap 和 LinkedHashMap
- put(key, value):将指定的值与指定的键关联,并将其放入 Map 中。
- get(key):返回指定键所映射的值,如果 Map 中不包含该键,则返回 null。
- containsKey(key):如果 Map 包含指定键的映射关系,则返回 true。
- containsValue(value):如果 Map 中至少包含一个指定值的映射关系,则返回 true。
- remove(key):从 Map 中移除指定键的映射关系。
- keySet():返回 Map 中所有键的 Set 视图。
- values():返回 Map 中所有值的 Collection 视图。
- entrySet():返回 Map 中所有键值对的 Set 视图
- getOrDefault(key, default):找到就用找到的,没有的话就用default
import java.util.*;
public class MapExample {
public static void main(String[] args) {
// 创建一个 HashMap 实例
Map<String, Integer> map = new HashMap<>();
// 添加键值对
map.put("apple", 10);
map.put("banana", 5);
map.put("orange", 8);
// 获取键对应的值
Integer appleCount = map.get("apple");
System.out.println("Number of apples: " + appleCount);
// 检查是否包含指定键
if (map.containsKey("banana")) {
System.out.println("Map contains key 'banana'");
}
// 检查是否包含指定值
if (map.containsValue(8)) {
System.out.println("Map contains value 8");
}
// 移除指定键的映射关系
map.remove("orange");
// 遍历键的集合
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println("Key: " + key);
}
// 遍历值的集合
Collection<Integer> values = map.values();
for (Integer value : values) {
System.out.println("Value: " + value);
}
// 遍历键值对的集合
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for (Map.Entry<String, Integer> entry : entrySet) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
}
}
五:Stack
在 Java 中,Stack 类表示了一个后进先出(LIFO)的对象堆栈。它继承自 Vector 类,因此拥有 Vector 的所有特性,但是在使用时更适合作为栈来使用。Stack 类提供了一组方法,可以让你轻松地将对象推入栈顶、从栈顶弹出对象、查看栈顶的对象等操作
- push(E item):将指定的元素推入栈顶。
- pop():移除并返回栈顶的元素。
- peek():返回但不移除栈顶的元素。
- empty():判断栈是否为空。
- search(Object o):在栈中查找指定元素,并返回其相对于栈顶的位置
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
// 创建一个 Stack 实例
Stack<String> stack = new Stack<>();
// 将元素推入栈顶
stack.push("Java");
stack.push("Python");
stack.push("JavaScript");
// 查看栈顶的元素
String topElement = stack.peek();
System.out.println("Top element: " + topElement);
// 移除并返回栈顶的元素
String poppedElement = stack.pop();
System.out.println("Popped element: " + poppedElement);
// 判断栈是否为空
boolean isEmpty = stack.empty();
System.out.println("Is stack empty? " + isEmpty);
// 查找元素在栈中的位置
int position = stack.search("Java");
System.out.println("Position of 'Java' in the stack: " + position);
}
}
六:Queue
在 Java 中,Queue(队列)是一种常用的数据结构,它按照先进先出(FIFO)的原则进行元素的插入和删除操作。Java 中的 Queue 接口表示了这种数据结构,它提供了一组方法,可以轻松地对队列进行操作
- add(E e):将指定的元素插入到队列尾部,如果队列已满,则抛出 IllegalStateException 异常。
- offer(E e):将指定的元素插入到队列尾部,如果队列已满,则返回 false。
- remove():移除并返回队列头部的元素,如果队列为空,则抛出 NoSuchElementException 异常。
- poll():移除并返回队列头部的元素,如果队列为空,则返回 null。
- element():返回队列头部的元素,但不移除它,如果队列为空,则抛出 NoSuchElementException 异常。
- peek():返回队列头部的元素,但不移除它,如果队列为空,则返回 null。
Queue 接口有多种实现,其中常用的包括:
- LinkedList:LinkedList 类实现了 Queue 接口,因此可以用作队列。它是一个双端链表,因此在队列的两端都可以进行元素的插入和删除操作。
- ArrayDeque:ArrayDeque 类也实现了 Queue 接口,并且通常比 LinkedList 在大多数情况下都更高效。它是一个基于数组的双端队列
import java.util.*;
public class QueueExample {
public static void main(String[] args) {
// 创建一个 LinkedList 实例作为队列
Queue<String> queue = new LinkedList<>();
// 将元素插入队列尾部
queue.offer("Java");
queue.offer("Python");
queue.offer("JavaScript");
// 获取并移除队列头部的元素
String headElement = queue.poll();
System.out.println("Removed element: " + headElement);
// 获取队列头部的元素(不移除)
String peekElement = queue.peek();
System.out.println("Peeked element: " + peekElement);
// 遍历队列中的所有元素
System.out.println("Queue elements:");
for (String element : queue) {
System.out.println(element);
}
}
}
更多推荐


所有评论(0)