A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

石义良

  • 黑马币:16

  • 帖子:51

  • 精华:0

© 石义良   /  2015-3-30 13:17  /  12304 人查看  /  50 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

首先,字符串类是一个被final修饰的类,字符串对象一旦被赋值,不可以改变。所以,在内存的方法区中会有一片区域称为常量池,字符串在内存中都放在常量池中。String a="a"这条语句,就是string类型变量a指向常量池中的一个字符串对象“a”。而String a=new String("a");这条语句,是在堆内存中创建一个string对象a,被初始化为“a”。所以这个a可以为null。
回复 使用道具 举报
还有就是,string a=new  String("a");在内存中有两个对象,一个是string对象
,一个是常量池中的“a”。而String a="a",在内存中只有一个对象。就是常量池中的那个
回复 使用道具 举报
String a="a"定义一个局部变量,将a变量存储在栈内存中,String a=new String("a")创建一个String 对象的实例,会在栈内存和堆内存开辟空间,引用变量a指向该对象并存储在栈内存,将"a"存储在堆内存中
回复 使用道具 举报
你看下面结果应该就知道怎么会事的
String aa="abc"  
Sring bb =new String("abc")
String cc ="abc"
Stirng dd = new  String("abc")
System.out.println(aa==bb); false
System.out.println(aa==cc);  true
System.out.println(bb==dd);  false
注:Sting aa="abc"  的解释因为字符串不可以改变的,常量池中已经有了abc所以不新建了,所以是同一对象。它们是在date区中。
Stirng dd = new  String("abc")  很明显是一下对像,bb和dd不是指向同一个对像所以不相同
回复 使用道具 举报
你看下面结果应该就知道怎么会事的
String aa="abc"  
Sring bb =new String("abc")
String cc ="abc"
Stirng dd = new  String("abc")
System.out.println(aa==bb); false
System.out.println(aa==cc);  true
System.out.println(bb==dd);  false
注:Sting aa="abc"  的解释因为字符串不可以改变的,常量池中已经有了abc所以不新建了,所以是同一对象。它们是在date区中。
Stirng dd = new  String("abc")  很明显是一下对像,bb和dd不是指向同一个对像所以不相同
回复 使用道具 举报
很显然这涉及到Java的内存机制。String a = new String("a")中的变量a指向两个地方,一个是在常量池中,一个是在堆内存中,常量池的为"a",堆内存中为new的一个对象,这样的好处是我们每次都new了一新的对象,可方便的对新的对象赋值,弊端是占用的内存多一点。String a="a"就简单一些,变量a指向常量池中的“a”,这样的好处是减少了内存的占用,缺点却是致命的,如果之前已经有一个指向“a”的对象,那么String a="a"并没有新建一个对象,而是指向之前建立的对象,修改a时很可能把之前建立的对象也改变了。所以为了安全起见,String a=new String("a")使用更广泛。
回复 使用道具 举报
String a = new String(“a”);在内存中有两个对象存在,首先在常量池中找”a”,
如果没有就创建一个,然后把该对象的地址值赋值给了new String(“a”);
最后把new的对象复制给引用a。但是 String a = “a”;只在常量池里面有一个对象。
回复 使用道具 举报
String a=new String("a");中a的值是对象的地址值,而String a="a";中a的值是字符串“a”
回复 使用道具 举报
缤纷落叶 发表于 2015-3-30 16:53
一:String a=new string("a")的创建过程:
是直接调用String的构造方法String(xx)来创建一个新的字符串“a ...

本来大致理解这两个语句的区别,听这哥们一讲顿时清楚明晰了。赞赞赞
回复 使用道具 举报
以String a = "a" ;方式声明字符串会在栈内存中的字符串池中创建变量a,如果字符串池中已有a,则不会在创建a并且以后以这种方式声明字符串变量“a”与a有  a==“a”,

以String s = new String("a"); 方式声明,会现在栈内存的字符串池中先判断“a”是否存在。如果不存在就在字符串中创建“a”的变量,并在堆内存创建字符串对象并把地址值赋给s;如果字符串吃池中存在就不会再在字符串池中创建“a”变量。接着在堆内存中创建字符串对象并把地址值赋给s。
回复 使用道具 举报
第一个String a=new String("a")是两个对象,即常量池一个,new出来的堆内存一个。第二个String a="a"只是一个对象,就在常量池,是不可改变的量。
回复 使用道具 举报
new  就是在堆内存中开辟了一个空间
回复 使用道具 举报


String a=new String("a")  在内存中会创建两个对象 new String(),“a"
String a="a"  在内存中只有一个对象 “a"
回复 使用道具 举报
使用起来是一样的。区别是他们是两个不同的对象,判断==返回的的是false,判断equals返回的是true,应为String类复写了Object中的equals方法
回复 使用道具 举报
String a = new String("a");--在堆内存中有创建了一个对象,方法区的常量池有一个。String a = "a"--只创建了一个对象。答得不好,互相学习。
回复 使用道具 举报
String a=new String("a")在堆中建立了一个新的对象,并且赋值,String  a在常量区,如果有就直接调用,没有就创建
回复 使用道具 举报
String a =new String ("a") 这是创建了一个对象   左面的String在栈内存里面   右面的new String 在堆内存里面创建了一个对象   值为a     右面的String a=“a”   是直接就给复制了差距就是一个在堆内存里面创建的  用完就消失了 一个不在堆内存里面不会随着对象的消失儿消失
回复 使用道具 举报
String a,只是声明了一个变量,存储在"栈"中。。。String a = new String(),不仅在栈中声明了这个变量,同时在“堆”中划分了一片区域(为空),变量存储只想这片区域的地址。。。String a = "This sucks!",就是把“堆”中填充上"This sucks!"的内容
回复 使用道具 举报
补充一下:
String a:定义一个字符串类型的变量名为a的变量
String a = new String () :这句活的作用是创建一个对象
String是数据类型,但不是字符串类型,这里指的是引用类型,是一个String类。
String ()是构造函数
new在堆内存中开辟一个空间,String ()完成构造函数的初始化动作后,把空间的地 址值赋值给a
回复 使用道具 举报
String a= new String("a")是创建一个对象,String a=“a”;是一个定义就像int a=1思想一样;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马