JAVA集合常用用法及常用函数(这一篇就够了)

我来详细介绍Java刷题过程中常用的集合用法。

一、List接口及实现类

ArrayList

List<Integer> list = new ArrayList<>();
list.add(1);                 // 添加元素
list.add(0, 2);              // 在指定位置添加元素
list.get(0);                 // 获取元素
list.set(1, 3);              // 修改元素
list.remove(0);              // 删除指定位置元素
list.remove(Integer.valueOf(3)); // 删除指定元素
list.contains(1);            // 判断是否包含
list.size();                 // 获取大小
list.isEmpty();              // 判断是否为空
list.clear();                // 清空列表

LinkedList

LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("a");         // 添加元素
linkedList.addFirst("b");    // 添加到头部
linkedList.addLast("c");     // 添加到尾部
linkedList.getFirst();       // 获取头部元素
linkedList.getLast();        // 获取尾部元素
linkedList.removeFirst();    // 删除头部元素
linkedList.removeLast();     // 删除尾部元素
linkedList.poll();           // 检索并删除头部元素(为空返回null)
linkedList.peek();           // 检索但不删除头部元素(为空返回null)

二、Set接口及实现类

HashSet

Set<Character> set = new HashSet<>();
set.add('a');                // 添加元素
set.remove('a');             // 删除元素
set.contains('b');           // 判断是否包含
set.size();                  // 获取大小
set.isEmpty();               // 判断是否为空
set.clear();                 // 清空集合

TreeSet

// 默认升序排列
TreeSet<Integer> treeSet = new TreeSet<>();
// 自定义排序
TreeSet<Integer> customSet = new TreeSet<>((a, b) -> b - a); // 降序
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
treeSet.first();            // 获取最小元素
treeSet.last();             // 获取最大元素
treeSet.lower(2);           // 返回小于指定元素的最大元素
treeSet.higher(2);          // 返回大于指定元素的最小元素
treeSet.floor(2);           // 返回小于等于指定元素的最大元素
treeSet.ceiling(2);         // 返回大于等于指定元素的最小元素

三、Map接口及实现类

HashMap

Map<Integer, String> map = new HashMap<>();
map.put(1, "one");           // 添加键值对
map.get(1);                  // 获取值
map.getOrDefault(2, "unknown"); // 获取值,不存在返回默认值
map.containsKey(1);          // 判断是否包含键
map.containsValue("one");    // 判断是否包含值
map.remove(1);               // 删除键值对
map.size();                  // 获取大小
map.isEmpty();               // 判断是否为空
map.putIfAbsent(1, "one");   // 不存在则添加

