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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Sting s = new String("aaa");和String s = "aaa";有什么区别?

评分

参与人数 1黑马币 +3 收起 理由
杨佳名 + 3

查看全部评分

6 个回复

正序浏览
I空空 中级黑马 2014-12-16 22:54:05
7#
Sting s = new String("aaa");创建了两个对象new String()和 “aaa”的对象, String s1="aaa",只有一个对象。
所以s!=s1.但是由于String类重写了equals方法,只比较两个对象中的字符串内容是否相等。所以用equals比较时,s1==s
回复 使用道具 举报
Sting s = new String("aaa");jvm会在堆内存新开辟一块内存(即使内存中存在"aaa"对象);
String s = "aaa";jvm会先查找堆空间,如果存在“aaa"对象,就把s指向这个对象,当堆空间中不存在"aaa"时,才会新开辟内存。
回复 使用道具 举报
Sting s = new String("aaa");会在堆内存新开辟一块内存(即使内存中存在aaa对象);String s = "aaa";jvm会先查找堆空间,如果存在“aaa"对象,就把s指向这个对象,当堆空间中不存在"aaa",对象时都会新开辟内存。
回复 使用道具 举报
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;

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
第一个是在堆内存中创建了一个String类对象,并在常量池中创建了“aaa”对象,使对中的对象指向了常量池;第二个是在常量池中创建了一个字符串对象;
回复 使用道具 举报
第一个带New的开辟了2个栈内存空间(字符串就是String的匿名对象,然后又New了一个),后面的直接赋值只开辟一个栈内存。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马