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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏克 中级黑马   /  2013-1-29 21:04  /  1611 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        String s1="abc";
  String s2=new String("abc");
  String s3="abc";
  System.out.println(s1==s2); false
  System.out.println(s1.equals(s2)); true
  System.out.println(s1==s3); true
   s1和s2的区别:
  s1在内存中有一个对象。
  s2在内存中有二个对象。
这里s2中有2个对象怎么理解,是说s2引用指向的内存地址存的是对象呢,对象引用呢?
我记得毕老师说过一句话, 字符串最大的特点:一旦被初始化就不可以被改变。
这句话怎么理解呢?

4 个回复

倒序浏览
String s1="abc";就是在栈内存中有个引用s1,它直接指向了字符串常量区的“abc”这个地址,
String s2=new String("abc");先在栈内存中建立引用s2,然后指向了堆内存中的实例new String(),而这个实例里面放的地址就是字符串常量区的“abc”这个地址。
所以第一个是一个对象,第二个是两个对象
回复 使用道具 举报
1:  String s2=new String("abc"); 首先栈内存中有了s2,s2指向堆内存的的对象new String(),new String()中存着一个地址值,就是"abc"在常量池中的地址值。
2:  字符串一旦被初始化就不可以被改变。举个例子,String s = "abcd";  s = "kkk"; 打印s的话输出结果就成了kkk,但是"abcd"没有被改变,只是s指向了"kkk"的地址值。
上面是我的理解,希望你能看懂
回复 使用道具 举报
涉及到java对于栈与堆的应用
String s1="abc";在栈内存中开辟一个值为‘abc’的空间,将引用赋值给s1
String s2=new String("abc");凡是new关键字创建的实例,肯定会被放到堆内存中,所以地址与s2!=s1
String s3="abc";没有通过new关键字声明,首先会在栈内存总寻找是否有值‘abc’,找到了为s1开辟的内存地址,并将地址赋值给s3.所以s1==s3

String类是不可变类,之所以可以被更改值,其实是新创建了新的值,并将新值的地址赋回
SringBuffer则是可变类,在堆内存中开辟空间,可以任意修改值而引用不变,比较两者不同可以更快掌握。
回复 使用道具 举报
补充一下:
String s2=new String("abc");凡是new关键字创建的实例,肯定会被放到堆内存中,所以地址与s2!=s1

s2 中存的是new String()的地址   new String()的值指向栈内存中已存在的‘abc’       s1直接指向‘abc’ 而s2直接指向new String()  所以s2==s1为false
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马