面试字节我被String类的问题给问死了!

在这里插入图片描述
“+” 是怎么连接字符串的?(JDK1.7及以上)

总结:

使用 “+” 连接字符串时,实际上是使用临时创建的StringBuilder对象来辅助完成的。
对于编译时常量,在编译后直接计算出字符串的值,而不会在运行时创建临时的StringBuilder对象来完成字符串连接。
在循环中对String对象进行连接,应该直接使用StringBuilder代替 “+”,这样可以提高性能。
注意: 当使用运算符 “+” 连接字符串时,如果两个操作数都是编译时常量,则在编译时期就会计算该字符串的值,而不会在运行时创建StringBuilder对象。


final String s = "abc";
String x = "abc" + "def"; // 两个操作数都是常量,运行时不会创建StringBuilder对象
String y = s + "def"; // s和"def"都是编译时常量,不会创建StringBuilder对象,实际上x和y指向同一个对象,即"abcdef"
String z = y + "abc"; // y是变量,则在运行时会创建StringBuilder对象

在这里插入图片描述

不可修改的String对象

<1> 问:String对象一经创建,不能修改,为什么?

因为String类是final类型的,无法继承该类。

其所有的成员变量都是private的,并且没有提供修改私有成员变量的公有(public)方法
对String对象的操作都没有修改当前对象,而是新创建一个对象

<2> 问:把String对象设计成不可修改有什么好处吗?

最大好处就是可以实现资源共享,多线程操作时,具有线程安全性。

总结三点:

  • String类是final类型的,其对象一旦创建,不可修改。
  • String类那些看似修改字符序列的方法实际上都是返回新创建的String对象,而不是修改自身对象。
  • String对象不可改变,因此具有线程安全性,可自由实现共享。

String类的内部实现
在String类内部,使用一个字符数组char[]来维护字符序列。

private final char value[];

问:String的最大长度是多少?

String的最大长度也就是字符数组char[]的最大长度,理论上为int类型的最大值,即2147483647,实际上,一般可获取的最大值小于理论最大值。

申请一个int最大值长度字符数组:

char c = new char[Integer.MAX_VALUE]; // 报错

报错:一个char类型占用2字节,Integer.MAX_VALUE个char类型接近于4GB大小,申请这么大一块连续内存空间,导致内存溢出。
//加入Java开发交流君样:756584822一起吹水聊天

分析:Java中的对象是分配在堆上的,默认的堆空间的最大值是256MB,在理想的情况下,只要我们将最大Java堆设置的足够大,就可以申请到最大的字符长度,即Integer.MAX_VALUE。

java -Xmx1G com.fan.fragmentlearning.str.StringDemoMain – 设置Main方法最大Java堆

String常量池

<1> 什么是String常量池?

String常量池是String类内部私有的,能够自动将String字面常量加入其中。
起初,常量池是空的,当程序中出现String字面常量时,会在常量池中搜索是否存在该String对象,即使用String类的equals方法来判断,如果不存在,就将这个字面常量加入常量池中,并返回该对象;否则直接返回常量池中的对象。

<2> String字面常量和String常量表达式都会加入常量池中。

<3> 满足什么条件才算是String常量表达式呢?

即就是在编译的时候就可以确定其值的String类型表达式。编译器的原则是:能在编译期间计算的,就不会留到运行时再去计算。

第一种: 表达式全部由String字面常量拼接

String s = "a" + "b" + "c";

第二种: 表达式由String字面常量,基本类型字面常量,final修饰的String引用,final修饰的基本数据类型任意组合组成。

String s = "a" + 5; // String常量表达式final String str = "a";
String s = "bc" + str; // String常量表达式final int num = 5;
String s = "a" + num; // String常量表达式String s = str + num; // String常量表达式

<4> intern方法 - 拘留字符串

如果需要将某个String对象加入常量池中,就可以调用intern方法来完成,这个操作也称作拘留字符串。
系统自动将String字面常量与String常量表达式的字符串值加入常量池中,也是通过调用intern方法来实现的。

要点总结:

String类维护一块特殊的区域,称为常量池。因为String对象是不可改变的,因此没有必要创建两个相同的String对象。只需将String对象加入常量池,在需要的时候取出,这样即可实现String对象的共享。
在程序中出现String编译时常量(String字面常量与String常量表达式),会自动调用intern方法,如果常量池中含有相等的String对象(使用String类的equals方法来判断),则直接返回常量池中的对象;否则将对象加入常量池中并返回该对象。
对于运行时创建的String对象(非String编译时常量),会分配到堆中,系统不会自动调用intern方法拘留该对象,不过我们依然可以自行调用该对象的intern方法对该对象进行拘留。

