一、数字
1. 设置最值
int 类型:
max_num = Integer.MAX_VALUE;
min_num = Integer.MIN_VALUE;
无穷:
正无穷:Double.POSITIVE_INFINITY
负无穷:Double.NEGATIVE_INFINITY
2. 选择最值
最大值:Math.max(a, b);
最小值:Math.min(a, b);
3. 计算次方
Math.pow(2, 3); // 2的三次方,结果为8
4. Random随机数
构造:Random random = new Random();
返回一个随机的整数,范围是所有可能的int值:int randomValue = random.nextInt();
返回一个0(包括)到15(不包括)之间的随机整数:int randomValue = random.nextInt(15);
二、数组
1. 数组排序
Arrays.sort(nums);
2. 数组复制
int[] res = new int[]{1, 2, 3, 4};
int[] new_res = Arrays.copyOf(res, 3); // 只复制了前3个:new_res = [1, 2, 3]
3. 数组 与 List 相互转化
Integer[] arr = {1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr); // 数组转List
Integer[] arr = list.toArray(new Integer[0]); // List转数组
4. 数组转字符串
int[] intArray = { 1, 4, 6, 7, 8, 9, 10 };
String res = Arrays.toString(intArray);
5. 两个数组比较是否相等
Arrays.equals(arr1, arr2);
6. 二维数组根据第一个元素排序
有一个二维数组,根据第一个元素对其进行排序(也就是第一个元素换位置时,第二个元素也跟着一起换位置):
int[][] intervals = new int[][]{
{
1,3},{
2,6},{
8,10},{
15,18}}; // intervals = [[1,3],[2,6],[8,10],[15,18]]
// 法一:Java8新特性Lambda 表达式,性能高
Arrays.sort(intervals, Comparator.comparingInt(interval -> interval[0]));
/* 解释:
Comparator.comparingInt 是一个静态方法,它接受一个 ToIntFunction 函数作为参数,用于从每个元素中提取一个整数值进行比较。
interval -> interval[0] 是一个 Lambda 表达式,表示从每个 interval(即 intervals 数组中的一个元素,它本身是一个一维数组)中提取第一个元素 interval[0](即这个区间的起始值)作为排序依据。
*/
// 法二:匿名 Comparator 类
Arrays.sort(intervals, new Comparator<int[]>() {
public int compare(int[] interval1, int[] interval2) {
return interval1[0] - interval2[0];
}
});
/* 解释:
Comparator<int[]> 是一个泛型接口,int[] 表示这个比较器用于比较 int 类型数组的元素
compare() 方法是 Comparator 接口中的抽象方法,负责定义排序规则。
interval1[0] - interval2[0] 是一种整数差值的计算方式,结果有以下含义:
如果 interval1[0] - interval2[0] > 0,则返回正值,表示 interval1 排在 interval2 后面(即 interval1 的起始值大于 interval2 的起始值)。
如果 interval1[0] - interval2[0] < 0,则返回负值,表示 interval1 排在 interval2 前面(即 interval1 的起始值小于 interval2 的起始值)。
如果 interval1[0] - interval2[0] == 0,则返回 0,表示这两个区间在排序中是等价的(即它们的起始值相同)。
*/
7. char数组判空
创建:char[] temp = new char[10];
判空:if (temp[i] != '\u0000'),也就是没给char数组赋值时,默认为'\u0000',而不是''
8. 字符串与char数组相互转化
字符串转char数组:char[] str_array = s.toCharArray();
char数组转字符串:String st=String.valueOf(char_s);
应用:对字符串的每个字符进行排序
char[] str_array = s.toCharArray(); // 字符串转char数组
Arrays.sort(str_array); // 数组排序
String str_sort = new String(str_array); //再还原成字符串
三、字符串
1. 通过index访问某个字符: s.charAt(index) == ‘a’
2. 删除字符串的头尾空白符: s.trim()
3. 截取子字符串,根据索引:s.substring(i,j)
4. 字符串分割:s.split
String[] arr1 = str.split(" "); //仅分割一个空格
// 正则表达式\s表示匹配任何空白字符,+表示匹配一次或多次
String[] arr4 = str.split("\\s+"); //分割一个或者多个空格
5. indexOf() 使用方法
int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
6. 数字与字符串相互转化
字符串转数字:int i = Integer.parseInt(s);
数字转字符串:String s = Integer.toString(i);
数字转字符串:String res = String.valueOf(max_num);
7. 字符串全部转大小写
字符串全部转小写:str.toLowerCase();
字符串全部转大写:str.toUpperCase();
四、Set
创建: Set<String> set = new HashSet<>();
增加: set.add("xyz");
删除: set.remove("xyz");
查询: set.contains("xyz");
数量: set.size();
遍历:
for (String s : set) {
System.out.println(s);
}
有 key-value 用 Map , 只有 key 用 Set ,均是存储不重复的元素集合
五、Map
创建: Map<Integer, Integer> mapNums = new HashMap<>();
增加: mapNums.put(2, 5);
删除: mapNums.remove(2);
注意:put()方法的签名是V put(K key, V value),如果放入的key已经存在,put()方法会返回被删除的旧的value,否则,返回null。通俗理解:调用put方法时,如果已经存在一个相同的key, 则返回的是前一个key对应的value,同时该key的新value覆盖旧value,如果是新的一个key,则返回的是null。
查询: mapNums.containsKey(num)
遍历:
根据key遍历:for (int key: mapNums.keySet()) {}
根据value遍历:for (Integer value : map.values()) {}
根据index下标遍历Map:
Map<String, String> map = new HashMap<>();
map.put("A", "Apple");
map.put("B", "Banana");
// 获取所有的键并转化为List
List<String> keyList = new ArrayList<>(map.keySet());
// 使用索引遍历
for (int i = 0; i < keyList.size(); i++) {
String key = keyList.get(i);
String value = map.get(key);
System.out.println("Index: " + i + ", Key: " + key + ", Value: " + value);
}
map判断赋值的简洁写法:
// 原代码:
int num = 1;
char c = s.charAt(i);
if (map_s.containsKey(c)) {
num = map_s.get(c);
num++;
}
map_s.put(c, num);
// 简洁写法:
char ch = s.charAt(i);
map_s.put(ch, map_s.getOrDefault(ch, 0) + 1);
根据Map的Value值进行排序:

