- 浏览: 57438 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
baifalove:
可以和我讲一下为什么 s标签写成 @s. 吗 是因为版本还是什 ...
struts2 遍历Map -
SEELEN:
很好!
servlet过滤器
java.lang.String的intern()方法
"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:
检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。
我们做个测试:
输出的结果将会是:
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";
----------------------
附加一个小实例:
结果为:12t<t>t
"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方法没什么用处。但实际上,它做了个小动作:
检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会把"abc"添加到字符串池中,然后再返回它的引用。
我们做个测试:
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";
----------------------
附加一个小实例:
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
发表评论
-
Apache配置详解
2014-08-28 09:38 637Apache的配置 Apache的配 ... -
Eclipse下Java compiler level does not match the version of the installed Java pro
2014-03-19 18:18 828问题现象:项目图标报错“Java compiler level ... -
截取过长的文字部分,用省略号代替
2013-10-09 14:37 727截取过长的文字部分,用省略号代替: <DIV ST ... -
webservice学习
2013-05-09 16:17 830一、从http://ws.Apache.org/axis/网站 ... -
jsp处理表单及JS和JAVA变量互传
2012-07-17 16:16 1012原文:http://hi.baidu.com/ca ... -
java url重写
2010-12-16 09:42 1605这几天蛋疼.看看别人url重写是怎么搞的.. 1.解释下什么 ... -
用PreparedStatement在Oracle中插入日期
2010-11-11 15:02 16261、 如果要插入的日期是当前时间,最简单的办法就是利用orac ... -
String和StringBuffer
2010-10-12 14:48 644public class Test { publi ... -
java细节
2010-08-16 10:20 758关键字: java 基础 [转 ... -
Quartz CronTrigger最完整配置说明
2010-08-16 10:01 817原文链接http://bocolijun.it ... -
Oracle to_date方法
2010-08-16 09:55 1429关键字: oracle to_date 日期格式参数 含义 ... -
tomcat部署的三种方式
2010-08-14 16:59 7391、直接把项目web文件夹放在webapps里 2、修改co ... -
Quartz的cron表达式
2010-08-03 14:17 774网上的类似的例子较多 ... -
JSTL对Map集合的操作
2010-04-20 21:25 7531、迭代 当forEach 的items属性中的表 ... -
Java定时器
2010-03-26 16:42 760Java定时器 在应用开发中,经常需要一些周期性的操作,比如 ... -
jstl的fmt标签
2010-03-26 10:56 2497国际化格式标签库包括国际化,消息和数字日期格式化 : (1 ... -
servlet过滤器
2010-03-24 10:38 1715原文摘自http://gkuiyj.iteye.com/blo ... -
过滤器和拦截器的区别
2010-03-24 10:30 1312原文出自http://gkuiyj.iteye.com/blo ... -
struts2中List嵌套List迭代
2010-03-19 11:03 2584看到有人这样封装数据 for( ){ lists ... -
事务那点事
2010-03-12 14:59 870今天看到别人谈论有关事务的话题,我也简单说两句自己对事务的理解 ...
相关推荐
这篇文章将要讨论 Java 6 中是如何实现 String.intern 方法的,以及这个方法在 Java 7 以及 Java 8 中做了哪些调整。
java中String类的intern、split方法的详细讲解。
关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...
本文将给大家详细介绍关于C#字符串优化String.Intern、IsInterned的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 首先看一段程序: using System; class Program { static void ...
深入理解 Java String#intern() 内存模型.docx
深入理解JavaString#intern()内存模型Java开发Java经验技巧共4页.pdf.zip
string常量池和intern_韩雅茹Java系列2021.pdf
之前我们提到了,String.intern方法会返回字符串常量池中的字符串对象的引用。 而G1垃圾回收器的字符串去重的功能其实和String.intern有点不一样,G1是让两个字符串的底层指向同一个byte[]数组。 有图为证: 上图中...
主要给大家介绍了关于java String中intern的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
String.intern 同一个字符串返回不同的引用 里面提及的 2021.11.21 部分内容修正 的测试用例
本文主要介绍java 中String 的intern方法,这里主要通过实例来说明不同版本的JDK,intern方法的对比,有需要的小伙伴可以参考下
欢迎大家下载java面试题,收集的一些面试方面的题 public static void main(String[] args) { String s=new String("abc"); System.out.println(s); String s1="abc"; String s2=new String("abc"); System....
String.intern()是一个Native方法,底层调用C++的 StringTable::intern 方法,源码注释:当调用 intern 方法时,如果常量池中已经该字符串,则返回池中的字符串;否则将此字符串添加到常量池中,并返回字符串的...
pos文件是ProcessOn的源文件,可以导入后直接打开编辑。 内容是:不同jdk版本下对String的intern()的分析
主要介绍了Java String的intern用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,会在字符串常量池中创建该字符串然后再返回。 字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, ...
受此问题的启发而被关闭:“ API请求:string.Intern(ReadOnlySpan ...)” 共享池已设置上限; 具有第二代LRU驱逐,以及第二代GC集合的进一步驱逐。 使用示例 馆藏 using Ben . Collections ; array = array . ...
这篇文章将要讨论Java 6中是如何实现String.intern方法的,以及这个方法在Java 7以及Java 8中做了哪些调整。 字符串池 字符串池(有名字符串标准化)是通过使用的共享String对象来使用相同的值不同的地址...