最后,祝大家早日学有所成,拿到满意offer

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

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

相关文章

加州大学惊现神操作!物理教授用数学论文摆脱400美元交通罚单,却惨被网友大反转.........

全世界只有3.14 % 的人关注了青少年数学之旅“学好数理化&#xff0c;走遍天下都不怕。”这句从上个世纪八十年代流传下来的金句&#xff0c;至今仍然哺育着理工科的莘莘学子。为了让模友们更好的理解这句话&#xff0c;今天就让小天给你们涨涨姿势&#xff0c;见识一下什么是学…

VMware虚拟机VMDK 快照 数据恢复成功

VMware虚拟机VMDK 快照 数据恢复成功【故障描述】某影院使用的票管理系统安装在一台虚拟中&#xff0c;数据库采用的是Oracle9I,虚拟机在安装好后做了一次快照&#xff0c;期间又做过一次快照&#xff0c;在正常使用过程&#xff0c;虚拟突然崩溃&#xff0c;无法启动&#xff…

[转]两个经典的windbg调试案例,值得学习。

1. 调试Bug的神兵利器&#xff1a;通过WinDbg条件断点收集Log 原文地址&#xff1a;http://blogs.msdn.com/yizhang/archive/2009/03/30/bug-windbg-log.aspx 调试Bug的神兵利器&#xff1a;通过WinDbg条件断点收集Log 前段时间花了几天一直在用WinDbg调试一个比较棘手的Bug。…

设计模式之观察者

观察者模式介绍观察者又名事件订阅者、监听者。观察者模式是一种行为设计模式&#xff0c;允许你定义一种订阅机制&#xff0c;可在对象事件发生时通知多个“观察者”该对象的其他对象。通知目标&#xff1a;拥有一些值得关注的状态的对象。发布者&#xff1a;它要自身的状态改…

二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?

二面京东被问到Java 反射&#xff0c;我直呼好家伙&#xff0c;这我不是必过吗&#xff1f;用多久我会升职加薪、当上技术总监、迎娶漂亮学姐、走上人生巅峰&#xff01;想想还有点小激动。 好了开始分享面试经历 说说你反射的理解 到底什么是反射呢&#xff1f;&#xff1f;…

通用路由封装(GRE)×××配置

本人没有很好的文采&#xff0c;只能直接配置&#xff0c;有不懂的地方&#xff0c;后面可以联系我&#xff0c;在配置当中&#xff0c;我会尽量在配置命令后面加标注。1、在R1上配置相关的命令R1&#xff08;config&#xff09;#int fa0/0 ---进入以太网fa0/0接口--R1&#…

gridview DataFormatString

转有个时间要在gridview中显示,但是保持着数据库中的是标准时间,很长,而且只需要显示日期,就想要格式化字符串,可是设置了DataFormatString就是不起作用,后来一查,原来要设置"行为"中HtmlEncode false DataFormatString"{0:格式字符串}" 在DataFormatStri…

太神奇了!使用C#实现自动核验健康码:(1)二维码识别

前言因为疫情的原因&#xff0c;无论是进入商场还是医院、车站&#xff0c;都需要出示健康码。现在基本都是采取人工方式核验健康码&#xff0c;看到绿码就通过&#xff0c;否则就禁止进入。但是&#xff0c;单靠人工核验健康码容易造成人员拥堵&#xff0c;增加病毒交叉感染的…

三角形中惊现叛徒!自己胖的像个球,却能成就世界上最快的赛车引擎......

全世界只有3.14 % 的人关注了青少年数学之旅一日&#xff0c;理科生上山寻访禅师。理科生问禅师&#xff1a;“大师&#xff0c;世人为何总嫌我棱角太突出&#xff0c;不合群&#xff01;”禅师思索一阵&#xff0c;掏出数根圆柱铺在地上&#xff0c;在上面搁了一块木板&#x…

我丢,去面试初级Java开发岗位,被问到泛型?

