> 技术文档 > java微操

java微操

在 Java 中,我们可以通过一些巧妙的技巧实现看似\"骚\"的操作(高效、简洁或反直觉的代码)。以下是几个实用示例,包含注释说明:


1. ​不用临时变量交换两个数

int a = 5, b = 10;a = a ^ b; // 异或操作存储差异b = a ^ b; // 还原原始a的值并赋给ba = a ^ b; // 还原原始b的值并赋给aSystem.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 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);

使用建议:

  1. 谨慎使用反射​:破坏封装性,影响 JVM 优化和安全。
  2. 避免修改 finally 返回值​:降低代码可读性。
  3. 优先保证可维护性​:多数\"骚操作\"仅适用于特定场景。

合理运用这些技巧可以提升代码灵活性,但在生产环境中应优先考虑代码健壮性。