Java创建字符串是用“”还是用构造器?
来源:互联网 发布:mac这么下载阿里旺旺 编辑:程序博客网 时间:2024/05/16 16:22
原文:Create Java String Using ”” or Constructor?
翻译: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); //TrueSystem.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); //FalseSystem.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); // TrueSystem.out.println(e.equals(f)); // True
执行
s.intern()
方法的时候,会将共享池中的字符串与外部的字符串(s)进行比较,如果共享池中有与之相等的字符串,则不会将外部的字符串放到共享池中的,返回的只是共享池中的字符串,如果不同则将外部字符串放入共享池中,并返回其字符串的句柄(引用)– 这样做的好处就是能够节约空间。
3. 用哪个呢?
如无特别原因,尽量使用双引号“”来创建字符串,当必须创建一个新的字符串或需要在堆内存中创建字符串的时候,才需要使用到构造方法。
0 0
- Java创建字符串是用“”还是用构造器?
- 创建字符串是直接用双引号还是 String 构造函数?
- [细说Java](3)创建字符串是使用" "还是构造函数?
- 使用""还是构造器来创建字符串
- 使用双引号""创建Java字符串还是使用String构造函数?
- java 的构造器是干什么用的,初始化对象,还是初始化数据,默认的无参构造器,和有参构造器的区别,找高手解答
- 该如何创建字符串,使用” “还是构造函数?
- java输入两个字符串,判断是浮点数还是字符
- 如何判断一个字符串是java代码还是英文单词?
- append进StringBuilder里的字符串是""还是"null"? Java
- java 判断字符串输入是中文还是英文
- java判断字符串是公司还是人名的工具类
- 《Thinking in Java》——构造器是private时如何创建对象?
- 创建和销毁对象(2)——遇到多个构造器参数是要考虑用构建器
- 用string类构造器创建对象
- 创建Fragment使用 构造函数 还是 newInstance()
- 【Effective Java学习】创建和销毁对象--考虑用静态方法代替构造器
- Effective Java 创建和销毁对象 1.考虑用静态工厂方法代替构造器
- HCI二轮面试任务
- python进程池与元组
- NDK开发环境搭建
- TimesTen_验证新增列后表大小变化
- Ethernet IP Core介绍
- Java创建字符串是用“”还是用构造器?
- cocos2d js 编译jsc 报错this._super is not a function
- java编程之旅第三章——变量上(变量概述和数据类型概述)
- Linux spi驱动分析(三)----spiddev分析
- poj2528Mayor's posters【线段树+离散化】
- LoadRunner主要功能
- 嵌入式底层软件开发学习系列之五调试方法
- ubuntu官方简体中文wiki,有你想要的ubuntu的一切
- <蓝牙BLE>cc2540主机读RSSI值