黑马程序员技术交流社区
标题:
String类创建对象
[打印本页]
作者:
歌诗王道
时间:
2014-4-7 00:00
标题:
String类创建对象
本帖最后由 歌诗王道 于 2014-4-7 00:03 编辑
class StringDemo
{
public static void main(String[] args)
{
String s1 = "abc";
String s2 = new String("abc")
}
}
复制代码
为什么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)
下载附件
2014-4-7 08:45 上传
作者:
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