是不是这个意思:字符串"ID",被JVM管理,可以被两个不同的应用程序共同指向。但是指向该字符串的引用是独立的,是被复制拷贝的,如果更改一个字符串引用,那么更改的只是该引用,与这个引用以前所指向的那个字符串相关连的其他引用无关。public class Test
{
   public static void main(String[] args)
   {
    String ID = "ID";
    changeString( ID );
    System.out.println( ID );
   }
   
   static void changeString( String str )
   {
    str = "JF";
   }
}引用没有被共享。

解决方案 »

  1.   

    我估计是这个问题:
    public class Test{
    String test1="xuchaoyang1";
    String test2="xuchaoyang1";
    String test3=new String("xuchaoyang2");
    String test4=new String("xuchaoyang2");
    public static void main(String args[])
    {
    if(test1==test2)
    System.out.println("true");
    else System.out.println("false");//这里输出true,是不是说明了第一个问题,
                                     //不可变字符串“xuchaoyang1”被编译器制定为共享
                                     // 所以输出trueif(test3==test4)
    System.out.println("true");
    else System.out.println("false");//这里输出false,是不是说明了第二个问题,
                                     //不可变类String不会被编译器设为共享
    }
    }
      

  2.   

    to  xuchaoyangtest1 和 test2 是变量。比较的时候是值的比较。test3 和 test4 是new出来的对象 比较的时候是 指针的比较。不同吧。
      

  3.   

    第一句是强调String类所指的对象本身不可改变的特性,即使引用设为public也无妨,因为private就是为了防止被更改(当然也为了加密),而String类本身的特点就保证了这一点,
    第2句如下:String stra="hello world";
               String strb=stra;/*该句并不会使strb与stra指向同一个对象,而是为strb创建了一个
     ="hello world“的副本,因此stra与strb指向不同的两个内存地址,只是两者的内容相同,以我的的推测,原文中第一处应为public,第二处应为share         
      

  4.   

    是这样的,JAVA为了提高效率,所以对于String类型进行了特别的处理---为string类型提供了串池
    定义一个string类型的变量有两种方式:
    string name="tom";
    string name =new string("tom")
    使用第一种方式的时候,就使用了串池,
    使用第二中方式的时候,就是一种普通的声明对象的方式
    如果你使用了第一种方式,那么当你在声明一个内容也是"tom"的string时,它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname="tom",将会指向同一块内存另外关于string类型是不可改变的问题:
    string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如name="madding"
    那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个"tom"没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。
    据说这样可以提高效率!!!哈哈