黑马程序员技术交流社区
标题:
关于String的问题
[打印本页]
作者:
Inspur
时间:
2013-9-15 07:47
标题:
关于String的问题
本帖最后由 杨增坤 于 2013-9-15 09:42 编辑
我想问问String str=new String("x");
和String str="x";
这两句话有什么区别,课上毕老师讲的没大听懂,以前自己都是使用第二种写法,以后做开发时最好使用哪种写法?谢谢大家
作者:
陶智第
时间:
2013-9-15 08:29
前者在内存中有两个对象,后者在内存中只有一个对象
两者在内存的地址不同,但他们对应的值相同
作者:
梦航
时间:
2013-9-15 08:30
如果你明白了如下所示代码,你就会明白其间的差别:
public class StrTest
{
public static void main(String[] args)
{
//
String str1 = "Java";
String str2 = "Java";
System.out.println(str1 == str2);
//
String str3 = new String("Java");
String str4 = new String("Java");
System.out.println(str3 == str4);
}
}
复制代码
作者:
赵凯
时间:
2013-9-15 09:16
第一个变量str是创建了两个对象 一个是new String对象, 另一个对象是"x"字符串 ;
第二个变量 str 指向了一个对象,就是字符串对象,字符串存在于方法区的常量池;
作者:
Bad_Boy
时间:
2013-9-15 09:22
String str = new String("x");创建了两个对象:new String();对象存在堆内存中,"x"存在缓冲区中,str指向new String(),new String()指向"x".
String str = "x"则是在缓冲区创建了"x"
作者:
2012
时间:
2013-9-15 09:38
在java开发中,只要通过new关键创建的对象,都会在堆内存中动态分配一块内存。
String str=new String("x");
当程序运行到该句代码时,会在堆内存中分配一块内存控件,并在栈内存中创建一个引用变量str。该变量存储的是刚才在堆内存中分配的内存控件首地址。
String str="x"; 当程序运行到该句代码时,会在内存的缓存区中创建一个x的字符串。而不是在堆内存中动态分配一块内存。
还有一点很重要,每次通过new创建的对象都会在堆内存中分配内存空间,
比如:
String str=new String("x");
String str=new String("x");
当程序执行完上面两句时,会在堆内存中创建两个x字符串对象,虽然他们的内容都相同,但他们却是不同的对象。你可以通过equal比较这两个对象的内容,还可以通过“==”比较两个对象首地址是否相同。
String str="x";
String str="x";
这只会创建一个x字符串,当执行到第二句的时候,系统首先会去内存缓存区查找是否已经存在x了,如果存在,则直接拿来用就ok,不需要重新创建。
希望对你有所帮助!
作者:
wangning9130
时间:
2013-9-15 10:34
String str=new String("x")和String str="x" 指向的是两个不同内存地址。
你可以试一下,如果你用 system.out.println(s1==s2)输出的结果会是false。
如果你用system.out.println(s1.equals(s2))的话 输出的结果将会是true。
都是“x” 为什么结果会不一样呢。
因为前者“==”是判断两者在内存中的地址在内存中的地址是否相同。
而“equals”是在判断两者值是否相同。
懂否?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2