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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高欢欢 中级黑马   /  2012-7-26 09:16  /  1406 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String   a= "1 ";   和   String   a=new   String();   以及   String   a=new   String( "1 ")到底有啥区别?谢谢

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
第一个:a直接在栈内存中开辟一个空间,名字叫a,然后直接将“1”赋值给a。1是一个对象,a是变量,一个String类型的变量指向了对象
第二个:是new一个对象。
第三个:里面有两个对象,一个是new出来的a引用对象,一个是“1”
回复 使用道具 举报
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
回复 使用道具 举报
  1. public class Test {
  2.    public static void main(String[] args) {
  3.          String str1 = "1";
  4.          String str2 = "1";
  5.          String str3 = new String("1");
  6.          System.out.println(str1 == str2);
  7.          System.out.println(str1 == str3);
  8.    }
  9. }
  10. //结果是:true,false
复制代码
写个小程序帮助理解吧!
str1 = “1”的操作:
                   java 虚拟机会到内存池中去找有没有已经存储“1”这个空间,
                           如果有的话,就把此空间的地址给str1,
                           没有的话,开劈一块空间存储“1”,把地址给到str1.
String str3 = new String("1")的操作:
                   因为用到了new关键字,java虚拟机不管你内存池中是否有存储了“1”的空间,
                    直接开劈空间放“1”,把地址给到str3.
因为==比较的是地址是否相等,所以结果是true,false。
希望对你的理解有帮助............
回复 使用道具 举报
String   a= "1 ";      先查找栈里有没有"1",如果有就用a引用这个值,如果没有就把“1”存进栈
String   a=new   String( "1 ");      在堆里面建立的对象a,就是不管内存里是不是已经有"1"这个对象,都新建一个对象保存"1"。这创建了两个对象,a的引用1和对象a
String   a=new   String();    也是在堆里建立对象a,但只有一个对象a
回复 使用道具 举报
一般创建字符串的方法: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对象,
回复 使用道具 举报
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这是我提问的帖子   你可以参考一下。
回复 使用道具 举报
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对象。
        

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马