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);
使用建议:
- 谨慎使用反射:破坏封装性,影响 JVM 优化和安全。
- 避免修改
finally
返回值:降低代码可读性。 - 优先保证可维护性:多数\"骚操作\"仅适用于特定场景。
合理运用这些技巧可以提升代码灵活性,但在生产环境中应优先考虑代码健壮性。