当前位置: 技术问答>java相关
为什么string类不用new 呢?
来源: 互联网 发布时间:2015-09-04
本文导语: 字符串类不是java的基本数据类型,而是作为类用的,那么,我们在声明一个String对象时,为什么不用new()呢?? 例如:String password="ok"; 这里为什么不这样呢?String password=new String("ok"); 有这方面的文档说明吗? ...
字符串类不是java的基本数据类型,而是作为类用的,那么,我们在声明一个String对象时,为什么不用new()呢??
例如:String password="ok";
这里为什么不这样呢?String password=new String("ok");
有这方面的文档说明吗?
例如:String password="ok";
这里为什么不这样呢?String password=new String("ok");
有这方面的文档说明吗?
|
我来解释一下,String作为一个类来说,当然可以用new来构造,String有3个构造函数:
String();
String("xxx");
String(new StringBuffer());
这两条语句的效果是一样的
String password="ok";
String password=new String("ok");
不同的是,第一条现在内存中创建了"ok"这个String,然后将reference赋给password,如果这个时候还有一条语句String pwd = "ok";那么JVM将不再创建"ok",而是直接将第一个"ok"的reference赋给pwd,也就是说,password和pwd是使用同一块内存,而如果加上String pwd = new String("ok");那JVM将在内存中再创建一块区域放上“ok”这个字符串。
String();
String("xxx");
String(new StringBuffer());
这两条语句的效果是一样的
String password="ok";
String password=new String("ok");
不同的是,第一条现在内存中创建了"ok"这个String,然后将reference赋给password,如果这个时候还有一条语句String pwd = "ok";那么JVM将不再创建"ok",而是直接将第一个"ok"的reference赋给pwd,也就是说,password和pwd是使用同一块内存,而如果加上String pwd = new String("ok");那JVM将在内存中再创建一块区域放上“ok”这个字符串。
|
String password=new String("ok");
这样也没有错。
但是String password="ok";利用到了字符串缓冲池,也就是说如果缓冲池中已经存在了相同的字符串,就不会产生新的对象,而直接返回缓冲池中的字符串对象的引用。
如:
String a = "ok";
String b = "ok";
String c = new String("ok");
String d = new String("ok");
System.out.println(a==b);//将输出"true";因为两个变量指向同一个对象。
System.out.println(c==d);//将输出"flase";因为两个变量不指向同一个对象。虽然值相同,只有用c.equals(d)才能返回true.
所以实际中,建议用第一种,可以减少系统资源消耗。
这样也没有错。
但是String password="ok";利用到了字符串缓冲池,也就是说如果缓冲池中已经存在了相同的字符串,就不会产生新的对象,而直接返回缓冲池中的字符串对象的引用。
如:
String a = "ok";
String b = "ok";
String c = new String("ok");
String d = new String("ok");
System.out.println(a==b);//将输出"true";因为两个变量指向同一个对象。
System.out.println(c==d);//将输出"flase";因为两个变量不指向同一个对象。虽然值相同,只有用c.equals(d)才能返回true.
所以实际中,建议用第一种,可以减少系统资源消耗。