JVM_字符串常量池地址问题

先看下代码
public class JVMDemo {
    public static void main(String[] args) {
        String s1 = "ab";
        //new String() -> jdk1.8后永远指向常量池中的引用(没有就在常量池中创建,不会把s2复制到常量池(区别jdk1.6))
        String s2 = new String("ab");
        String s3 = new String("a") + new String("b");
        String s4 = "a";
        String s5 = "b";
        String s6 = s4 + s5;
        String s7 = "a" + "b";
        String s8 =  s4 + "b";

        System.out.println(s1 == s2);//false
        System.out.println(s1 == s3);//false
        System.out.println(s1 == s6);//false
        System.out.println(s1 == s7);//true
        System.out.println(s1 == s8);//false
        System.out.println(s2 == s6);//false
        System.out.println(s2 == s7);//false
        System.out.println(s2 == s8);//false
        System.out.println(s2.intern() == s3.intern());//true
        System.out.println(s2.intern() == s6.intern());//true
        System.out.println(s2.intern() == s8.intern());//true
        System.out.println(s2.intern() == s1);//true
        System.out.println(s2.intern() == s7);//true
    }

}

1、s1为字符串常量,取自常量池中,所有取自常量池中相等的值最终地址都相等。(在jdk1.7之后常量池放在了堆中)

所有字面量字符串均存放在常量池中,一旦有变量的加入,则会在堆中创建对象。

2、 String s8 = s4 + "b" 中的 + 到底做了什么

new StringBuilder(s4).append("b").toString()

3、String.intern()的作用是什么

String.intern() --> 返回一个字符串,内容与此字符串相同,若常量池里有相同字符串则返回池中字符串的引用,若没有则将其复制一份添加进池中再返回池中字符串的引用。
public class JVMDemo {
    public static void main(String[] args) {

        String s3 = new String("a") + new String("b");
        s3.intern();
        String s1 = "ab";

        String s2 = new String("cd");
        s2.intern();
        String s4 = "cd";

        System.out.println(s1 == s3);//true
        System.out.println(s2 == s4);//false

    }

}
jdk1.6中:字符串常量池是在方法区中,方法区的实现方式是和堆一样的(方便垃圾回收),存放的位置在堆空间的永久代中
永久代中的对象和堆中其他空间的对象肯定是不等的。
jdk1.8中:字符串常量池移到了堆中,方法区中其他内容,比如class信息、运行时常量池还是在方法区中,方法区的存放位置还是在堆空间的永久代中.字符串常量池已经移到了堆中,那么使用intern()方法时,如果常量池没有,就会直接返回堆中对象,因为都在一个地方嘛,所以不需要再重新创建,这和jdk1.8是不一样的,要特别注意!

4、 String s2 = new String("ab"); 做了什么

常量池中无”ab” : new String(“ab”) 会在堆和常量池中都创建对象,因此创建了两个对象。两个对象地址不同。
常量池中有”ab” : new String(“ab”) 会在堆中都创建对象,因此创建了一个对象。该对象与常量池中对象地址不同。

Original: https://www.cnblogs.com/yisk/p/16281840.html
Author: yisk
Title: JVM_字符串常量池地址问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/569255/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringCloudAlibaba项目之Seata分布式事务

    SpringCloudAlibaba随笔目录 一、SpringCloudAlibaba项目之父工程搭建 二、 SpringCloudAlibaba项目之Nacos搭建及服务注册 三…

    Java 2023年6月5日
    096
  • SpringBoot基础注解

    @SpringBootApplication:核心启动类,开启自动配置,相当于@SpringBootConfiguration+@EnableAutoConfiguration+@…

    Java 2023年6月8日
    067
  • BLOG-3_JavaHomework_Summary

    PTA大作业_阶段性总结 前言 小总结 第六次PTA作业开始了新的篇章—-电信计费系列,由于吸取了之前的教训,所以每次的作业都要考虑可拓展性,虽然这个系列也用到了正则表…

    Java 2023年6月5日
    087
  • Android studio打开项目一直卡住

    修改/gradle/wrapper/gradle-wrapper.properties文件中的最后一行distributionUrl=;(可找一个可用项目的复制过来) Origin…

    Java 2023年6月9日
    054
  • 多线程(多线程实现方式一【继承类Thread类】)

    多线程方式实现(1) 方式1:继承Thread类。* 步骤* A:自定义类MyThread继承Thread类。* B:MyThread类里面重写run()? 为什么是run()方法…

    Java 2023年6月5日
    071
  • 多线程 — H2O 生成、交替打印字符串

    现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子。存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。…

    Java 2023年5月30日
    071
  • SpringCloud与SpringBoot的版本问题

    大版本对应 在实际开发过程中,我们需要更详细的版本对应: 时刻与技术进步,每天一点滴,日久一大步!!! 本博客只为记录,用于学习,如有冒犯,请私信于我。 Original: htt…

    Java 2023年5月30日
    063
  • Java开发学习(六)—-DI依赖注入之setter及构造器注入解析

    一、DI依赖注入 首先来介绍下Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法) 构造方法 依赖注入描述了在容器中建立bean与…

    Java 2023年5月29日
    092
  • xmind指定32位jdk解决在64位系统上不能启动的问题

    在xmind.ini文件的第一行添加下面的内容: -vmF:\kfgj\Java32.1.6\jdk1.6.0_16\bin\javaw.exe (根据实际情况指定32位jdk的j…

    Java 2023年5月30日
    058
  • springboot竟然有5种默认的加载路径,你未必都知道

    上次分享了如何一步一步搭建一个springboot的项目,详细参见《5分钟快速搭建一个springboot的项目》,最终的结果是在”8080″端口搭建起了服…

    Java 2023年6月9日
    082
  • 【持久层框架】- SpringData-JPA

    SpringData – JPA 😄生命不息,写作不止🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 一个有梦有戏的人 @怒放吧德德🌝分享学习心得…

    Java 2023年6月16日
    092
  • 常用开发工具的安装和使用

    常用开发工具的安装和使用 IntelliJ IDEA的安装和使用 安装教程 1.教育优惠 JetBrains开发的众多开发工具提供教育优惠,可以方便在校学生使用。通过学校提供的教育…

    Java 2023年6月8日
    073
  • Java基础—双层for循环之小星星实操

    在Java基础中,我们会学到循环结构,其中for的双层循环更为常见。比如熟知的9*9乘法表就是用 双层for循环。 双层for循环的特点:1、内层循环一遍,相当于外层循环只执行一次…

    Java 2023年6月7日
    082
  • SpringBoot异步使用@Async原理及线程池配置

    前言 在实际项目开发中很多业务场景需要使用异步去完成,比如消息通知,日志记录,等非常常用的都可以通过异步去执行,提高效率,那么在 Spring框架中应该如何去使用异步呢 使用步骤 …

    Java 2023年6月13日
    076
  • 了解磁盘IO的那些事

    了解磁盘IO的那些事 我们作为一名开发,经常耳熟能详的一句话,就是提高程序的性能。对于一个应用程序存在问题的直观体现:页面打开很慢,需要等待。造成这样的问题的主要原因有以下几种:1…

    Java 2023年6月13日
    064
  • webkitdirectory实现文件夹上传

    webkitdirectory HTMLInputElement.webkitdirectory是属于 <input>元素的一个HTML属性webkitdirector…

    Java 2023年6月16日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球