这里首先介绍字符串池。类java.lang.String负责维护一个字符串池。可以将字符串池看作一个字符串的集合。在该字符串池中,具有相同字符序列的字符串只对应一个字符串实例对象。该字符串存放3类元素:

存放字符串常量

存放有限个字符串直接量进行“+”运算的结果

由类java.lang.String的成员方法intern创建的字符串实例对象

类java.lang.String的成员方法 public String intern() 首先判断当前字符串是否已经在字符串池中。

如果当前字符串已经在字符串池中,则返回当前字符串的引用。

如果当前字符串不再字符串池中而且字符串池已经含有与当前字符串相同字符次序列的字符串实例对象,则返回在字符串池中这个字符串的引用。

如果字符串池中不存在与当前字符串相同字符序列的字符串实例对象,则在字符串池中创建一个相同的字符串实例

用一句话归纳:对String用intern()后,在字符串池中返回一个相同值的字符串引用(在字符串池中有相同的字符串则直接返回引用,没有则创建一个再返回它的引用)

再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个 方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用, 如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用,看例1就清楚了

String s0= “kvill”;

String s1=new String(”kvill”);

String s2=new String(“kvill”);

System.out.println( s0==s1);

System.out.println( “**********” );

s1.intern();

s2=s2.intern(); //把常量池中“kvill”的引用赋给s2

System.out.println( s0==s1);

System.out.println( s0==s1.intern() );

System.out.println( s0==s2 );

结果为:

false

**********

false //虽然执行了s1.intern(),但它的返回值没有赋给s1

true //说明s1.intern()返回的是常量池中”kvill”的引用

true

最后我再破除一个错误的理解:

有人说,“使用String.intern()方法则可以将一个String类的保存到一个全局String表中,如果具有相同值的Unicode字 符串已经在这个表中,那么该方法返回表中已有字符串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中“如果我把他说的这个全局的 String表理解为常量池的话,他的最后一句话,“如果在表中没有相同值的字符串,则将自己的地址注册到表中”是错的:

看例2:

String s1=new String("kvill");

String s2=s1.intern();

System.out.println( s1==s1.intern() );

System.out.println( s1+" "+s2 );

System.out.println( s2==s1.intern() );

结果:

false

kvill kvill

true

在这个类中我们没有声名一个”kvill”常量,所以常量池中一开始是没有”kvill”的,当我们调用s1.intern()后就在常量池中新添加 了一个”kvill”常量,原来的不在常量池中的”kvill”仍然存在,也就不是“将自己的地址注册到常量池中”了。

最后用一个例子概括:

public static void main(String args[])

{

String s1 = "123456";  //字符串直接量

String s2 = "123456";  //字符串直接量

String s3 = "123"+"456";  //不是字符串直接量

String a0 = "123";

String s4 = a0 +"456";  //不是字符串直接量

String s5 = new String("123456");  //不是字符串直接量

String s6 = s5.intern();

System.out.println("s2"+((s2==s1) ? "==" : "!=")+"s1");

System.out.println("s3"+((s3==s1) ? "==" : "!=")+"s1");

System.out.println("s4"+((s4==s1) ? "==" : "!=")+"s1");

System.out.println("s5"+((s5==s1) ? "==" : "!=")+"s1");

System.out.println("s6"+((s6==s1) ? "==" : "!=")+"s1");

}

运行结果为:

s2 == s1;

s3 == s2;

s4!=s1;

s5!=s1;

s6==s1;

intern string java_java-String中intern()的详解相关推荐

  1. String 在Java中的用法详解

    认识String类 和 String的使用 1.创建字符串: (1)常见的构造String的方式: (2)String的基本概念: 2.字符串比较相等: 3.字符.字节.字符串的转换 (1)字符与字符 ...

  2. C语言 -- string.h中函数功能详解与手动实现 - 02(常用函数memcpy、memmove、strcpy、strdup、strcat、strtok...)

    内容预览 3.5.搬迁类型 --- 函数功能详细说明 :将内存空间中内容移动.复制到另一内存空间 3.6.搬迁类型 --- 函数功能测试与手动实现 3.6.1.memcpy.memccpy 3.6.2 ...

  3. c语言 append,对C++ string append方法的常用用法详解

    C++ string append()添加文本 使用append()添加文本常用方法: 直接添加另一个完整的字符串: 如str1.append(str2); 添加另一个字符串的某一段子串: 如str1 ...

  4. Asp.net中GridView使用详解(引)【转】

    Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...

  5. java 自定义正则表达式_java中正则表达式实例详解

    Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...

  6. Java中JDBC连接数据库详解

    今天动力节点java学院小编分享的是JDBC连接数据库的相关知识,希望通过看过此文,各位小伙伴对DBC连接数据库有所了解,下面就跟随小编一起来看看JDBC连接数据库的知识吧. 一.JDBC连接数据库概 ...

  7. Hadoop中RPC机制详解之Server端

    2019独角兽企业重金招聘Python工程师标准>>> Hadoop 中 RPC 机制详解之 Client 端 1. Server.Listener RPC Client 端的 RP ...

  8. DevExpress控件GridControl中的布局详解 【转】

    DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28|  分类: devexpress |  标签:devexpress  |举报|字号 订阅 h ...

  9. js 正则中冒号代表什么_javascript中正则表达式语法详解

    好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉.就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要 ...

  10. java的static类_java中staticclass静态类详解

    一般情况下是不可以用static修饰类的.如果一定要用static修饰类的话,通常static修饰的是匿名内部类. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的(利用static ...

最新文章

  1. 吴恩达深度学习一:神经网络
  2. 10.9 自动注册DSN和创建表
  3. 使用Java实现发送email邮件
  4. golang基础语法
  5. php gzip 关闭,php能否在当前脚本页关闭nginx的gzip输出
  6. TensorWatch 机器学习调试和可视化工具
  7. webRTC之gtest安装使用(十五)
  8. VC++/MFC学习笔记(二)
  9. sklearn的系统学习——决策树分类器(含有python完整代码)
  10. 阳性水草与阴性水草的区分
  11. 别人笑我忒疯癫,我笑别人看不穿;
  12. OpenCV每日函数 图像处理模块 applyColorMap颜色映射函数
  13. 网页设计经典案例(Web)
  14. VS code 安装Source Code Pro字体
  15. svn服务器web项目,liunx 搭建svn服务器并实现钩子自动更新到web项目
  16. 魔趣刷机(macos)实操(mi6)
  17. [极客大挑战 2019]Knife
  18. Spark-SQL性能极致优化: Native Codegen Framework
  19. 中心差分法matlab实现,动力学系统时域响应计算的六种方法Matlab源程序(Newmark,Houbolt法,中心差分法)...
  20. 计算机专业可以技术移民吗,2020年澳洲计算机科学专业可以移民吗

热门文章

  1. 云课堂数据分析师项目实战(完整)
  2. 【Unity项目优化宝典】Unity3D手游开发客户端开发经验总结
  3. python中的加减乘除(运算符)
  4. TCP/IP(三):ARP报文格式详解
  5. pycharm 2018永久破解激活补丁 附安装教程
  6. 基于docker的redis4.0单机集群搭建
  7. 【java毕业设计】基于java+SSH+jsp的网上体育商城设计与实现(毕业论文+程序源码)——网上体育商城
  8. 什么是端口映射?如何设置端口映射?
  9. 显示器色彩精度测试软件,色域和色彩精准度测试_液晶显示器_液晶显示器评测-中关村在线...
  10. 2022年草根互联网圈较流行的副业汇总