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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

石义良

中级黑马

  • 黑马币:16

  • 帖子:51

  • 精华:0

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

5黑马币
String a=new String("a")和String a="a"有什么区别

最佳答案

查看完整内容

一:String a=new string("a")的创建过程: 是直接调用String的构造方法String(xx)来创建一个新的字符串“a”,简单说就是在常量池中给“a”分配一个新的内存地址并存储,a 指向该地址 同理String b=new string("a"),也是创建一个新字符串(a),然后存储在另一个新的地址,b 指向该地址,所以用该方式创建的a和b的字符串相同或不同都不会指向同一个内存地址; 可以这么理解:a=直接分配(新地址1),地址值为‘’a‘’. ...

50 个回复

倒序浏览
本帖最后由 缤纷落叶 于 2015-3-30 16:58 编辑

一:String a=new string("a")的创建过程:
是直接调用String的构造方法String(xx)来创建一个新的字符串“a”,简单说就是在常量池中给“a”分配一个新的内存地址并存储,a 指向该地址
同理String b=new string("a"),也是创建一个新字符串(a),然后存储在另一个新的地址,b 指向该地址,所以用该方式创建的a和b的字符串相同或不同都不会指向同一个内存地址;
可以这么理解:a=直接分配(新地址1),地址值为‘’a‘’.
                     b=直接分配(新地址2),地址值为‘’a‘’.
二:tring a="a"的创建过程:
先看常量池中是否有"a",如果有a就指向"a"的地址;如果没有,新建一个"a"放入池中,然后a指向"a"
如果此时再创建  String b="a" ,由于池中已经有"a"了,所以b就直接指向“a";所以用该方式创建的a和b的字符串相同都指向同一个内存地址;
可以这么理解:先判断内存中是否有“a”,
                                                   1.有:a=旧地址1,地址值为‘’a‘’.
                                                           b=旧地址1,地址值为‘’a‘’.
                                                            .....................................................(省略一大堆)

                                                   2.没有: a=分配(新地址1),地址值为‘’a‘’.
                                                                b=(新地址1),地址值为‘’a‘’.
                                                                 ..................................................(省略一大堆)
回复 使用道具 举报
1、String a="a";这个首先会在内存中寻找,如果有就调用,没有就String a = new String("a");
2、String a = new String("a");这个不管内存中有没有,都会创建。
回复 使用道具 举报
String a;
a== null;
a 没有指向一个对象
String a = new String ()
a != null;
a 指向了一个对象
回复 使用道具 举报
这个作为我们初学者都会遇到的问题,文字什么的肯定是看了之后还是记不得的,找张纸,画个栈、堆内存,然后哪个属于栈的哪个属于堆的,先搞明白,只要知道怎么画图以后学什么就很好理解了,这些要靠自己动手才记得住。
回复 使用道具 举报
String a="a";String b="a";String c = new String("a");
则有a==b 的值是true  ; a==c的值是false
回复 使用道具 举报
这是堆栈的区别,
一个是在堆里生成的,
一个是在栈里生成。
列如:
String a="a";String b="a";String c = new String("a");
则有a==b 的值是true  ; a==c的值是false
回复 使用道具 举报
String a= new String("a");  
     会在堆中创建“a”的的实例,然后在栈中创建该实例的引用;
String a="a"
      会先在堆中查看是否有“a"的实例,,如果没有则创建。有则指向该实例
回复 使用道具 举报
【String a=new String("a")和String a="a"有什么区别】
[1].  String a="a":
创建一个String类型的引用变量a,指向常量池的实例对象"a"。
"a"这个对象放在字符串常量缓冲区,常量""不管出现多少遍,都是缓冲区中的那一个。

[2].  String a= new String("a"):
创建一个String类型的引用变量a,  new String语句创建了一个对象,它根据字符串常量"a"对象的内容来创建的一个新的String对象,
如果常量"a"已经在程序中使用过了,就不会重新创建常量"a",而是直接从字符串常量缓冲区中直接获取。 然后将变量a指向这个新创建的String对象。
也就是说:
  • 如果常量"a",在程序中是第一次被使用,则这句代码,会创建两个实例对象:字符串常量“a”和new的新String对象
  • 如果常量"a",在程序中已经被使用过,则这句代码,只会创建一个实例对象:new的新String对象

这样分析,可以理解了嘛?希望可以帮到你哦~ 强烈求黑马币哦:#




回复 使用道具 举报
String a="a";这个首先会在内存中寻找,如果有就调用,没有就String a = new String("a");
2、String a = new String("a");这个不管内存中有没有,都会创建。
回复 使用道具 举报

String a="a";a是一个类类型变量,在内存中只有"a"一个对象。
String a=new String("a");a在内存中有两个对象,new一个,”a”一个
回复 使用道具 举报
String a = "a";是一个字面量,存储在栈中;
String a = new String("a"); 创建一个对象,对象的内容是"a",引用a存储在栈中,引用a所指的那个对象存在堆中。
回复 使用道具 举报
String a = "a";是一个局部变量,存储在栈中;
String a = new String("a"); 用new创建一个对象,毕老师有说过用new创建的都为实例,存储在堆中;

所以区别应该在于一个存储的内存区不一样
回复 使用道具 举报
String a="a";先在内存中找是不是有"a"这个对象,如果有,就让a指向"a".如果没有"a",就创建一个新的对象保存"a". String a=new String("a")就是不管内存里是不是已经有"a"这个对象,都创建一个对象来保存"a"
回复 使用道具 举报
String a = new String("a")会在内存中创建一个字符串“a”的副本,所以内存中会有两个“a”对象
回复 使用道具 举报

String a=new String("a")  在内存中有两个对象 new String,“a"
String a="a"  在内存中只有一个对象 “a"
回复 使用道具 举报
就是用来讲没什么差别,也可以先定义String a;
a="XXX";这样感觉更好点分开,到时候定义和赋值两个动作使用起来更加方便
回复 使用道具 举报
只要new出来的  ,在内存中他就有两个指针指向字符串a,而第二个只有一个对象,第一个是两个对象
回复 使用道具 举报

String a=new String("a"),其实是先创建常量字符串a,而后在创建堆对象'a'
String a="a"只有一个a
回复 使用道具 举报
String a=new String("a")在内存中有两个对象。
String a="a"在内存中有一个对象。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马