- 经常会看到String是否可以被继承
答案是否,因为String被final修饰。当final修饰一个类时,表示这个类不能被继承。 - (插曲)此时可能会考虑到,final和static有何区别
用一段代码结果来看区别,结果显而易见。
static在类初始化是赋值,不可变,只能赋值一次。final是保证变量不可变。public class FinalTest { public static void main(String[] args) { Test test1 = new Test(); Test test2 = new Test(); System.out.println(test1.toString()); System.out.println(test2.toString()); } } class Test { public final double f = Math.random(); public static double s = Math.random(); @Override public String toString() { return "final random is " + f + "\n" + "static random is " + s; } } final random is 0.7707833941239641 static random is 0.12176082284109735 final random is 0.9269186394479977 static random is 0.12176082284109735 - StringBuilder和StringBuffer线程安全问题
读源码可以发现StringBuffer方法都被synchronized关键字修饰,能保证线程安全,二StringBuilder则没有。
下面用代码做一个简单测试public static void main(String[] args) { final StringBuilder builder = new StringBuilder(); final StringBuffer buffer = new StringBuffer(); ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 1000; i++) { exec.submit(() -> { for (int j = 0; j < 1000; j++) { builder.append("1"); buffer.append("1"); } }); } exec.shutdown(); while (true) { if (exec.isTerminated()) { System.out.println("StringBuilder: " + builder.length()); System.out.println("StringBuffer: " + buffer.length()); break; } } } 结果: StringBuilder: 997972 StringBuffer: 1000000
本文探讨了Java中String类不可继承的原因及其final修饰符的作用,并对比了StringBuilder与StringBuffer在多线程环境下的线程安全性差异。
149

被折叠的 条评论
为什么被折叠?



