java中字符串创建的两种形式:
1.直接给String变量赋值,即字面量形式;
2.用new创建字符串对象;
这两种方式存在性能和内存的差别,JVM(java虚拟机)为了减少重复字符串对象的创建,开辟了一块内存,这块内存被称为字符串常量池或者字符串字面量池。
其工作原理: 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。
如:
String s1="a";
String s2="a";
String s3=new String("a");
s1==s2结果为true;而s1==s3结果为false;间接说明了s1和s3指向的是不同的对象;
如何把自己的一个字符串加入字符串常量池?
使用intern方法,如String s4=s3.intern();调用该方法时,JVM首先会去检查是否有s3对象的引用,有则将该引用返回并给s4;
补充:实现前提 (引用了他人的)
字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。如果Java中的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。
优缺点
字符串常量池的好处就是减少相同内容字符串的创建,节省内存空间。
如果硬要说弊端的话,就是牺牲了CPU计算时间来换空间。CPU计算时间主要用于在字符串常量池中查找是否有内容相同对象的引用。不过其内部实现为HashTable,所以计算成本较低。
网友评论