字符串的初始化问题 String str="abc";String str1="abc";Sstrin str2= new String("abc");str1 和str 是不是放在堆里面, 这两种初始化到底有什么区别 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 str和str1当然没区别啊,只是变量名不一样。str2是有区别的,前面两个都只创建了1个对象,而str2创建了2个对象 str 与 str1 除了变量名不一样,其他都一样,也是指向同个对象str2 则重新new 了个对象 String str="abc";这时是两个对象 一个str对象,abc字符串对象(abc放到字符串常量池中),str指向abc。String str1=“abc”创建了另一个str1对象。 abc在常量池中找到了则不再创建。str2同str1。 str和str1当然没区别啊,只是变量名不一样。str2是有区别的,前面两个都只创建了1个对象,而str2创建了2个对象常量池不是堆的一部分 JVM中的常量池在内存当中是以表的形式存在的 既然常量池有了"abc" 那为什么new的时候, 不直接让str3这个引用指向已经存在的"abc"对象 String str = new String("abc"); String str = "abc"; 两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。 str1 和str 、str2这三个对象放在栈里边,他们的内容放在堆里边。使用直接赋值的方式只需要一个实例化对象即可,而使用new String()的方式则意味着要开辟两个内存对象。开发中最好使用直接赋值的方式完成 public class Test {public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); System.out.println(s1==s2); System.out.println(s1==s3); System.out.println(s2==s3); }}看看这个,其实是一样的道理。 你可以利用intern()和equals()来做一下试验 String是数据类型中的特例。String类型的数据全部由String Pool统一管理。String Pool中的创建方式和栈区的变量相同,先在其中找该数据,找到的话直接指向,否则创建。String str1="" 这种方式是在String pool中先找,没有的话创建,并由栈中变量Str1指向(引用)。str2是找到str1指向的内容,比较发现一致,让str2也指向。用new的方式:也是先在String pool中创建,并将其拷贝放在堆中。让变量指向堆中的拷贝。也就是说每次创建的对象都是在String pool中。只是new 出来的必须放在堆中,但其实只是pool中的拷贝而已。 本质上就是你所说的,不过这是一部分而已。new的时候是先让它指向常量区的。但是请务必记住new是要在堆中的。所以这里采用了一种机制。当时用new方式创建对象的时候,先在常量区(实际上是常量区中专门处理String类型的string pool进行处理的)寻找或创建,并且让str3指向这个在string pool中的对象。由于Java本身的设计,紧接着,它会动态的将创建好的对象的拷贝放在堆中,原来是指向string pool中的,马上重新指向堆中的这份拷贝。也就是说分两步:第一步,先指向常量区对象。第二步,当常量区把考贝放入堆中的时候,重新指向堆中的拷贝。因为它必须遵守new出来即在堆中的原则。 只看楼主 回复 标题要长 求助求助求助 Font类中的 getStringBounds() 请教大虾:java实现Comparable接口问题? 请解析一下这个关于线程的程序 关于JDBC异常 我想请教你们 如何在两个方法之间传递参数 用actionPerformed激活另外一个frame,怎么能在frame里面设完值后在执行下面的语句 关于new File(path)的问题!急 谁能详细讲讲回调 一个简单的问题(在线) BufferedInputStream不行了头大了,老鸟们救命啊! swing 表格中有filedialog该怎么渲染
str2是有区别的,前面两个都只创建了1个对象,而str2创建了2个对象
str2 则重新new 了个对象
这时是两个对象 一个str对象,abc字符串对象(abc放到字符串常量池中),str指向abc。
String str1=“abc”
创建了另一个str1对象。 abc在常量池中找到了则不再创建。
str2
同str1。
str2是有区别的,前面两个都只创建了1个对象,而str2创建了2个对象常量池不是堆的一部分 JVM中的常量池在内存当中是以表的形式存在的
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s2==s3);
}
}
看看这个,其实是一样的道理。
String类型的数据全部由String Pool统一管理。
String Pool中的创建方式和栈区的变量相同,先在其中找该数据,找到的话直接指向,否则创建。String str1="" 这种方式是在String pool中先找,没有的话创建,并由栈中变量Str1指向(引用)。
str2是找到str1指向的内容,比较发现一致,让str2也指向。用new的方式:也是先在String pool中创建,并将其拷贝放在堆中。让变量指向堆中的拷贝。
也就是说每次创建的对象都是在String pool中。只是new 出来的必须放在堆中,但其实只是pool中的拷贝而已。
new的时候是先让它指向常量区的。但是请务必记住new是要在堆中的。所以这里采用了一种机制。当时用new方式创建对象的时候,先在常量区(实际上是常量区中专门处理String类型的string pool进行处理的)寻找或创建,并且让str3指向这个在string pool中的对象。由于Java本身的设计,紧接着,它会动态的将创建好的对象的拷贝放在堆中,原来是指向string pool中的,马上重新指向堆中的这份拷贝。
也就是说分两步:
第一步,先指向常量区对象。
第二步,当常量区把考贝放入堆中的时候,重新指向堆中的拷贝。因为它必须遵守new出来即在堆中的原则。