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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 歌诗王道 中级黑马   /  2014-4-7 00:00  /  1141 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 歌诗王道 于 2014-4-7 00:03 编辑
  1. class StringDemo
  2. {
  3.    public static void main(String[] args)
  4.    {
  5.        String s1 = "abc";
  6.        String s2 = new String("abc")
  7.     }
  8. }
复制代码


为什么s2在内存里有两个对象?是哪两个对象?

评分

参与人数 1技术分 +1 收起 理由
黑妞~ + 1

查看全部评分

8 个回复

正序浏览
String s1 = "abc",一个对象s,指向字符串常量"abc"在栈中的地址;
String s2 = new String("abc"),两个对象,一个s2,一个new String("abc");

只有String如此特别,像Abc a = new Abc(),绝大多数情况,只创建一个对象。
回复 使用道具 举报
一个是字符串字面量"abc"所对应的、在字符串常量池中的实例,
另一个是通过new String(String)创建并初始化的、内容与"abc"相同的实例
回复 使用道具 举报
创建的两个对象是 new String() 和 abc
回复 使用道具 举报
就是直接赋值字符串和new一个String对象的区别,如下所示:
String s4 = "def";
String s5 = new String("def");
String s6 = "def";

System.out.println(s4 == s6);//true,因为这里s4和s6是同一个对象
System.out.println(s4.equals(s6));//true,显然s4和s6的内容也是相同的
               
System.out.println(s5 == s6);//false,s1和s5是两个不同的对象
System.out.println(s5.equals(s6));//true,因为s5和s6的内容相同,都是“def”

对于直接赋值字符串的方式·  java有一个字符串缓冲区 你新建一个的时候它会先找缓冲区里有没有这个字符串 如果有 直接返回引用 没有就在里面新建
对于new String()的方式 :要新建一个String对象 它首先也会去缓冲区里边查找  不管有没有 它都会在堆里新建一个  如果缓冲区里面没有 则在缓冲区里面也新建一个

希望可以帮到你

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个就是string类的一个重点吧,string s1 = "abc" ;在内存中开辟一个对象,而String s2 = new String("abc") ;在New之前在内存中就已经有一个对象了,new之后则又重新开辟了一个对象,所以有两个对象。

无标题.png (21.49 KB, 下载次数: 19)

无标题.png
回复 使用道具 举报
这就是String类的重点,String s1 = "abc";是直接赋值的方式,在内存中开辟一个内存空间,而String s2 = new String("abc");new开始前,内存中就已经有了数据了,new一下,又重新开辟了一个空间,存入数据,所以有两个对象。
C:\Users\user\Desktop
回复 使用道具 举报
1,  String s2 ;在栈内存中创建了一个引用类型变量s2
2,new String("abc");这是真正的在堆内存中创建了对象(内存中开辟空间,值是“abc”)
3,将引用s通过“=”将指针指向堆内存中刚开的一块空间
回复 使用道具 举报
public class StringDemo {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                       String s1 = "abc";
                       String s2 = new String("abc");
                       System.out.println(s2);
                       System.out.println(s2.hashCode());
                    }

        }
运行结果是:
abc
96354

不知道你说的两个对象是什么意思?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马