class T{
String str="abc";
}T t1=new T();
T t2=new T();t1.str的内存地址 和t2.str一样吗

解决方案 »

  1.   


    public class T {
        public String t = "12";    public static void main(String[] args) {
            T t1 = new T();
            T t2 = new T();
            System.out.println(t1.t==t2.t);
        }
    }//output
    true
      

  2.   

    一样,“abc"存储在常量区,你实例化对象里面的string类型的引用都是指向这一块常量区内存
    你实例化两个对象,并不会增加一个字符串常量abc存储在常量区,这跟编译器优化有关!
      

  3.   

    对象的内存地址肯定不一样,但是JVM的String实现了常量池,两个string指的常量是一样的,所以判等返回true。    这也就是为什么并发时对象锁一般不用String类型的原因
      

  4.   

     我想知道  这个类的成员变量 str =“12 ”  是在 类加载的时候 初始化的  还是在new 对象 实例化的时候 初始化为“12” 的 ?上面同学说的很对   我在锁的时候 不锁字符串 因为 两个对象的字符串 可能内存地址是一样的,不能达到锁对象的目的。
      

  5.   

    我总觉得知不知道java是否在内存里把字符串常量放到缓存里并不重要。重要的是你知道t1.str == t2.str 为真就可以了,至于后台怎么实现的和你有毛关系。如果你不放心就不要用这个逻辑,判断相等的逻辑多了,大家每天去钻那些玄乎其玄的字眼(什么new String()产生了几个内存对象)不累么?你知道了new出来的String不相等,常量字符串总想等就够了。大家多把心用在设计模式和算法上吧(当然还有业务逻辑)。什么时候需要钻研这些呢?当你设计的软件需要2万人以上并发的时候再去钻研吧,可是,多数人有这样的机会么?个人所见,仅供参考。
      

  6.   

    其实..每次都是一个新的String 你可以这样想
      

  7.   

    我指向告诉你真正的答案
    第一:创建对象时,字符串采用直接赋值的方式,优先去常量池去查找,发现找不到,然后String str = new String("abc");
             意思是:str = "abc"  和new的方式一样
    第二:第二次创建对象,当然,这个对象的内存地址和之前的不一样,但是注意了,里面的字符串也是直接赋值的方式
      

  8.   

    我晕,没写完,发过去了。接着写
    因为也是直接赋值的方式,所有也去常量池查找,发现找到了。然后直接把引用地址拿来用了。
    所以说,第一个是创建String对象,而第二次是拿过来的引用地址,懂否