字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗

我们先来看个例子:

public class StringTest {    public static void main(String[] args) {        String a = "A";        String b = new String("A");        System.out.println(a == b); // false        String c = b.intern();        System.out.println(a == c); // true        String d = new String("A");        System.out.println(b == d); // false        System.out.println(b.intern() == d.intern()); // true    }}

出现上述的结果,我们需要了解下,intern的作用:

(1)  当常量池中不存在"A"这个字符串的引用,将这个对象的引用加入常量池,返回这个对象的引用。
(2)  当常量池中存在"A"这个字符串的引用,返回这个对象的引用。如下图

e21adc92e587b8d479eca49c8fe3498d.png

字符串常量池

  • 字符串常量池的位置

字符串常量池大家可以认为独立在运行时常量池之外,不要和运行时常量池混淆。字符串常量池应该是在堆中。

  • 字符串常量池里放的是什么

字符串常量池里放的实际上是字符串对象的引用,而不是字符串对象,这个也是十分容易混淆的地方,字符串常量池里的引用指向堆中的字符串对象,但是堆中的字符串对象,只有一部分是被字符串常量池所引用的,还有一部分,我们称为不在常量池中,例如:

String b = new String("A");

因此,常见的一些面试题,我们就有了答案:

(1)现在当有人问 String str = new String(“abc”);创建了几个对象,常量池有abc字段是1个,常量池没有"abc"字段则是2个。
(2)String str=“abc”;创建了几个对象(如果常量池里面已经有对象了就是0个。如果没有就是1个);
(3)new String(“abc”).intern();创建了几个对象(如果常量池里面已经有该字符串对象了就是1个,如果没有就是两个)

了解了作用,那intern有什么用途呢?

1)使用==比较String对象

有人说,比较String用equals方法就行了,为什么使用intern后使用==来操作呢?

真的是这样吗,我们先看下equals方法:

public boolean equals(Object anObject) {        if (this == anObject) {            return true;        }        if (anObject instanceof String) {            String anotherString = (String)anObject;            int n = value.length;            if (n == anotherString.value.length) {                char v1[] = value;                char v2[] = anotherString.value;                int i = 0;                while (n-- != 0) {                    if (v1[i] != v2[i])                        return false;                    i++;                }                return true;            }        }        return false;    }

我们发现equals方法中对字符串比较真的是暴力,直接从头到尾挨个字符比较,如果字符串长度很大,前面字符相差不大,效率就会很低下,在性能要求很高的场景下,这种比较是不能容忍的。

那么我们在创建字符串的时候都是以intern()方法,那使用==比较就会效率高的多。

2)使用intern()方法,减少堆中创建过多的字符串对象,减少内存消耗

我们再来讨论下不同版本jdk中的intern()方法:

JDK1.6 和 JDK1.7及以上 在 intern() 方法的实现上,有相同,也有不同。

相同点:都先去查看字符串常量池是否有该字符串,如果有,则返回字符串常量池中的引用。不同点:JDK1.7+,当字符串常量池中找不到对应的字符串时,不会将字符串拷贝到字符串常量池,而只是生成一个对该字符串的引用在字符串常量池。而 JDK1.6 会拷贝字符串至字符串常量池

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

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

相关文章

http协议下需要服务器推送吗,HTTP/2.0 服务器推送实现

前言HTTP/2.0发布于2015年,作为新一代HTTP协议,其由于推进互联网加密技术的使用,所以只能作用于https连接当中。HTTP/2.0提供HTTP语义的有效序列化,是一个二进制协议,所有的框架开始一个8字节的头,紧跟着的…

C语言最常用的编译器

点击上方蓝字关注我,了解更多咨询对于大部分工科类专业的学生来说,如果说是需要学习c语言的话,那选择编译器就是我们第一个遇到的问题了,这一类软件有很多,每一个软件都有他各自的优点,当然了也有他各自的缺…

word一键生成ppt 分页_如何一键把Word转换为PPT?

看到评论区有人问可以一键转换吗?当然可以,比如简单好用的【迅捷PDF转换器】迅捷PDF转换器 - 多功能的PDF转换成Word|JPG|PPT转换器安装打开软件之后,在PDF转换栏目下,点击PDF转换其它,就可以看到文件格式转PPT&#x…

jboss4 迁移_JBoss BPM Travel Agency的微服务迁移故事

jboss4 迁移不久前,我们启动了一个规模较大的JBoss Travel Agency演示项目,以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 ,不仅向您展示了如何安装它,项目中各种规则和流程工件的含义,还向您介绍…

windows系统c 实现ftp服务器,windows系统c 实现ftp服务器

windows系统c 实现ftp服务器 内容精选换一换弹性云服务器卸载磁盘。弹性云服务器状态为stopped时支持系统盘(也就是/dev/sda挂载点)和用户盘的卸载,没有操作系统限制,也不需要在弹性云服务器内部安装vmtools。弹性云服务器状态为active态时有如下约束限制…

怎么学好C语言数据结构?

