java微操
在 Java 中,我们可以通过一些巧妙的技巧实现看似"骚"的操作(高效、简洁或反直觉的代码)。以下是几个实用示例,包含注释说明:
1. 不用临时变量交换两个数
int a = 5, b = 10;
a = a ^ b; // 异或操作存储差异
b = a ^ b; // 还原原始a的值并赋给b
a = a ^ b; // 还原原始b的值并赋给a
System.out.println("a=" + a + ", b=" + b); // 输出: a=10, b=5
2. Stream 一行实现 FizzBuzz
IntStream.rangeClosed(1, 20).mapToObj(n -> n % 15 == 0 ? "FizzBuzz" : n % 3 == 0 ? "Fizz" : n % 5 == 0 ? "Buzz" : n).forEach(System.out::println);
3. 通过反射修改 String
内部值
String s = "Hello";
Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true); // 突破私有访问限制
char[] value = (char[]) valueField.get(s);
value[0] = 'J';
System.out.println(s); // 输出: Jello(警告:破坏不可变性)
4. 用 finally
篡改返回值
public static int trickyReturn() {try {return 1; // 先将1压入栈} finally {return 2; // finally会覆盖返回值}
}
System.out.println(trickyReturn()); // 输出: 2
5. 用空数组实现高效判空
List<String> list = getNullableList();
if (list.toArray().length == 0) { // 避免创建新对象System.out.println("List is empty!");
}
6. 动态编译并执行字符串代码
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, "-sourcepath", "", "Temp.java");
URLClassLoader loader = URLClassLoader.newInstance(new URL[]{new File("").toURI().toURL()});
Class<?> clazz = loader.loadClass("Temp");
clazz.getMethod("run").invoke(clazz.newInstance());
注意:需要提前将代码字符串写入
Temp.java
文件。
7. 利用枚举实现单例模式
public enum Singleton {INSTANCE;public void doSomething() {System.out.println("Singleton action");}
}// 使用
Singleton.INSTANCE.doSomething();
8. 通过异常控制递归深度
class RecursionThrower {static void deepRecursion(int depth) {try {deepRecursion(depth + 1);} catch (StackOverflowError e) {System.out.println("Max depth: " + depth); // 输出栈深度}}
}
RecursionThrower.deepRecursion(0);
使用建议:
- 谨慎使用反射:破坏封装性,影响 JVM 优化和安全。
- 避免修改
finally
返回值:降低代码可读性。 - 优先保证可维护性:多数"骚操作"仅适用于特定场景。
合理运用这些技巧可以提升代码灵活性,但在生产环境中应优先考虑代码健壮性。