String类被final关键字修饰的好处是什么
String对象的不可变性
在实现代码中,String类被final关键字修饰了。变量char数组也被final修饰了。
类被final修饰代表该类不可被继承,char[]被final+private修饰,代表String对象不可被修改。Java实现的这个特性叫做String对象的不可变性,即String对象⼀旦创建成功,就不能再对它进⾏改变。
Java这样做的好处是什么呢
第⼀,保证了String对象的安全性。假设String对象是可变的,那么String对象将可被任意修改。
第⼆,保证hash属性值不会被随意的变更,确保唯⼀性,使得类似HashMap的容器才能实现相应的key-value缓存功能。
字符常量池是什么意思第三,可以实现字符串常量池。在Java中通常有两种创建字符串对象的⽅式,⼀种是通过字符串常量的⽅式创建,如String str = "ABC"; 另⼀种是字符串变量通过new的⽅式进⾏创建,如 String str = new String("ABC");
当使⽤ String str = "ABC";⽅式进⾏创建字符串对象时,JVM⾸先会检查该对象是否在字符串常量池中,如果存在,则返回该对象的引⽤,否则新的字符串将在常量池中被创建。这中⽅式减少了同⼀个值的字符串对象的重复创建,节约内存。
String str = new String("ABC");这种⽅式⾸先在编译类⽂件时,"ABC"常量字符串将会放⼊到常量结构中,在类加载时,"ABC"将会在常量池中创建;其次,在调⽤new时,JVM命令将会调⽤String的构造函数,同时引⽤常量池中的"ABC"字符串,在堆内存中创建⼀个String对象;最后 str引⽤String对象。
String对象的优化
如何构建超⼤字符串
在实际操作中,我们对字符串的拼接是很常见的。
String str = "ab"+"cd"+"ef";
分析上述代码,⾸先会⽣成⼀个ab对象,再⽣成abcd对象,最后⽣成abcdef对象,这样的执⾏效率是很低的。
但是实际中,只会有⼀个对象⽣成,因为编译器⾃动优化了这段代码
String str = "abcdef";
以上是对字符串常量的累计,那么对于字符串变量的累计是什么效果呢?
String str = "abcdef";
for(int i = 0; i < 1000; i ++){
str = str + i;
}
上述代码经过编译后,编译器同样对这段代码进⾏了优化。在拼接时,偏向于使⽤StringBuilder,这样可以提⾼效率。
所以在进⾏⼤量的字符串拼接操作时,还是建议显⽰的使⽤StringBuilder来提⾼执⾏效率。
使⽤String.intern 节省内存
如果字符串常量池中已经包含⼀个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符添加到常量池中,并返回此String对象的引⽤。
与new String()⽐较的⽰例代码
String a = new String("abc").intern();
String b = new String("abc").intern();
System.out.println(a == b);
true
String q = new String("bcd");
String w = new String("bcd");
System.out.println(q == w);
false
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论