类中一个String变量且赋值 生成的多个对象中 每个对象中的字符串变量是否仍是同一个String 字符串 class T{String str="abc";}T t1=new T();T t2=new T();t1.str的内存地址 和t2.str一样吗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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); }}//outputtrue 一样,“abc"存储在常量区,你实例化对象里面的string类型的引用都是指向这一块常量区内存你实例化两个对象,并不会增加一个字符串常量abc存储在常量区,这跟编译器优化有关! 对象的内存地址肯定不一样,但是JVM的String实现了常量池,两个string指的常量是一样的,所以判等返回true。 这也就是为什么并发时对象锁一般不用String类型的原因 我想知道 这个类的成员变量 str =“12 ” 是在 类加载的时候 初始化的 还是在new 对象 实例化的时候 初始化为“12” 的 ?上面同学说的很对 我在锁的时候 不锁字符串 因为 两个对象的字符串 可能内存地址是一样的,不能达到锁对象的目的。 我总觉得知不知道java是否在内存里把字符串常量放到缓存里并不重要。重要的是你知道t1.str == t2.str 为真就可以了,至于后台怎么实现的和你有毛关系。如果你不放心就不要用这个逻辑,判断相等的逻辑多了,大家每天去钻那些玄乎其玄的字眼(什么new String()产生了几个内存对象)不累么?你知道了new出来的String不相等,常量字符串总想等就够了。大家多把心用在设计模式和算法上吧(当然还有业务逻辑)。什么时候需要钻研这些呢?当你设计的软件需要2万人以上并发的时候再去钻研吧,可是,多数人有这样的机会么?个人所见,仅供参考。 其实..每次都是一个新的String 你可以这样想 我指向告诉你真正的答案第一:创建对象时,字符串采用直接赋值的方式,优先去常量池去查找,发现找不到,然后String str = new String("abc"); 意思是:str = "abc" 和new的方式一样第二:第二次创建对象,当然,这个对象的内存地址和之前的不一样,但是注意了,里面的字符串也是直接赋值的方式 我晕,没写完,发过去了。接着写因为也是直接赋值的方式,所有也去常量池查找,发现找到了。然后直接把引用地址拿来用了。所以说,第一个是创建String对象,而第二次是拿过来的引用地址,懂否 求hql指导~ 看看有问题吗? java的锁机制,到底都能锁住啥? 怎样核对两个txt档之间的相同字词呢? JSP中rs.getString ()的换行问题 帮忙看看,怎么显示不了结果!!!!!!谢了!!!!!!!!! why Error : Can't read classes.zip? 怎么让所有的servlet都调用同一个类的同一个实例? JBuilder6是不是不带CoreJava这个包? 那里有JB5的下载地址???? 求教:关于捕捉详细异常的 jdk缺失?AOSP源码Parcel类引用jdk中没有的方法 关于synchronized的几个问题
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
你实例化两个对象,并不会增加一个字符串常量abc存储在常量区,这跟编译器优化有关!
第一:创建对象时,字符串采用直接赋值的方式,优先去常量池去查找,发现找不到,然后String str = new String("abc");
意思是:str = "abc" 和new的方式一样
第二:第二次创建对象,当然,这个对象的内存地址和之前的不一样,但是注意了,里面的字符串也是直接赋值的方式
因为也是直接赋值的方式,所有也去常量池查找,发现找到了。然后直接把引用地址拿来用了。
所以说,第一个是创建String对象,而第二次是拿过来的引用地址,懂否