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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 回天之力 中级黑马   /  2013-10-24 13:32  /  1181 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. 1,String s1="abc";
  2.    s1="kkkk";

  3. 2,String s2=new String("abc");
复制代码
第一个问题:1代码中,课程中讲到是“abc”是一个对象,而s1为类类型变量,那么当s1=“kkkk”;后,那“abc”这个对象不是无法引用了吗?那它还存在内存中吗?
第二个问题:2代码中,String s2=new String("abc");  这个里面s2和“abc”都是对象,也可以这么说s2也指向“abc”,那上面的s1也是指向对象的。那为什么s1不是对象?
  String s1="abc";   String s2=new String("abc");  这俩个代码在内存中存在方式,能解释一下吗?或者用毕老师的画图方法来说明一下。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
String s1="abc";
首先对s1成员变量进行初始化为null 然后显示初始化为abc,再给在把初始化后在内存的地址加入为ox1234,然后把
ox1234赋值给s1,那么s1就指向了那个初始地址;
s1="kkkk";这句话的进行赋值,先要找到s1原来的地址ox1234然后找到地址后,在把原来的内容abc赋值成kkkk

String s2=new String("abc");其实和String s2=“abc”;实质上是一样的;只是String s2=“abc”;是一种简写;
就好比int a【】=new int【】{1,2,3}等价于int a【】={1,2,3};

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
FFF 金牌黑马 2013-10-24 14:01:09
藤椅
本帖最后由 FFF 于 2013-10-24 14:04 编辑

问题1:"abc"一直存在于内存中,s1="abc"的意思是。s1是对abc对象的引用。
Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,
并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
当使用任何方式来创建一个字符串对象abc时,Java运行时(运行中JVM)会拿着这个x在String池中找是否存在内容相同的字符串对象,
如果不存在,则在池中创建一个字符串abc,否则,不在池中添加。
问题2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。也就是说,s1与s2内存地址不一样,但内容一样。s1==s2时对比的是两者的内存地址,所以s1!=s2。s1为什么不是对象,请看问题1。

最后再出一道题目给你做,如果你能目测到与电脑运行到的结果一样,那么对String的理解就很完整了。
代码如下:
  1. public class Test {
  2.         public static void main(String[] args) {
  3.                 String str = "abc";
  4.                 String str1 = "abc";
  5.                 String str2 = new String("abc");
  6.                 System.out.println(str == str1);
  7.                 System.out.println(str1 == "abc");
  8.                 System.out.println(str2 == "abc");
  9.                 System.out.println(str1 == str2);
  10.                 System.out.println(str1.equals(str2));
  11.                 System.out.println(str1 == str2.intern());
  12.                 System.out.println(str2 == str2.intern());
  13.                 System.out.println(str1.hashCode() == str2.hashCode());
  14.         }
  15. }

  16. 最后~打字打得好辛苦~~~
复制代码

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
楼主你好,如果问题已解决请将帖子状态修改为提问结束,

如果未解决请继续提问,谢谢合作

修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马