关于Java字符串String在运算中的拼接
来源:互联网 发布:php postgresql 编辑:程序博客网 时间:2024/04/25 00:23
看代码不解释。
String s1 = "a"; String s2 = "b"; String s3 = s1 + s2; String s4 = s1 + s2; System.out.println(s3 == s4); System.out.println(s3.equals(s4)); String s5 = "a"; System.out.println(s1 == s5);
看结果:
falsetruetrue
关于Java实现的步骤如下:
查看字符串常量池中是否存在相同的字符串对象。
若没有,则新创建一个包含该内容的字符串对象,并让引用变量指向该对象。例如,创建字符串s1的时候,字符串常量池中没有,则创建一个新对象,并让引用s1指向该对象。
若已经存在包含该内容的字符串对象,则让字符串引用直接指向该对象。例如,在创建字符串s5的时候,字符串常量池中已经有包含该内容的对象了,所以引用s2直接指向已有的对象。
如果是运算中拼接的,在常量池中是不存在的。如上结果可知。
增加代码:
System.out.println("--------------------------------"); String s6 = new String("a"); System.out.println(s1 == s6); System.out.println(s1.equals(s2));
看结果:
--------------------------------falsetrue
自然new出来的,在堆中新开辟了一个地址,栈中的对象指向它
继续修改代码:
System.out.println("*********************************"); String s6 = new String("a"); System.out.println(s1 == s6); System.out.println(s1.equals(s6)); System.out.println(s1.intern()); System.out.println(s1.intern()==s6.intern()); System.out.println(s1.intern()==s5.intern());
看结果
*********************************falsetrueatruetrue
关于Intern方法
查看jdk源码
Returns a canonical representation for the string object.
A pool of strings, initially empty, is maintained privately by the class String.
When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.
It follows that for any two strings s and t, s.intern() == t.intern() is true if and only if s.equals(t) is true.
这里强调了只要s.equals(t) is true ,所有上面的代码的结果自然就清楚了。
All literal strings and string-valued constant expressions are interned. String literals are defined in section 3.10.5 of the The Java™ Language Specification.
Returns:
a string that has the same contents as this string, but is guaranteed to be from a pool of unique strings.
附:jdk中文翻译:
intern
public String intern()返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。
返回:
一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
- 关于Java字符串String在运算中的拼接
- String中的字符串拼接问题
- Java中的字符串拼接
- java的string字符串拼接
- 关于String 拼接字符串的性能问题
- (5)java 字符串 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- [JAVA]浅谈String, StringBuilder字符串拼接速度
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- 剖析java中的String之__拼接
- Java中关于字符串拼接的问题
- 基本标签(一)
- Java笔记2:使用命令行编译运行“Helloworld”
- 工厂方法模式(Factory Method)
- getloadavg()函数
- RedHat 6 系统 使用网易源
- 关于Java字符串String在运算中的拼接
- acm1016
- UVA 10891【区间dp】
- list动画
- 提取应用的签名和包名
- 请用Java设计一个Least Recently Used (LRU) 缓存
- 一个问题
- AC自动机复习总结
- javascript注入