为什么说java的String类有不变的性质?

当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率?

以上两个问题为什么?

Java运行时会维护一个String Pool(String池)

String不变的性质是因为每次都从String Pool里面取,如果有则直接用,否则创建新的放入。
使用stringbuffer当然就是为了不用一直的创建新的string放入String Pool了呀追问

那请问关于这个String Pool(String池)的相关信息,能有个全面介绍的文章吗?

追答

百度 String Pool ,出来一大堆,而且你只要知道有这么一个东西就好了,没必要具体深入

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-08
操作String 相当于产生新的对像 ,但String自身有做优化,如果String在循环里改变的次数很多,比如十万次或更多!!这样效率会很底,
可以考考虑用StringBuffer如果不考虑线程安全,还可以用StringBuider这个比 StringBuffer效率更高。如果只是几百次的字符串的操作,
而改用StringBuffer或StringBuider不但不会提前效率。可能还会比用String类效率更低。 StringBuffer和StringBuider是重量级的。
底层实现很复杂。在很少量字符串操用时用这两个类 。有种杀鸡用牛刀的感觉!
第2个回答  2012-10-09
string类是不可以变序列。
字符串常量“abcdf”。 你在中间任意去掉一个字符,假如是c。 内存中的情况是:ab 在一个新内存中,df在另一个新内存中。 然后在建一个内存将两个字符串复制到里面去。
而Sringbuffer 直间去掉中间 然后缩进下 ok了
第3个回答  2012-10-07
string immutable有很多优势在多线程,内存,安全性等方面。
effective java里面提到过
拼接字符串时编译器会自动优化成StringBuilder,:-) Thinking in java 里有个很有意思的程序,需要循环时最好自己创建StringBuilder本回答被网友采纳
第4个回答  2012-10-09
例子,如:
String st=new String("字符串");
该String对象创建后,String类及整个API中没提供该变其存储位置的内容。
之后又创建String st=new String("又一个字符串");
该st指向了new String("又一个字符串")对象,而原来的new String("字符串")对象也存在着,之是现在没有应用指向该new String("字符串")对象。
该String对象由gc垃圾回收器自动回收。

string类为什么是final的
1、不允许其他类继承。这个应该不是最终原因,但这里权且也当成是一个原因。2、String类中的成员属性也几乎都设计成了private final的,这样String就被设计成一个不变类,这样有助于共享,提高性能。可以将字符串对象保存在字符串常量池中以供与字面值相同字符串对象共享。如果String对象是可变的,那就不...

请从JAVA课本知识角度回答。小弟是要考试用的,老师只给了这个材料!希望...
首先,抽象类在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。其次,在抽象类的定义中,我们可以赋予方法的默认行为。使用抽象类来定义允许多个实现的类型,比使用接口有一个明显的优势:抽象类的演化比接口的演化要容易的多。在后续的发行版中,如果希望在抽象类中增加一个方法,只增加一个默认的合理的实...

java中什么是堆和栈,如何应用,最好举个例子,并详细地说明一下,谢谢了...
由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。java中内存分配策略及堆和栈的比较 2.1 内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需...

c#中::和 .的区别?
一、性质不同 1、:::::是域作用符,是各种域性质的实体专用的。2、.:.是成员作用符,是对象专用的。二、引用变量不同 1、:::::的引用变量类型是外部变量。2、.:.的引用变量类型是局部变量。三、前缀不同 1、:::::的前缀可以不加具体的域名,不加时就是指默认域。2、.:.的前缀不可...

java中什么是类爆炸
类爆炸的直接原因是设计者对类的抽象粒度没能把握好,只要两个事务有所差别就用不同的类来设计。粒度能多小就做多小,以为这样可以减少耦合。事实是如此吗?最近组长让我写一份设计问题,他已经规定了设计文档的规范和大纲,规范中说“本系统编码使用了三种类:界面类、实体类、记录集类,并调用了公用模块中相应函数”...

java 中assert的使用
父类的assert语句将只有在父类的assert开启才起作用,如果仅仅开启子类的assert,父类的assert仍然不运行。因此,assert语句不具有继承功能。四、assertion的使用 assertion的使用是一个复杂的问题,通常来说,assertion用于检查一些关键的值,并且这些值对整个程序,或者局部功能的完成有很大的影响,并且这种错误不容易恢复的。

java该怎么自学?
第二步是学习Java的语法 Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己...

写个java程序求一个数的绝对值
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。在Java中可以使用Math.abs()方法来...

关于定点与浮点
1.该函数不可能用Java语言完成,所以他是JNI实现 2.我们利用对long类型的位运算可以把该内存结构打印出来查看.\/ 测试 \/ public static void main(String[] args){ myTest t = new myTest();double d = 0.1d;long l = Double.doubleToLongBits(d);System.out.println(t.getLongBits(l));} \/...

List 、Set、 Map有什么区别和联系
对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个...

相似回答