java.lang.String的intern()方法
2016-04-29 09:52
369 查看
java.lang.String的intern()方法
"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:
检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。
我们做个测试:
Java代码
输出的结果将会是:
false
true
JDK的api文档是这么解释的:
=======================================================================
返回字符串对象的规范化表示形式。
一个初始时为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都是内部的。字符串字面值在《Java Language Specification》的 §3.10.5 中已定义。
返回:
一个字符串,内容与此字符串相同,但它保证来自字符串池中。
=======================================================================
字符串字面池指的是常量池.
字符串对象的创建方式有两种
如下:
String s1 = new String(""); //第一种
String s2 = ""; //第二种
第一种始终不会入池的.
第二种要看情况而定(等号右边如果是常量则入池,非常量则不入池)
例:
String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,所以会入池.
String s4 = s1 + "b"; //s1是变量,"b"是常量,变量+常量!=常量,所以不会入池.
一旦入池的话,就会先查找池中有无此对象.如果有此对象,则让对象引用指向此对象;如果无此对象,则先创建此对象,再让对象引用指向此对象.
例:
String s5 = "abc"; //先在池中查找有无"abc"对象,如果有,则让s5指向此对象;如果池中无"abc"对象,则在池中创建一个"abc"对象,然后让s5指向该对象.
补充一下:
看了字节码后,发现
String str ="a"+"b";
完全等同于
String str="ab";
----------------------
附加一个小实例:
Java代码
结果为:12t<t>t
"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:
检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。
我们做个测试:
Java代码
String str1 = "a"; String str2 = "bc"; String str3 = "a"+"bc"; String str4 = str1+str2; System.out.println(str3==str4); str4 = (str1+str2).intern(); System.out.println(str3==str4);
输出的结果将会是:
false
true
JDK的api文档是这么解释的:
=======================================================================
返回字符串对象的规范化表示形式。
一个初始时为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
它遵循对于任何两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都是内部的。字符串字面值在《Java Language Specification》的 §3.10.5 中已定义。
返回:
一个字符串,内容与此字符串相同,但它保证来自字符串池中。
=======================================================================
字符串字面池指的是常量池.
字符串对象的创建方式有两种
如下:
String s1 = new String(""); //第一种
String s2 = ""; //第二种
第一种始终不会入池的.
第二种要看情况而定(等号右边如果是常量则入池,非常量则不入池)
例:
String s3 = "a" + "b"; //"a"是常量,"b"是常量,常量+常量=常量,所以会入池.
String s4 = s1 + "b"; //s1是变量,"b"是常量,变量+常量!=常量,所以不会入池.
一旦入池的话,就会先查找池中有无此对象.如果有此对象,则让对象引用指向此对象;如果无此对象,则先创建此对象,再让对象引用指向此对象.
例:
String s5 = "abc"; //先在池中查找有无"abc"对象,如果有,则让s5指向此对象;如果池中无"abc"对象,则在池中创建一个"abc"对象,然后让s5指向该对象.
补充一下:
看了字节码后,发现
String str ="a"+"b";
完全等同于
String str="ab";
----------------------
附加一个小实例:
Java代码
public class Mud { public static String hello(String[] strs, String s2) { strs[0] = "<" + strs[0] + ">"; s2.toUpperCase(); return s2; } /** * @param args */ public static void main(String... args) { String a = new String("t"); String[] b = new String[] { "t" }; String c = a.intern(); if (a.equals(b[0])) { System.out.print("1"); } if (b[0] == c) { System.out.print("2"); } if (a == c) { System.out.print("3"); } a = hello(b, c); System.out.print(a); System.out.print(b[0]); System.out.print(c); } }
结果为:12t<t>t
相关文章推荐
- java 代码
- 非常经典的JAVA编程题(水仙花数)
- 向Eclipse 中导入WorkSpace已有Android项目: Invalid project description->X overlaps the locaiton of another X
- Java泛型
- Java:String和Date、Timestamp之间的转换
- java实现单链表(增加节点,删除节点,根据下标获取节点,获取链表大小,链表逆序)
- 20145206《Java程序设计》第9周学习总结
- Json在java中的使用
- java排序之快排
- Java URL自定义私有网络协议
- struts2标签库详解
- spring对乱码的处理及其springmvc核心器注册
- 详解备忘录模式及其在Java设计模式编程中的实现
- Dubbo与Zookeeper SpringMVC整合和使用(负载均衡 容错)
- spring 解决多数据源问题,主要的继承类为AbstractRoutingDataSource
- 转:Eclipse常见问题,快捷键收集
- 在Java里处理文件的技巧
- [转]MyEclipse for Spring2014破解
- windows7环境下为eclipse安装CDT插件
- Eclipse安装Freemarker插件