String为什么使用final修饰
1.String是可变的吗?
不可变.首先String类使用final修饰了,所以String类无法被继承,不能通过子类来修改String类内容;其次,String的数据char[]数组也使用了final修饰,一旦初始化就不可再修改内存指向地址;最后再将内部字段使用private修饰,外部只能使用String提供的方法进行操作.
但是使用反射其实是可以修改String类的内容的;
String name = "derek"; Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[]) field.get(name); value[0] = 'a'; System.out.println(name); // "aerek" System.out.println("derek" == name); // true
2.String为什么要设计成不可变?
- 安全性
String类在java种使用得非常广泛,不乏有一些敏感数据如密码、银行账号等数据,如果不设计成不可变的,那么有可能会被通过修改数据来绕过安全检测并进行一些"危险操作";其次,设计成不可变也能使String在不存在多线程安全问题. - 节省空间
通过使用常量池,内容相同的字符串可以使用同一个对象,从而节省空间;如果是可变的(比如普通对象),那么多个实例使用同一个对象,那么其中一个实例修改对象会影响到其他的实例. - 易于缓存,性能高
String在HashMap等集合中使用广泛,String做为key,设计成不可变这样就只需要算一次hash值并缓存起来,后续使用直接读缓存即可,不需要重复计算.