文章目录
- 1\. 灵魂三问:求长度/大小
- 2\. 数组 (Array) —— `int[]`, `char[]`
- 3\. 字符串 (String) —— 不可变对象
- 4\. 集合 (Collections) —— 动态容器
- A. List (常用实现: `ArrayList`)
- B. Set (常用实现: `HashSet`)
- C. Map (常用实现: `HashMap`)
- D. Queue / Stack (常用实现: `LinkedList` 或 `ArrayDeque`)
- 5\. 常见类型转换 (必须熟练)
- ⚠️ 总结:避坑指南
1. 灵魂三问:求长度/大小
这是最容易搞混的,先把这个死记硬背下来:
| 数据类型 | 语法 | 是否带括号 | 记忆口诀 |
|---|---|---|---|
数组(int[],char[]) | .length | ❌不带 | 数组也是对象,length是它的一个属性。 |
字符串(String) | .length() | ✅带 | String 是类,这是它的方法。 |
集合(List,Map,Set) | .size() | ✅带 | 集合里装了多少东西,用size。 |
2. 数组 (Array) ——int[],char[]
不要用包装类声明!
数组是“死板”的,一旦创建,长度不能变。它的很多功能需要借助工具类java.util.Arrays。
- 声明:
int[] arr = new int[5];或int[] arr = {1, 2, 3}; - 常用操作:
- 排序:
Arrays.sort(arr);(默认升序,O ( N log N ) O(N \log N)O(NlogN)) - 填充:
Arrays.fill(arr, -1);(把数组全填成 -1) - 转字符串打印:
Arrays.toString(arr);(记得我们刚说的吗?不要直接 toString) - 复制:
Arrays.copyOf(arr, newLength);
- 排序:
3. 字符串 (String) —— 不可变对象
String 是只读的!任何修改 String 的操作(如 substring, replace)都不会改变原字符串,而是返回一个新的字符串。
- 获取字符:
s.charAt(i)(别用s[i],那是 C++ 写法) - 转数组:
char[] chars = s.toCharArray();(改字符必备) - 截取:
s.substring(start, end)(⚠️左闭右开[start, end))s.substring(2, 5)取下标 2, 3, 4。
- 比较内容:
s.equals("abc")(⚠️千万别用==,==比的是地址) - 去空格:
s.trim()(去掉首尾空格) - 分割:
String[] parts = s.split(" ");
🚀 进阶:StringBuilder (可变字符串)
如果你需要频繁修改字符串(比如在循环里拼接),一定要用 StringBuilder,否则会创建无数垃圾对象,导致超时。
StringBuildersb=newStringBuilder();sb.append('a');// 尾部追加sb.deleteCharAt(sb.length()-1);// 删除最后一个字符 (回溯法常用)sb.reverse();// 反转字符串 (力扣常考)Stringres=sb.toString();// 变回 String4. 集合 (Collections) —— 动态容器
力扣中最常用的三个接口:List,Set,Map。
A. List (常用实现:ArrayList)
当做动态数组用。
- 添加:
list.add(val); - 获取:
list.get(index);(别用list[index]) - 删除:
list.remove(index); - 排序:
Collections.sort(list);(注意是Collections复数) - 转数组:
int[] arr = list.stream().mapToInt(i->i).toArray();(写起来比较麻烦,一般手写循环转)
B. Set (常用实现:HashSet)
主要用于去重和快速判断是否存在。
- 添加:
set.add(val);(如果已存在,返回false,否则true) - 删除:
set.remove(val); - 包含:
set.contains(val);(O ( 1 ) O(1)O(1)时间复杂度)
C. Map (常用实现:HashMap)
键值对神器。
- 添加/更新:
map.put(key, value); - 获取:
map.get(key);(不存在返回null) - 获取(带默认值):
map.getOrDefault(key, 0);(力扣神器,计数时防止空指针) - 包含 Key:
map.containsKey(key); - 遍历:
for(Integerkey:map.keySet()){...}for(Integerval:map.values()){...}for(Map.Entry<Integer,Integer>entry:map.entrySet()){// entry.getKey(), entry.getValue()}
D. Queue / Stack (常用实现:LinkedList或ArrayDeque)
Java 官方推荐用Deque(双端队列) 接口来代替旧的Stack类。
- 声明:
Deque<Integer> stack = new ArrayDeque<>(); - 当栈用 (Stack):
stack.push(1);(压栈)stack.pop();(弹栈)stack.peek();(看栈顶)
- 当队列用 (Queue - BFS 常用):
queue.offer(1);(入队)queue.poll();(出队)queue.peek();(看队头)
5. 常见类型转换 (必须熟练)
刷题时经常需要在这个类型转到那个类型:
- String 转 int:
int num = Integer.parseInt("123"); - int 转 String:
String s = String.valueOf(123); - char 转 int:
int num = ch - '0';(利用 ASCII 码差值) - List 转 Array:
Integer[] arr = list.toArray(new Integer[0]);(注意是包装类数组)
⚠️ 总结:避坑指南
- 判断相等:
- 数字 (
int) 用==。 - 字符串 (
String) 和对象 (Integer在 -128~127 之外)必须用.equals()。
- 数字 (
- 判空顺序:
先判null再判长度,否则空指针异常 (NPE)。if (s != null && s.length() > 0) - 数组越界:
时刻警惕index < 0或index >= length。