// 遍历Map
for (Map.Entry<Integer, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
for (Integer key : map.keySet()) {
    System.out.println(key);
}
for (String value : map.values()) {
    System.out.println(value);
}
 

TreeMap

// 默认键升序排列
TreeMap<Integer, String> treeMap = new TreeMap<>();
// 自定义排序
TreeMap<Integer, String> customMap = new TreeMap<>((a, b) -> b - a); // 键降序
treeMap.put(3, "three");
treeMap.put(1, "one");
treeMap.put(2, "two");
treeMap.firstKey();          // 获取最小键
treeMap.lastKey();           // 获取最大键
treeMap.floorKey(2);         // 返回小于等于指定键的最大键
treeMap.ceilingKey(2);       // 返回大于等于指定键的最小键

四、优先队列

// 默认小顶堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
// 大顶堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);
minHeap.add(3);              // 添加元素
minHeap.add(1);
minHeap.add(2);
minHeap.peek();              // 获取堆顶元素但不删除
minHeap.poll();              // 获取并删除堆顶元素
minHeap.size();              // 获取大小
minHeap.isEmpty();           // 判断是否为空

五、双端队列Deque

Deque<Integer> deque = new ArrayDeque<>();
deque.addFirst(1);           // 添加到队首
deque.addLast(2);            // 添加到队尾
deque.offerFirst(3);         // 添加到队首,有容量限制时返回是否成功
deque.offerLast(4);          // 添加到队尾,有容量限制时返回是否成功
deque.getFirst();            // 获取队首元素
deque.getLast();             // 获取队尾元素
deque.peekFirst();           // 获取队首元素,为空返回null
deque.peekLast();            // 获取队尾元素,为空返回null
deque.removeFirst();         // 移除并返回队首元素
deque.removeLast();          // 移除并返回队尾元素
deque.pollFirst();           // 移除并返回队首元素,为空返回null
deque.pollLast();            // 移除并返回队尾元素,为空返回null

六、集合工具类Collections

List<Integer> list = new ArrayList<>(Arrays.asList(3, 1, 2));
Collections.sort(list);                      // 升序排序
Collections.sort(list, (a, b) -> b - a);     // 自定义排序
Collections.reverse(list);                   // 反转
Collections.shuffle(list);                   // 随机打乱
Collections.swap(list, 0, 1);                // 交换元素
Collections.binarySearch(list, 2);           // 二分查找(需先排序)
Collections.max(list);                       // 最大值
Collections.min(list);                       // 最小值
Collections.fill(list, 0);                   // 填充

七、数组工具类Arrays

int[] arr = {3, 1, 2};
Arrays.sort(arr);                            // 升序排序
Arrays.sort(arr, 0, 2);                      // 部分排序
Arrays.binarySearch(arr, 2);                 // 二分查找(需先排序)
Arrays.fill(arr, 0);                         // 填充
Arrays.equals(arr, new int[]{0, 0, 0});      // 判断数组是否相等
List<Integer> list = Arrays.asList(1, 2, 3); // 数组转List

八、常见算法场景应用

  1. 滑动窗口
Map<Character, Integer> window = new HashMap<>();
// 添加元素到窗口
window.put(c, window.getOrDefault(c, 0) + 1);
// 移除元素
window.put(c, window.get(c) - 1);
if (window.get(c) == 0) window.remove(c);

  1. 单调队列
Deque<Integer> deque = new ArrayDeque<>();
// 维护单调递减队列
while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
    deque.pollLast();
}
deque.offerLast(i);

  1. 两个堆维护中位数
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);

按类别整理的Java常用函数:

字符串操作函数

String str = "hello world";
str.length();                // 获取字符串长度
str.charAt(0);               // 获取指定位置字符
str.substring(0, 5);         // 截取子串(起始索引,结束索引)
str.substring(6);            // 从指定位置截取到结尾
str.indexOf("world");        // 查找子串首次出现位置,未找到返回-1
str.lastIndexOf("l");        // 查找子串最后出现位置
str.startsWith("he");        // 判断是否以指定前缀开始
str.endsWith("ld");          // 判断是否以指定后缀结束
str.contains("wor");         // 判断是否包含子串
str.replace("l", "L");       // 替换所有匹配字符
str.replaceAll("\\s+", "");  // 使用正则表达式替换
str.toLowerCase();           // 转小写
str.toUpperCase();           // 转大写
str.trim();                  // 去除首尾空格
str.split(" ");              // 按空格分割字符串
str.toCharArray();           // 转换为字符数组
 转换为字符数组

数组操作函数

int[] nums = {1, 2, 3, 4, 5};
Arrays.toString(nums);       // 数组转字符串
Arrays.sort(nums);           // 数组排序
Arrays.sort(nums, 1, 4);     // 部分排序(起始索引,结束索引)
Arrays.sort(nums, Collections.reverseOrder()); // 降序排序(需要包装类数组)
Arrays.sort(nums, (a, b) -> b - a); // 自定义排序
Arrays.binarySearch(nums, 3); // 二分查找(需已排序)
Arrays.fill(nums, 0);        // 填充数组
Arrays.equals(nums, new int[]{0,0,0,0,0}); // 比较数组
Arrays.copyOf(nums, nums.length); // 复制数组
Arrays.copyOfRange(nums, 1, 3); // 复制数组的一部分

数字处理函数

Math.max(a, b);              // 最大值
Math.min(a, b);              // 最小值
Math.abs(-10);               // 绝对值
Math.pow(2, 3);              // 幂运算(2的3次方)
Math.sqrt(9);                // 平方根
Math.ceil(4.3);              // 向上取整
Math.floor(4.7);             // 向下取整
Math.round(4.5);             // 四舍五入
Math.random();               // 随机数[0,1)
Integer.parseInt("123");     // 字符串转整数
Double.parseDouble("123.45"); // 字符串转小数
Integer.toBinaryString(10);  // 十进制转二进制字符串
Integer.toString(10, 16);    // 十进制转十六进制字符串
Character.isDigit('9');      // 判断是否为数字
Character.isLetter('a');     // 判断是否为字母
Character.isLetterOrDigit('a'); // 判断是否为字母或数字
Character.toLowerCase('A');  // 转小写
Character.toUpperCase('a');  // 转大写

