常量池/String常见面试题

news2024/12/23 2:25:37

目录

常量池与运行时常量池

字符串常量池String_Table

字符串变量拼接

字符串常量拼接

字符串延迟加载

字符串intern方法

总结StringTable的特点

常量池与运行时常量池

二进制字节码包括 类的基本信息,常量池,类方法定义(包含虚拟机指令)

class文件中除了有类的版本,字段,方法,接口等描述信息外,还有用于存放编译器生成的各种字面量和符号引用的 常量池表.

字面量是源代码中的固定值的表示法,即通过字面我们就能知道其值的含义。

字面量包括整数、浮点数和字符串字面量.

符号引用包括类符号引用、字段符号引用、方法符号引用和接口方法符号引用。

常量池就是一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息.

常量池表会在类加载后存放到方法区的运行时常量池中.

运行时常量池的功能类似于传统编程语言的符号表,尽管它包含了比典型符号表更广泛的数据。

既然运行时常量池是方法区的一部分自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError 错误。

运行时常量池 : 常量池 是*.class文件中的,当该类被加载(运行的时候,放到内存中),它的常量池信息就会放入方法区的运行时常量池,并把里面的符号地址变为真实的地址

字符串常量池String_Table

String s1 = "a";
String s2 = "b";
String s3 = "a" + "b";
String s4 = s1 + s2;
String s5 = "ab";
String s6 = s4.intern();
// 问
System.out.println(s3 == s4);
System.out.println(s3 == s5);
System.out.println(s3 == s6);
String x2 = new String("c") + new String("d");
String x1 = "cd";
x2.intern();
// 问,如果调换了【最后两行代码】的位置呢,如果是jdk1.6呢
System.out.println(x1 == x2);

常量池中的信息都会被加载到运行时常量池中,此时 这些常量都是常量池中的符号,还没有变为Java字符串对象. 当执行了ldc 会把符号变为Java对象(字符串对象),同时也会准备一个StringTable(串池HashTable),变为Java对象之后(字符串对象)把它作为key,就会看StringTable里面有没有这个字符串,如果没有就会把它放入到串池中--->懒加载(执行到某行代码才创建对象,如果池中没有该字符串对象就放到池子中,如果串池中有,就会用串池中的对象,每一个字符串对象在串池中都是唯一的.)

字符串变量拼接

将字节码进行反编译可以看出.

String s1 = "a";
String s2 = "b";
String s3 = s1 + s2; // new StringBuilder().append("a").append("b").toString()

字符串变量拼接,其实会转化为StringBuilder的拼接,然后在调用StringBuilder的toString方法.

StringBuilder的toString方法,又是将拼接好的值又创建了一个String对象.-->新的字符串对象

原因是s3创建的字符串对象会在StringTable(串池)里面,而s4是StringBuilder拼接好的值有创建了一个新的String对象.两者的位置不同. s3的字符串对象是存在串池中的,而s4的字符串对象是存在堆中的

字符串常量拼接

字符串常量拼接由于是常量拼接,常量不会被修改,所以在Javac在编译期间就会进行优化,在编译器就会拼接好,在编译器就已经确定;

字符串延迟加载

字符串对象不是一下子全放到串池的,而是执行到哪一行代码,再把它放入到串池,是懒加载的行为.

当再次执行代码发现这个字符串已经在串池中出现了,那么就不会再去创建,而是沿用串池(StringTable)中的字符串

字符串对象是延迟加载的-->懒惰行为.

字符串intern方法

String s = new String("a") + new String("b");

  • 对于这一行代码,首先有常量 "a",把它放入到串池中,有常量 "b"把它放入到串池中.
  • 然后又new String("a"),创建出一个新的对象,它是在堆中,只是与串池中的"a"值是相同的.
  • 然后又new String("b"),创建出一个新的对象,也是在堆中,只是与串池中的 "b"值是相同的
  • 然后又将new String("a")和new String("b")拼接起来,原理其实是StringBuilder的拼接然后重新创建出一个对象在堆中

String s = new String("a") + new String("b");
String s2 = s.intern();

调用intern方法,主动将串池中还没有的字符串对象放入串池, 如果字符串常量池中存在该字符串对象,那么不放入,如果常量池中不存在该字符串对象,则将这个字符串对象放入到串池中. 调用intern方法最终返回的是串池中的字符串对象(JDK1.8版本)

