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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王健宇 中级黑马   /  2012-10-19 17:51  /  1920 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String是不是有两种实例化方式,一种是通过直接赋值的方式,另一种是使用new实例化。
这两种方式的区别是什么??

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

3 个回复

倒序浏览
使用 String a = "java"; 时,java虚拟机,会先在缓冲池查找有没有相同的字符串,如果找到有,

就拿出来直接使用,如果找不到没有,就创建一个新的字符串放在缓冲池。

在来个 String b = "java"; 那么 a 和 b 是同一个存储对象。

使用 String a = new String("java"); 这种构造方法去创建爱你对象时,java 每次调用都会创建一个新的对象。

再来个 String b = new String("java"); ,这时的 a 和 b 就是两个存储对象。

一般建议使用双引号创建,双引号使用缓存池,效率高,速度快。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 徐梦侠 于 2012-10-19 18:12 编辑

我想你问的是这两种的区别。
String str=new String("abc");
String str1="abc";
一个字符串(例如:”abc“)就是String的一个匿名对象。而new不管如何都会又开辟一片新空间,并赋值”abc“。所以str的赋值方式相当于创建了两个对象,只是最后匿名对象由于没有引用指向而成为垃圾,会被回收。而对于str1的方式,如果一个字符串已经被一个名称引用,那么以后如果再有相同的字符串声明时,就不会再重新开辟空间,而也是指向这个匿名对象。
它们的区别你可以从下面代码中发现。
public class Test {   
    public static void main(String[] args) {
     String str1="abc";
     String str2="abc";
     String str3=new String("abc");
     String str4=new String("abc");
     System.out.println(str1==str2);//true
     System.out.println(str1==str3);//false
     System.out.println(str3==str4);//false
    }
}
所以对于字符串的操作通常采用直接赋值的方式完成,这样节约内存资源。

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

回复 使用道具 举报
String s1 = “abc”;  //s1是一个类类型变量,“abc”是一个对象。字符串:一旦被初始化就不可以被改变。
String s2 = new String(“abc”);
   System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true.  String类复写了Object类中equals方法。该方法用于判断字符串是否相同。
s1 和s2有什么区别?
s1在内存中有一个对象。
s2在内存中有两个对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马