点击上方蓝字关注我,了解更多咨询C语言的数据结构与算法,难就难在链表,学会了链表,可能后面就一点都不难了。书籍推荐《数据结构与算法分析—C语言描述版》,要深入学习的话可以选择这本书,因为针对链表的讲…

c# 去除转义符号_c#语法

一、.net面向对象什么是面向对象?1、面向对象编程英文 Object-Oriented Programming 简称 OOP2、面向过程——是指把问题分解成步骤,一步一步实现。面向对象——是把构成问题的事务分成各个对象,利用对象之间的关系来解决问题,面向…

win7系统如何访问xp系统的服务器,WIN7系统怎么让XP系统访问呢

WIN7系统怎么让XP系统访问呢如果你发现某些程序出现兼容性问题,你有以下4种选择:1) XP兼容模式。右击程序文件或开始菜单中的快捷方式,选择属性,点击兼容性选项,在下拉菜单中选择在XP环境下运行。2) 升级到最新版本&am…

C语言基础知识储备,给你送干货啦!

点击上方蓝字关注我,了解更多咨询C 语言的特点C 语言程序设计就是结构化程序设计,它的主要观点是采用自顶向下、逐步细分和模块化的程序设计方法,使用顺序、选择、循环三种基本控制结构来构造程序。世间万物都有两面性,C 语言既有…

dalsa工业相机8k参数_工业传感器再掀巨浪 | Teledyne 以80亿美元收购FLIR,互补性产品组合又增体量...

收购 / Acquisitions2021年1月4日,Teledyne和FLIR联合宣布,双方已经达成了一项最终协议,Teledyne将以价值约80亿美元的现金和股票交易收购FLIR。根据协议条款,FLIR股东将以每股FLIR股份的价格获得每股28美元的现金和0.0718股Tele…

配置多个git账号_docker随手笔记第七节 jenkins通过git部署java微服务插件安装

docker随手笔记第一节 docker概念及安装docker随手笔记第二节 docker常用命令解析docker随手笔记第三节 docker构建java镜像docker随手笔记第四节 docker安装mysql5.7docker随手笔记第五节 docker安装redis4.0jenkins部署git的java微服务需要如下插件SSH plugin (远程登陆到服务…

适合新手入门—嵌入式C语言

点击上方蓝字关注我,了解更多咨询你现在被数百种电子设备包围着,虽然这些设备表面看起来很简单,但它们的体内都运行着复杂的微处理器(或微控制器)。微处理器的功能由嵌入式系统软件控制、引导和监督。嵌入式软件和嵌入式硬件构成了一个嵌入式…

如何学习C语言数据结构?

点击上方蓝字关注我,了解更多咨询C语言的数据结构与算法,难就难在链表,学会了链表,可能后面就一点都不难了。书籍推荐《数据结构与算法分析—C语言描述版》,要深入学习的话可以选择这本书,因为针对链表的讲…

数组做参数_C语言进阶之路:函数—数组参数!

数组参数属于指针参数.指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径.如果把数组当作参数, 不管你愿意与否, 它就是指针, 指向第一个值的指针.1. 数组参数就是指向第一个元素的指针:2. 干脆直接声明为指针:3. 即使你在形参中指定维数也不起…

wso2 esb_使用WSO2 ESB进行邮件内容过滤

wso2 esb每个集成设计师或开发人员都应该熟悉Gregor Hohpe和Bobby Woolf所描述的企业集成模式(EIP) 。 模式之一是“内容消息过滤器” (不要与消息过滤器模式混淆)。 使用不同的Mediator在WSO2中有多种方法可以实现此目的。 一种…

c语言中的/和%表示什么意思

点击上方蓝字关注我,了解更多咨询%代表求余运算符号;/代表除法运算符号。1、求余是一种数学计算方法,指一个数除以另一个数,不够除的部分就是余数,就是求余的结果。一个数除以另一个数,要是比另一个数小的话…

vue 脚手架测试环境_关于单元测试脚手架的几点思考

vue 脚手架测试环境莱昂:Luc Besson的专业人士 当我开始通过创建相同的对象并准备用于运行测试的数据来重复进行单元测试方法时,我对设计感到失望。 带有大量代码重复的长测试方法看起来并不正确。 为了简化和缩短它们,基本上有两个选择&…

Lightly:新一代的C语言IDE

点击上方蓝字关注我,了解更多咨询C语言最初是作为Unix系统的开发工具而发明,现如今已成为最广泛使用、最流行的编程语言之一。它具有如下几个特点:(1)低级语言它是一种建立在底层构建逻辑的机器语言,可以直…

c语言程序的基本单位是什么呢?

点击上方蓝字关注我,了解更多咨询随着科技的不断发展,电脑等终端设备已经成为我们生活中不可或缺的工具,而希望学习程序设计语言的朋友也越来越多,那么c语言的基本单位是什么呢?其实,c语言的基本单位是函数…

关于C语言中的memset()函数你了解多少

点击上方蓝字关注我,了解更多咨询1.函数原型及功能memset()函数原型为:函数功能:将_Dst所指区域的前size_t个字节均初始化为_val,调用时需要引用string.h头文件memset()函数多用于数组和结构体这种占用内存比较大的数据结构的初始…