总结StringTable的特点

  • 常量池中的字符串仅仅是符号,第一次用到的时候才会转变为对象
  • 利用串池机制,来避免重复创建字符串的对象
  • 字符串变量的拼接是StringBuilder(Java 1.8)
  • 字符串常量拼接的原理是编译器优化
  • 可以使用intern方法,主动将串池中还没有的字符串对象放入串池
    • JDK1.8调用intern方法,会尝试将字符串对象尝试放入到串池,如果有则不会放入到串池,如果没有放入到串池中。 调用intern方法最终返回的是串池中的对象。(调用intern方法的字符串对象和真正放入到串池中的对象都是串池中的对象是相同的对象)
    • JDK1.6调用intern方法,会尝试将字符串对象尝试放入到串池,如果有,则不会放入到串池,如果没有,会把对象复制一份,放入到串池。调用intern方法最终返回的是串池中的对象。(调用intern方法的字符串对象和真正放入到串池中的对象是两个不同的对象)
    • 总结一点就是JDK1.8调用intern如果串池中没有会直接放入到串池中,而对于JDK1.6来说它是复制一份放到串池中(所以调用intern方法的字符串对象和返回的对象不是同一个对象)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新突破:科学家发现全新的量子纠缠效应

布鲁克海文国家实验室(图片来源:网络)布鲁克海文国家实验室的科学家发现了一种全新的量子纠缠效应,即使宇宙距离相隔广阔,量子纠缠也会使粒子奇迹般地联系在一起。这一发现使他们能够捕捉到原子内部的奇特世界。这项研…

【算法自由之路】二叉树的递归套路

【算法自由之路】二叉树的递归套路 预热,二叉树的后继节点 话不多说,首先是一道练手题,寻找二叉树任意给定节点的后继节点,此二叉树具备一个指向父节点的指针。 后继节点:在中序遍历中于给定节点后一个打印的节点 p…

SpringBoot实现配置文件的加密和解密

一、项目搭建 1.新建一个springBoot项目 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

DAMO-YOLO : A Report on Real-Time Object Detection Design

DAMO-YOLO:实时目标检测设计报告在本报告中&#xff0c;我们提出了一种被称为DAMO-YOLO的快速准确的物体检测方法&#xff0c;该方法比最先进的YOLO系列具有更高的性能。DAMO-YOLO是由YOLO扩展而来的&#xff0c;它采用了一些新技术&#xff0c;包括神经结构搜索(NAS)、高效的重…

LeetCode——1669. 合并两个链表

一、题目 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0c;并将list2 接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果&#xff1a; 请你返回结果链表的头指针。 来…

【Qt】3.菜单栏、工具栏、状态栏、铆接部件、核心部件、资源文件