1、泛型的基础概念 1.1 为什么需要泛型 List list new ArrayList();//默认类型是Objectlist.add("A123");list.add("B234");list.add("C345");System.out.println(list);for(int i0;i<list.size();i){//若要将list中的元素赋给String变量&a…

echart 地图 某个地区_中国饮食地图来袭!你爱的口味暗藏健康隐患吗?

食&#xff0c;既是人生存之根本&#xff0c;也是人们热爱生活的体现。中国地域广阔、物产富饶&#xff0c;中国人对“吃”看重也愿钻研&#xff0c;种种因素造就了中国美食 “百花齐放”的局面&#xff0c;在“吃货”眼里&#xff0c;中国地图俨然就是一张美食地图。不同地区的…

面试官:实现一个带值变更通知能力的Dictionary

如题&#xff0c; 你知道字典KEY对应的Value什么时候被覆盖了吗&#xff1f;最近大家都在追.Net6 update&#xff0c;咱还是保持节奏&#xff0c;通用语言聊技术。没背景说个铲铲上文中 数据获取组件维护了业务方所有(在用)的连接对象&#xff0c;DBA能在后台无侵入的切换备份库…

颠覆认知!完美赌徒,到底是如何用数学打造经济神话?!

▲ 点击查看说起世界上最会赚钱的数学家&#xff0c;非詹姆斯西蒙斯莫属。1938年&#xff0c;西蒙斯出生于美国的马萨诸塞州&#xff0c;是一个鞋厂的儿子。在其他的孩子&#xff0c;还在听童话故事的时候&#xff0c;西蒙斯就已经开始展露出惊人的数学天赋了。3岁的时候&…

abs函数的使用方法 oracle_SQL Server 常用函数使用方法

1、SubString()&#xff1a;用于截取指定字符串的方法。该方法有三个参数&#xff1a;参数1&#xff1a;用于指定要操作的字符串。参数2&#xff1a;用于指定要截取的字符串的起始位置&#xff0c;起始值为 1 。参数3&#xff1a;用于指定要截取的长度。select substring(abcde…

高考落榜怎么办,奉劝学弟学妹们一些事情,请一定要擦亮眼睛

在目前这个社会情况Java技术是当前社会的一个热门专业&#xff0c;无论是pc端还是移动端对java的需求都是最多的&#xff0c;大学生学java正好顺应时代的发展&#xff0c;不仅有钱途还有前途&#xff0c;Java也适合零基础的人学习。 最近看见一句话 高考不努力&#xff0c;学习…

神仙打架!一人公开单挑全欧洲数学家,却惨遭4位数学家大反转,66年的难题被一晚破解......

全世界只有3.14 % 的人关注了青少年数学之旅两点之间直线最短&#xff0c;这家喻户晓的数学名言&#xff0c;就算是学渣也能倒背如流。但学渣们不知道的是&#xff0c;这条直线并不是最快的。为了让学渣们真正理解这句话&#xff0c;今天&#xff0c;超模君决定科普一波起源关于…

基于事件驱动架构构建微服务第4部分:repositories

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part4-repositories/在本文中&#xff0c;我将实现Repositories的命令端。存储库属于Clean架构的接口适配器在这一步中&#xff0c;我将开始实现基础设施的命令端&#x…

小松

之前做过一次小小的介绍(没看过的请参看此文&#xff1a;闲话小松)&#xff0c;相信不少老朋友应该都知道我是谁了。还不认识我的朋友可以称呼我小松(这名号有年头了&#xff0c;听习惯了^_^)&#xff0c;当然你喜欢怎么喊都成&#xff1a;)偶是个是理想主义的倡导者&#xff0…

vlan后 出现 outlook 正在试图从服务器检索数据

vlan后 出现 outlook 正在试图从服务器检索数据 cisco vlan outlook 正图试从Microsoft Exchange Server 检索数据。cisco 3750 vlan outlook is retrieving data from Microsoft Exchange Server mail.abc.com 最近对公司的网络按需要划分了基出802.1q的VLAN&#xff0c;…

二面京东,面试官直接问我JVM,我心里一阵暗爽~

二面京东&#xff0c;面试官直接问我JVM&#xff0c;我心里一阵暗爽~简直了&#xff0c;hhhh明人不说暗话&#xff0c;直接进入主题&#xff01;&#xff01;&#xff01;一、什么是JVM二、JAVA代码编译和执行过程类加载机制类执行机制三、JVM内存管理和垃圾回收垃圾回收按照基…