(1)我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,我们创建了String类的对象str。担心陷阱!对象可能并没有被创建!唯一可以肯定的是,指向String类的引用被创建了。至于这个引用到底是否指向了一个新的对象,必须根据上下文来考虑,除非你通过new()方法来显要地创建一个新的对象。因此,更为准确的说法是,我们创建了一个指向String类的对象的引用变量str,这个对象引用变量指向了某个值为"abc"的String类。清醒地认识到这一点对排除程序中难以发现的bug是很有帮助的。  (2)使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。这个思想应该是享元模式的思想,但JDK的内部在这里实现是否应用了这个模式,不得而知。(以上资料来自internet,准确性有待考证,希望对大家有帮助)

解决方案 »

  1.   

    我的理解是这样的,不知道对不对。
    如:
    String str = "test";虚拟机会检测 是否已经创建了这个 “test” 串,如果没有,则创建一个。然后创建一个引用(即str,)指向它 
    如果有,直接指向它。所以“test”串即可共享。
    String不可被共享引用,是它自身不被引用也就是str不可被引用。
    如果你有如下代码:
    String str2 = str;
    无论你怎么改变str2,都不会影响到str
    那么str仍然不会改变还是“test”
      

  2.   

    楼主在哪里有《java2核心技术卷》,能发给我厂吗
    [email protected]
    谢拉要是有给个连接也行多谢
      

  3.   

    我看了一下你所说的!首先来看看你所提到的两句话:
    1、不可改变的字符串具有一个很大的优点:编译器可以把字符串设置为共享。
    2、不可变类String有一个重要的优点-它们不会被共享引用。
    提取的主语是:1、不可改变的字符串;2、不可变类String;
    很明显,书中所说的两个主语从字面上看也不是指的一个东西。
       对于1中所指的不可改变的字符串,是说的常量吧!你定义好了,它了值就定下
    来了,程序中根本就不能去改变。对这种一成不变的东西,在程序中共享是不会
    有什么冲突的,因为你不能对它做任何的事情,只能取值,当然它就可以共享了。
       对于2中所指的不可变类String,是指一个数据类型吧!
       我不知道你对别人的优点是么样看的,前天,我的同事说别人个子矮,人非常
    瘦是个优点,为什么呢?因为他们上隔楼,穿管子布线蛮方便的!哈哈!没办法,
    我这位同事个子高,长的又壮的,做网线时就是不方便!
       一个小故事!或许对你有所启发的~!    去过庙的人都知道,一进庙门,首先是弥陀佛,笑脸迎客,而在他的北面,则是黑口
      黑脸的韦陀。但相传在很久以前,他们并不在同一个庙里,而是分别掌管不同的庙。 
        弥乐佛热情快乐,所以来的人非常多,但他什么都不在乎,丢三拉四,没有好好的管
      理账务,所以依然入不敷出。而韦陀虽然管账是一把好手,但成天阴着个脸,太过严肃,
      搞得人越来越少,最后香火断绝。 
        佛祖在查香火的时候发现了这个问题,就将他们俩放在同一个庙里,由弥乐佛负责公
      关,笑迎八方客,于是香火大旺。而韦陀铁面无私,锱珠必较,则让他负责财务,严格把
      关。在两人的分工合作中,庙里一派欣欣向荣景象。 
        其实在用人大师的眼里,没有废人,正如武功高手,不需名贵宝剑,摘花飞叶即可伤
      人,关键看如何运用。     这个故事很简单,道理也很简单!不过哪个人能真正把它用的好呢!优点与缺点,看你在
    一个什么样的环境下去怎么说它呀!