目录 菜单栏 工具栏 代码 mainwindow.cpp 结果 状态栏 铆接部件 核心部件 代码 mainwindow.cpp 结果 资源文件 代码 mainwindow.cpp 结果 菜单栏 只能有一个 menuBar()返回一个QMenuBar *bar 将bar放入到窗口中setMenuBar(bar) 添加菜单addMenu("文件&…

三年了,回村了

今年回老家了&#xff0c;因为工作和疫情等原因已经三年多没回了&#xff0c;思乡之情已经压不住了。 老家是一个五线小城市&#xff0c;属于南方典型的鱼米之乡&#xff1a;依山傍水、山清水秀。同时还有一个知名白酒厂&#xff1a;白云边&#xff0c;经济发展还不错。 老家…

从“语义网”到“去中心化”,Web3.0到底是个啥?

什么是Web3.0&#xff0c;为什么近两年这个概念又再一次火出了圈&#xff0c;但凡A股上市公司正在做或者准备做的业务与它沾上边&#xff0c;总会有那么几次异动。 这个概念到底是金融市场布下的骗局&#xff0c;还是未来互联网发展的趋势&#xff0c;在大家的眼里都是褒贬不一…

Redis 核心原理串讲(下),架构演进之高扩展

文章目录Redis 核心原理总览&#xff08;全局篇&#xff09;前言一、数据分片1、集群&#xff1f;2、分片&#xff1f;3、分片固定&#xff1f;4、元数据二、集群1、代理集群2、分片集群3、代理 分片集群三、生产实践总结Redis 核心原理总览&#xff08;全局篇&#xff09; 正…

新的一年,如何打开超级APP发展格局

本文开始我们先来明确一个概念&#xff1a;超级APP是什么&#xff1f;百度百科的定义是——那些拥有庞大的用户数&#xff0c;成为用户手机上的"装机必备”的基础应用。实际上各大互联网平台也给出了不同的解释&#xff0c;但相同点是他们都认为超级APP就应该超级个性化&a…

简单手写后门Safedog检测绕过

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是简单手写后门Safedog检测绕过。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁…

最长上升子序列、最长公共子序列、最长公共上升子序列(LIS、LCS、LCIS)

LIS、LCS、LCIS最长上升子序列LIS最长公共子序列LCS最长公共上升子序列LCIS最长上升子序列LIS 题目链接&#xff1a;AcWing895. 最长上升子序列 这里只说明O(n2)O(n^2)O(n2)的解法&#xff0c;O(nlogn)O(nlogn)O(nlogn)解法之前的博客有介绍 O(n2)O(n^2)O(n2)的解法较为容易理…

MMCV - browse_dataset.py 可视化config文件数据预处理部分

无论是mmdetection、mmtracking、mmdetection3D等框架&#xff0c;在\tools\analysis_tools中均有一个名为browse_dataset.py的文件。该文件能够帮助用户直接可视化 config 文件中的数据处理部分&#xff0c;查看标注文件是否正确&#xff0c;同时可以选择保存可视化图片到指定…

百度学习经验

如何应对干扰1.将吸引你注意力的东西放在一旁&#xff0c;离开你的视野范围2.告诉大家你有空的时间&#xff0c;和你要专注的时间范围3.跟别人咨询的时候也是一样&#xff0c;不要在他专注的时候大扰别人关于如何做事&#xff0c;控制精力就是按照重要程度排序&#xff0c;不重…

《最佳停止时间》:什么时候可以停止寻找?

分享一个有趣的数学编程知识 《最佳停止时间》&#xff1a;什么时候可以停止寻找&#xff1f; 日常生活有很多"寻找-决策过程"&#xff0c;如果考察所有选项&#xff0c;要花费很长时间&#xff0c;可能还会错失机会&#xff0c;后面遇到的未必有前面的好。能否确定一…

实力见证 | Authing 荣获 2022 中国数字化转型与创新评选之“年度安全创新产品”

近日&#xff0c;由数字产业创新研究中心、锦囊专家、首席数字官联合全国 20 多家 CIO 组织机构、行业协会共同发起的 《2022 中国数字化转型与创新评选》 获奖榜单新鲜出炉&#xff0c;Authing 成功入选该榜单&#xff0c;荣获“年度安全创新产品”。 该榜单自 2022 年 5 月启…

【设计模式】行为型模式·策略模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 一.概述 该模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。 策略模式属于对象行为模式&#xff0c;它通过对算法进行封…

英语学习 作文 1

1 议论文和应用文 1、议论文&#xff1a;essay 1 观点选择&#xff1a;option、choice 2 现象解释&#xff1a;why、what 3 问题解决&#xff1a;how to、solution、measure **4 图片图表&#xff1a;image、cartoon、diagram、chart**2、应用文&#xff1a;信件、通知、报道…

设计模式——创建型模式

目录 4.创建型模式 4.1 单例设计模式 4.1.1 单例模式的结构 4.1.2 单例模式的实现 4.1.3 存在的问题 4.1.4 JDK源码解析-Runtime类 4.2 工厂模式 4.2.1 概述 4.2.2 简单工厂模式 4.2.3 工厂方法模式 4.2.4 抽象工厂模式 4.2.5 模式扩展 4.2.6 JDK源码解析-Collecti…

2023年山东最新建筑施工信号工(建筑特种作业)考试真题题库及答案

百分百题库提供特种工&#xff08;信号工&#xff09;考试试题、特种工&#xff08;信号工&#xff09;考试预测题、特种工&#xff08;信号工&#xff09;考试真题、特种工&#xff08;信号工&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助…