位操作函数

 

java

& (与) // 两位都为1才为1 | (或) // 两位有一个为1就为1 ^ (异或) // 两位不同为1,相同为0 ~ (取反) // 0变1,1变0 << (左移) // 每左移一位相当于乘2 >> (右移) // 每右移一位相当于除2 >>> (无符号右移) // 右移补0 Integer.bitCount(n); // 计算二进制中1的个数 Integer.highestOneBit(n); // 获取最高位的1 Integer.lowestOneBit(n); // 获取最低位的1 Integer.numberOfLeadingZeros(n); // 前导0的个数 Integer.numberOfTrailingZeros(n); // 后置0的个数

常用算法工具函数

// 判断质数
boolean isPrime(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) return false;
    }
    return true;
}

// 最大公约数
int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

// 最小公倍数
int lcm(int a, int b) {
    return a * b / gcd(a, b);
}

// 快速幂
long fastPow(long base, long exponent, long mod) {
    long result = 1;
    while (exponent > 0) {
        if ((exponent & 1) == 1) result = (result * base) % mod;
        base = (base * base) % mod;
        exponent >>= 1;
    }
    return result;
}

// 求组合数
int[][] generateCombinations(int n) {
    int[][] C = new int[n+1][n+1];
    for (int i = 0; i <= n; i++) {
        C[i][0] = 1;
        for (int j = 1; j <= i; j++) {
            C[i][j] = (C[i-1][j-1] + C[i-1][j]);
        }
    }
    return C;
}

输入输出处理

// 读取输入
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();           // 读取整数
double d = scanner.nextDouble();     // 读取小数
String s = scanner.next();           // 读取一个单词
String line = scanner.nextLine();    // 读取一行

// 更高效的输入
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
String[] parts = line.split(" ");
int n = Integer.parseInt(parts[0]);

// 更高效的输出
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
writer.write(String.valueOf(result));
writer.newLine();
writer.flush();

二叉树遍历模板

// 前序遍历
void preorder(TreeNode root) {
    if (root == null) return;
    // 处理当前节点
    preorder(root.left);
    preorder(root.right);
}

// 中序遍历
void inorder(TreeNode root) {
    if (root == null) return;
    inorder(root.left);
    // 处理当前节点
    inorder(root.right);
}

// 后序遍历
void postorder(TreeNode root) {
    if (root == null) return;
    postorder(root.left);
    postorder(root.right);
    // 处理当前节点
}

// 层序遍历
void levelOrder(TreeNode root) {
    if (root == null) return;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            TreeNode node = queue.poll();
            // 处理当前节点
            if (node.left != null) queue.offer(node.left);
            if (node.right != null) queue.offer(node.right);
        }
    }
}

图算法模板

// DFS模板
void dfs(int[][] graph, boolean[] visited, int node) {
    visited[node] = true;
    // 处理当前节点
    for (int next : graph[node]) {
        if (!visited[next]) {
            dfs(graph, visited, next);
        }
    }
}

// BFS模板
void bfs(int[][] graph, boolean[] visited, int start) {
    Queue<Integer> queue = new LinkedList<>();
    queue.offer(start);
    visited[start] = true;
    while (!queue.isEmpty()) {
        int node = queue.poll();
        // 处理当前节点
        for (int next : graph[node]) {
            if (!visited[next]) {
                visited[next] = true;
                queue.offer(next);
            }
        }
    }
}
补充:

System.arraycopy()

// System.arraycopy(源数组, 源数组起始位置, 目标数组, 目标数组起始位置, 要复制的元素个数)
int[] source = {1, 2, 3, 4, 5};
int[] dest = new int[5];
System.arraycopy(source, 0, dest, 0, source.length);  // 完整复制
System.arraycopy(source, 1, dest, 2, 2);  // 部分复制: 将source的索引1开始的2个元素复制到dest的索引2开始的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值