不需要new就可以赋值 为什么
我查了下说什么直接写String a="a"; 和String b="a" 是同一引用 为什么
希望能详细解释下String

解决方案 »

  1.   

    可以直接赋值,java语法就这么规定的。
    因为String类太常用了,这样直接赋值,避免多次创建内容相同的String对象,节省空间,提高效率。
    http://blog.csdn.net/ZangXT/archive/2009/05/19/4201979.aspx
      

  2.   

    简单的说:String是不可变的,它是可以共享的,它存放在常量池里,所以任何String类型的引用都可以指向某个字符串,因此他们是同一个对象
      

  3.   

    其实Spring早就在配置文件里配好了,所以就不用new了,就可以直接拿来用了。可能上网多查一些资料看看。我就是这样学的。
      

  4.   

    这是java里面定义好的,凡是引用的对象都放到内存堆里面,如果再创建对象时,先去内存里面找,没有就创建,有就指向那个对象。还有怎么spring都出来,楼上的回答
      

  5.   

    java API 有写:
    String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例来实现。 字符串是常量;它们的值在创建之后不能改变。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享它们。例如: 
         String str = "abc";
     等效于: 
         char data[] = {'a', 'b', 'c'};
         String str = new String(data);The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class.Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings. Because String objects are immutable they can be shared. For example:         String str = "abc";
         is equivalent to:         char data[] = {'a', 'b', 'c'};
             String str = new String(data);
         
      

  6.   

    因为String类中的方法都是静态方法(static方法,即类方法)。静态方法可以用类名直接调用,而无须事先实例化对象。像Math类也是这样的。
      

  7.   

    String a="1";
    String b=a; //the address of a is the address of b
      

  8.   

    Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串 "abc",然后再将其赋给str。执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。String str = new String()创建了一个空字符串,与String str=new String("")相同。  下面举个例子说明:
      public class CompareString {
      public static void main(String[] args) {
      String a = new String();
      String aa = "";
      String aaa = new String("");
      String b = new String("asdf");
      String c = new String("asdf");
      String d = "asdf";
      
      System.out.println(a == aa);
      System.out.println(a == aaa);
      System.out.println(a.intern() == aa.intern());
      System.out.println(a.intern() == aaa.intern());
      System.out.println(d == "asdf");
      System.out.println(b == c);
      System.out.println(b == d);
      System.out.println(b.equals(c));
      System.out.println(b.equals(d));
      
      b = b.intern();
      System.out.println(b == c);
      System.out.println(b == d);
      c = c.intern();
      System.out.println(b == c);
     }
    }
    以上程序的运行结果为:
    false
    false
    true
    true
    true
    false
    false
    true
    true
    false
    true
    true
      从运行结果可以验证前面所述的内容。如果不懂String 类的intern()方法的用法可以参考jdk自带的文档:
    public String intern()
    Returns a canonical representation for the string object.
    A pool of strings, initially empty, is maintained privately by the class String.When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.All literal strings and string-valued constant expressions are interned. String literals are defined in §3.10.5 of the Java Language SpecificationReturns:
    a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.  从CompareString类中我们也可以看出 == 与equals()的不同之处:即 == 比较的是两个对象的引用(即内存地址)是否相等,而equals()比较的是两个对象的值(即内存地址里存放的值)是否相等。当然equals()在个别类中被重写了那就例外了。
      

  9.   

        我刚学JAVA,虽然不知道是为什么,但我个人猜是不是因为是静态赋值,所以不用new啊?
      

  10.   

        要说为什么是同一个引用,那得知道引用变量和基本变量(byte,char,int,long,float,double,boolean,空类型)在运行时在内存中的放置空间了,基本变量是直接指向值所在的内存,而引用变量是存放了值的引用地址(可以想象成指针),如String a="a",的意思就是变量a存放一地址,它指向字符串"a",而String b="a",同样也是存放了变量a的地址,它也指向字符串"a",所以它们是同一个引用。总的来说就是a,b分别存放在两个地方,但是他们都指向字符串"a",都是字符串"a"的引用。因为是新手,理解的不知道对不对,对的话就不说了,不对的话大家指出来了,别让我害人啊!