黑马程序员技术交流社区
标题:
String的问题
[打印本页]
作者:
高欢欢
时间:
2012-7-26 09:16
标题:
String的问题
String a= "1 "; 和 String a=new String(); 以及 String a=new String( "1 ")到底有啥区别?谢谢
作者:
田向向
时间:
2012-7-26 09:28
第一个:a直接在栈内存中开辟一个空间,名字叫a,然后直接将“1”赋值给a。1是一个对象,a是变量,一个String类型的变量指向了对象
第二个:是new一个对象。
第三个:里面有两个对象,一个是new出来的a引用对象,一个是“1”
作者:
位雪
时间:
2012-7-26 09:28
String是一个特殊的包装类数据。可以用:String str = new String("1"); String str = "1"; 两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中,每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str,然后通过符号引用去字符串常量池 里找有没有"1",如果没有,则将"1"存放进字符串常量池,并令str指向"1",如果已经有"1" 则直接令str指向"1"。String str = "1"; 在编译期就被确定了,放在常量池中。用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它有自己的地址空间。
new String()和new String("")都是申明一个新的空字符串,是空串不是null
作者:
肖琦
时间:
2012-7-26 09:49
public class Test {
public static void main(String[] args) {
String str1 = "1";
String str2 = "1";
String str3 = new String("1");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
}
}
//结果是:true,false
复制代码
写个小程序帮助理解吧!
str1 = “1”的操作:
java 虚拟机会到内存池中去找有没有已经存储“1”这个空间,
如果有的话,就把此空间的地址给str1,
没有的话,开劈一块空间存储“1”,把地址给到str1.
String str3 = new String("1")的操作:
因为用到了new关键字,java虚拟机不管你内存池中是否有存储了“1”的空间,
直接开劈空间放“1”,把地址给到str3.
因为==比较的是地址是否相等,所以结果是true,false。
希望对你的理解有帮助............
作者:
李菁
时间:
2012-7-26 09:50
String a= "1 ";
先查找栈里有没有"1",如果有就用a引用这个值,如果没有就把“1”存进栈
String a=new String( "1 ");
在堆里面建立的对象a,就是不管内存里是不是已经有"1"这个对象,都新建一个对象保存"1"。这创建了两个对象,a的引用1和对象a
String a=new String();
也是在堆里建立对象a,但只有一个对象a
作者:
罗宵
时间:
2012-7-26 11:20
一般创建字符串的方法:String str = new String(“1"); 或String str = "1"; 两种的形式。
String str="1",首先在字符串常量池中存储一个1,在栈内存总定义了一个变量str,str指向'"1"。
String str = new String(“1"); 首先在字符串常量池中存储一个1,在堆内存中new String对象,指向"1",再将地址值赋给栈内存中的str。
String str = new String();新建了一个值为null的String对象,
作者:
姬仁贵
时间:
2012-7-26 17:45
String a= "1 "; 这句话的语义就是创建一个String类型的变量,并对其进行赋值操作嘛! 这没啥好讲的。
String a=new String(); 这句话是一个对象建立的过程,首先是在栈内存中开辟一个空间命名为a,然后通过new关键字在堆内存中开辟一个空间,并将空间的地址值赋值给栈内存中的a。
String a=new String( "1 ");这句话的具体含义我也不怎么太清楚,因为这是一个对象建立的过程但是同时也带着参数的传递。我提问过这个问题,但是到现在也没有完全理解,以我现在的理解如上面一句话建立一个对象同时对String类里面的带参数的构造方法进行调用,
http://bbs.itheima.com/thread-20335-1-1.html
这是我提问的帖子 你可以参考一下。
作者:
曹晓涵
时间:
2012-7-26 18:44
1、字符串对象的创建:String a = "1"。
由于字符串对象的大量使用,Java中为了节省内存空间和运行时间,在编译阶段就把所有的字符串文字放到一个文字池中,而运行时文字池成为常量池的一部分。文字池的好处是该池中 所有相同的字符串常量被合并,只占用一个空间。
String a = "1";
上面的代码只在文件池pool中创建了一个String 对象。
2、字符串对象的创建:String a = new String("1")
这里“1”本身就是文件池pool中的一个对象,而在运行时执行new String()时,将文件池pool中的对象复制一份到堆heap中,并把heap中的这个对象的引用交给a持有。
String a = new String("1")这条语句就创建了2个String对象。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2