黑马程序员技术交流社区

标题: String类创建对象 [打印本页]

作者: 歌诗王道    时间: 2014-4-7 00:00
标题: String类创建对象
本帖最后由 歌诗王道 于 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在内存里有两个对象?是哪两个对象?

作者: 张耀扬    时间: 2014-4-7 00:37
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

不知道你说的两个对象是什么意思?
作者: Dijkstra    时间: 2014-4-7 02:21
1,  String s2 ;在栈内存中创建了一个引用类型变量s2
2,new String("abc");这是真正的在堆内存中创建了对象(内存中开辟空间,值是“abc”)
3,将引用s通过“=”将指针指向堆内存中刚开的一块空间
作者: 心?=忐§忑]    时间: 2014-4-7 08:43
这就是String类的重点,String s1 = "abc";是直接赋值的方式,在内存中开辟一个内存空间,而String s2 = new String("abc");new开始前,内存中就已经有了数据了,new一下,又重新开辟了一个空间,存入数据,所以有两个对象。
C:\Users\user\Desktop
作者: 心?=忐§忑]    时间: 2014-4-7 08:49
这个就是string类的一个重点吧,string s1 = "abc" ;在内存中开辟一个对象,而String s2 = new String("abc") ;在New之前在内存中就已经有一个对象了,new之后则又重新开辟了一个对象,所以有两个对象。

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

无标题.png

作者: zhangbingyuan    时间: 2014-4-7 09:40
就是直接赋值字符串和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对象 它首先也会去缓冲区里边查找  不管有没有 它都会在堆里新建一个  如果缓冲区里面没有 则在缓冲区里面也新建一个

希望可以帮到你
作者: xuehuayous    时间: 2014-4-7 09:52
创建的两个对象是 new String() 和 abc
作者: 曲佳奇    时间: 2014-4-7 11:29
一个是字符串字面量"abc"所对应的、在字符串常量池中的实例,
另一个是通过new String(String)创建并初始化的、内容与"abc"相同的实例

作者: 沫然    时间: 2014-4-7 11:53
String s1 = "abc",一个对象s,指向字符串常量"abc"在栈中的地址;
String s2 = new String("abc"),两个对象,一个s2,一个new String("abc");

只有String如此特别,像Abc a = new Abc(),绝大多数情况,只创建一个对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2