Map<Integer, Integer> map = new HashMap<>();
for(int num: nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet()); // 注意此处的写法,因为list有sort函数
Collections.sort(list, (a, b) -> {
// 重写sort函数
return b.getValue() - a.getValue(); // value越大,越靠前
});
int[] res = new int[k];
for(int i=0; i < k; i++) {
res[i] = list.get(i).getKey(); // 获取前 K 个高频元素
}
六、List
创建:List<List<Integer>> list = new ArrayList<>();
增加:list.add(Arrays.asList(nums[i], nums[l], nums[r]));
获取:list.get(index);
修改:list.set(index, "新值");
删除1:list.remove(index); // 移除下标为index的元素
删除2:list.remove("值"); // 移除第一次出现的指定元素
数量:list.size();
判空:list.isEmpty();
包含:list.contains("值");
清空:list.clear();
注意 删除1 和 删除2 , 如果 list 中存储的是数字,那么传入一个数字,删除的是index还是值呢?
// 结果展示如下
List<Integer> list = new ArrayList<>(); // 注意List里放的是Integer类型
list.remove(1); // 删除索引为1的元素
list.remove(new Integer(1)); // 删除元素1
因为泛型类的类型必须为引用类型,而不能为基础类型。所以传int的时候,会被当做下标值,传Integer的时候,会被视为泛型类。
七、队列 / 栈
1. 队列 Queue
创建:Queue<String> queue = new LinkedList<>();
求长度:queue.size();
2. 双端队列 Deque
创建:Deque<String> deque = new LinkedList<>();
求长度:deque.size();
3. 栈 Stack
JDK官方已建议优先使用Deque的实现类来代替Stack(具体原因可查看此篇文章:Java中的栈Stack、Deque、ArrayDeque、LinkedList),使用的双端队列Deque,只在一端操作。(ArrayDeque和LinkedList这两者底层,一个采用数组存储,一个采用链表存储;ArrayDeque用作栈时比Stack快没有疑问,用作队列的时候似乎也会比LinkedList快!)
创建
ArrayDeque创建:Deque<Integer> stack = new ArrayDeque<>();
LinkedList创建:Deque<String> deque = new LinkedList<>();
使用
当我们把 Deque 作为 Stack 使用时,注意只调用push()
/ pop()
/ peek()
方法,不要调用 addFirst() / removeFirst() / peekFirst() 方法,这样代码更加清晰。
判空:stack.isEmpty();
求长度:stack.size();
4. 优先队列 PriorityQueue
PriorityQueue 和 Queue 的区别在于:它的出队顺序与元素的优先级有关,对PriorityQueue调用remove()或poll()方法,返回的总是优先级最高的元素。由于 PriorityQueue 继承自 Queue ,所以对元素的基本操作函数都一样,就是返回的内容是有序的。
PriorityQueue 按元素比较的顺序排序,默认是最小堆
。
示例1:定义的是 PriorityQueue<Integer>,那么里边的元素是按照从小到大排序,如果让弹出,最先得到的是最小的数字,然后得到的是第二小的数字。
PriorityQueue<Integer> queue = new PriorityQueue<>();
queue.offer(8);
queue.offer(5);
queue.offer(10);
queue.offer(2);
while (!queue.isEmpty()){
System.out.println(queue.poll()); //输出2, 5, 8, 10
}
示例2:定义的是PriorityQueue<String>
PriorityQueue<String> q = new PriorityQueue<>();
// 添加3个元素到队列:
q.offer("apple");
q.offer("pear");
q.offer("banana");
System.out.println(q.poll()); // apple
System.out.println(q.poll()); // banana
System.out.println(q.poll()); // pear
System.out.println(q.poll()); // null,因为队列为空
PriorityQueue也提供了自定义比较规则:
示例3:将最小堆改为最大堆
// 写法一
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
// 写法二
PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> (o2 - o1));
* 常见数据结构
// 链表
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
// 树
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}