黑马程序员技术交流社区

标题: Sting s = new String("aaa");和String s = "aaa";有什么区别? [打印本页]

作者: 任我行    时间: 2014-12-15 15:28
标题: Sting s = new String("aaa");和String s = "aaa";有什么区别?
Sting s = new String("aaa");和String s = "aaa";有什么区别?
作者: lidinghai    时间: 2014-12-15 16:00
第一个带New的开辟了2个栈内存空间(字符串就是String的匿名对象,然后又New了一个),后面的直接赋值只开辟一个栈内存。
作者: chudaming213    时间: 2014-12-15 22:50
第一个是在堆内存中创建了一个String类对象,并在常量池中创建了“aaa”对象,使对中的对象指向了常量池;第二个是在常量池中创建了一个字符串对象;
作者: 青衫禅客    时间: 2014-12-16 00:18
String s =new String()分析堆与栈,是先定义S,还是先new string() 1. String str1 = "abc";      System.out.println(str1 == "abc");  步骤:  1) 栈中开辟一块空间存放引用str1; 2) String池中开辟一块空间,存放String常量"abc";  3) 引用str1指向池中String常量"abc"; 4) str1所指代的地址即常量"abc"所在地址,输出为true;     2. String str2 = new String("abc");      System.out.println(str2 == "abc");  步骤:  1) 栈中开辟一块空间存放引用str2;  2) 堆中开辟一块空间存放一个新建的String对象"abc";  3) 引用str2指向堆中的新建的String对象"abc"; 4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false;
作者: quick3g    时间: 2014-12-16 00:33
Sting s = new String("aaa");会在堆内存新开辟一块内存(即使内存中存在aaa对象);String s = "aaa";jvm会先查找堆空间,如果存在“aaa"对象,就把s指向这个对象,当堆空间中不存在"aaa",对象时都会新开辟内存。
作者: quick3g    时间: 2014-12-16 00:35
Sting s = new String("aaa");jvm会在堆内存新开辟一块内存(即使内存中存在"aaa"对象);
String s = "aaa";jvm会先查找堆空间,如果存在“aaa"对象,就把s指向这个对象,当堆空间中不存在"aaa"时,才会新开辟内存。
作者: I空空    时间: 2014-12-16 22:54
Sting s = new String("aaa");创建了两个对象new String()和 “aaa”的对象, String s1="aaa",只有一个对象。
所以s!=s1.但是由于String类重写了equals方法,只比较两个对象中的字符串内容是否相等。所以用equals比较时,s1==s




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