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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李前进 中级黑马   /  2014-3-29 20:20  /  1167 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str = "abc";与
String str = new("abc");
有什么不同吗?

6 个回复

倒序浏览
                 String s1 = "abc";  //s1是一个类类型变量, "abc"是一个对象。
                                                //字符串最大特点:一旦被初始化就不可以被改变。

                String s2 = new String("abc");


                //s1在内存中有一个对象。
                //s2在内存中有两个对象。
               

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
第一个 是建立一个对象,
而第二个是建立了 ,两个对象,new一个就会产生一个对象,而里面的的内容是字符串,也是一个对象

这两个对象的内存地址值是 不同的但是呢里面的内容是相同的

基本上就是这个样子了

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报 1 0
String str = "abc";是将“abc”放到常量池里
String str = new("abc");是创建了一个新对象,该对象指向堆中的“abc”
回复 使用道具 举报
如果是:String str_1="abc"; String str_2=new String("abc");就明显了。
几个概念吧
1.常量池

  指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。

2.==: 比较是否是同一个对象

3.equals(): 比较的是对象里的内容
区别
第1种:

  String a="abc";
  String b="abc";
  System.out.print(a==b);
  结果:true
  原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。
第2种:
  String a=new String("abc");
  String b=new String("abc");
  System.out.print(a==b);
  结果:false
  原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。
第3种
  String a="abc";
  String b=new String("abc");
  System.out.print(a==b);
  结果:false
  原因:同上
第4种
  String a="abcdef";
  System.out.print(a=="abcdef");
  结果:true
  原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象
第5种
  String a="abcdef";
  String b="";
  String c=a+b;
  System.out.print(c=="abcdef");
  结果:false
  原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。

点评

回答的很详细,谢谢。  发表于 2014-3-30 20:09

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
小武8686886 发表于 2014-3-29 23:00
如果是:String str_1="abc"; String str_2=new String("abc");就明显了。
几个概念吧
1.常量池

这个可是我整理半天的啊 亲好好看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马