Java创建字符串是用“”还是用构造器?
2015-11-17 21:25
274 查看
原文:Create Java String Using ”” or Constructor?
翻译:get-set
Java中,创建字符串有两种方式:
这两种方式有什么区别呢?
例1:
当同样的字符串再次被创建的时候,便不再创建新的字符串,这叫做“String interning”,编译期的字符串常量是自动interned的(就是会维护一个常量池,如果池中有这个字符串,那么直接引用之,否则再创建)。
例2:
下边的两幅图用以说明:
执行
翻译:get-set
Java中,创建字符串有两种方式:
String a = "abc"; String b = new String("abc");
这两种方式有什么区别呢?
1. 双引号 vs. 构造方法
这个问题可以由两个例子来说明。例1:
String a = "abcd"; String b = "abcd"; System.out.println(a == b); //True System.out.println(a.equals(b)); //True
a == b是true,因为
a和
b指向的都是位于方法区的同一个字符串,也就是他们的引用是一样的。
==是进行值的比较,对于原始类型来说,就是比较它们的值,对于引用类型来说,就是检查它们引用的是不是同一个对象。
当同样的字符串再次被创建的时候,便不再创建新的字符串,这叫做“String interning”,编译期的字符串常量是自动interned的(就是会维护一个常量池,如果池中有这个字符串,那么直接引用之,否则再创建)。
例2:
String c = new String("abcd"); String d = new String("abcd"); System.out.println(c == d); //False System.out.println(c.equals(d)); //True
c == d是false,因为c和d指向的不是一个引用,构造方法创建的字符串对象位于堆内存中,每次
new都是创建不同的对象,因此
c和
d的引用自然就不一致了。
下边的两幅图用以说明:
2. 运行时String Interning
当运行时,仍然可以实现String Interning,即使是使用构造方法创建的字符串:String e = new String("abcd").intern(); String f = new String("abcd").intern(); System.out.println(e == f); // True System.out.println(e.equals(f)); // True
执行
s.intern()方法的时候,会将共享池中的字符串与外部的字符串(s)进行比较,如果共享池中有与之相等的字符串,则不会将外部的字符串放到共享池中的,返回的只是共享池中的字符串,如果不同则将外部字符串放入共享池中,并返回其字符串的句柄(引用)– 这样做的好处就是能够节约空间。
3. 用哪个呢?
如无特别原因,尽量使用双引号“”来创建字符串,当必须创建一个新的字符串或需要在堆内存中创建字符串的时候,才需要使用到构造方法。相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统