java String的intern方法

作者:lqh 时间:2021-07-05 03:23:52 

首先我们应该清楚的是JDK1.6和JDK1.7中String类的intern方法还是有差别的: 

 JDK1.6中的intern:   

调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中这个String值的引用;如果不存在的话,则会将原先堆中的该字符串拷贝一份到常量池中。  

JDK1.7中的intern:   

调用intern方法的时候首先会去常量池中查看是否存在与当前String值相同的值,如果存在的话,则直接返回常量池中这个String值的引用;如果不存在的话,则只会将原先堆中该字符串的引用放置在常量池中,并不会将拷贝整个字符串到常量池中。   

这也就说明,JDK1.6和JDK1.7对于常量池中不存在此字符串的情况处理不同。    

下面通过实例来进行验证和解释:      

实例:


public static void main(String[] args) {
 String str = "str"+new String("01");①
 str.intern();②
 String str1 = "str01";③
 System.out.println(str == str1);

String str2 = new String("str01");④
 str2.intern();⑤
 String str3 = "str01";⑥
 System.out.println(str2 == str3);

String str4 = "str01";⑦
 String str5 = new String("str")+new String("01");⑧
 str5.intern();⑨
 System.out.println(str4 == str5);

在JDK1.6下输出结果是:

false
false
false

解释:

①执行时会在堆内存创建一个值为"str01"的字符串对象str,同时在常量池创建一个"str"以及"01"常量;

②执行时会首先去常量池中查看是否存在一个值为"str01"的常量,发现不存在,JDK1.6的做法就是将该字符串"str01"在常量池中也生成一份;

③执行时会在常量池中创建一个"str01"对象,发现已经存在,因而不会新建;
第一个输出false的原因是:str指向的是堆内存的"str01",而str1指向的是常量池中的"str01";

④执行时会在堆内存创建一个值为"str01"的字符串对象str2,同时在常量池中创建一个值为"str01"的常量;

⑤执行时会首先去常量池中查看是否存在值为"str01"的常量,发现存在,则直接返回这个常量引用;

⑥执行时会在常量池中创建一个值为"str01"的常量,如果发现已经存在,则不会创建;

第二个输出false的原因是:str2指向的是堆内存的"str01",而str3指向的是常量池中的"str01";

⑦执行时会在常量池创建一个值为"str01"的常量;

⑧执行时会在堆内存创建一个值为"str01"的字符串对象str5,同时在常量池创建一个"str"以及"01"常量;

⑨执行时会去常量池查看是否存在值为"str01"的常量,发现存在则直接返回这个常量引用;
第三个输出false的原因是:str5指向的是堆内存的"str01",而str4指向的是常量池中的"str01";

在JDK1.7下输出结果是:

true
false
false

解释:

发现只有第一个输出结果不一样,所以我们只解释第一个的原因:

①执行时会在堆内存创建一个值为"str01"的字符串对象str,同时在常量池创建一个"str"以及"01"常量;(这点和JDK1.6没什么区别)

②执行时会首先去常量池中查看是否存在一个值为"str01"的常量,发现不存在,JDK1.7的做法就是将堆内存中"str01"的引用复制到了常量池中;

③执行时会在常量池中创建一个"str01"对象,发现已经存在,因而不会新建;
那么此时的str和str1都将指向的是堆内存中的"str01"的值,所以两者相等;

标签:java,intern
0
投稿

猜你喜欢

  • SpringBoot之Helloword 快速搭建一个web项目(图文)

    2023-08-23 17:36:21
  • SpringMVC 向jsp页面传递数据库读取到的值方法

    2022-03-29 00:51:15
  • VSCode 搭建 Arm 远程调试环境的步骤详解

    2023-06-27 08:54:36
  • 为何Java8需要引入新的日期与时间库

    2023-12-16 06:02:23
  • Spring Security OAuth 自定义授权方式实现手机验证码

    2021-10-03 23:30:27
  • SpringCloud如何创建一个服务提供者provider

    2023-08-01 01:56:33
  • java emoji表情存储的解决方法

    2023-07-10 20:19:06
  • Java编程中随机数的生成方式总结

    2022-06-14 11:57:27
  • 解决@JsonInclude(JsonInclude.Include.NON_NULL)不起作用问题

    2023-05-26 08:57:45
  • SpringBoot快速配置数据源的方法

    2023-07-28 13:22:42
  • springboot异常处理的基本规范

    2023-11-23 15:48:19
  • 基于SpringBoot实现图片上传及图片回显

    2023-01-17 06:26:15
  • java身份证验证代码实现

    2023-12-09 16:10:50
  • 详解Java中字符流与字节流的区别

    2023-01-14 00:19:58
  • c#使用process.start启动程序报错解决方法

    2021-07-28 01:20:20
  • java 二叉查找树实例代码

    2022-07-23 22:54:28
  • 深入理解Java中的弱引用

    2023-07-19 20:14:53
  • IntelliJ IDEA中查看当前类的所有继承关系图

    2023-08-06 12:40:19
  • IntelliJ IDEA 下载安装超详细教程(推荐)

    2023-11-19 23:50:16
  • C# 创建EXCEL图表并保存为图片的实例

    2023-03-07 07:27:24
  • asp之家 软件编程 m.aspxhome.com