Java之关于String字符串笔试面试重点

news2024/12/23 20:56:47

目录

一.关于字符串的常量池

1.关于字符串产生的三种方式

2.关于字符串的常量池

3.直接赋值法和new的方式产生对象的区别

二.关于intern方法

1.情况一(已经包含)

2.情况二(已经包含)

 3.情况三(未包含)

 4.情况四

三.关于字符串的不可变性

1.了解字符串的不可变性

2.String对象不可变性的原因

3.相关的考题


一.关于字符串的常量池

1.关于字符串产生的三种方式

String s1="abc";

String s2=new String("abc");

char[] value={'a','b','c'};

String s3=new String(value);

2.关于字符串的常量池

当字符串采用直接赋值法的时候,JVM会维护一个字符串的常量池.

当字符串常量第一次产生的时候,就会产生字符常量,放入到常量池中

当使用直接复制法再次产生相同的对象时,若常量池中存在该值的对象直接复用常量池中的对象,并不会产生新的对象

3.直接赋值法和new的方式产生对象的区别

首先需要明确==比较的引用对象地址是否相同,而不是值!!!

        String s1 = "abc";

        String s2 = new String("abc");

        char[] value = {'a', 'b', 'c'};

        String s3 = new String(value);

        String s4 = "abc";
        System.out.println(s1 == s2);//false
        System.out.println(s1 == s4);//true
        System.out.println(s2 == s3);//false
        System.out.println(s3 == s4);//fasle

关于这样四对字符串==的比较,因为s1和s4都采用的是直接赋值法,所以他们对象的产生在常量池中,由于他们的值都是相同的,所以他们指向同一个地址的值.

而new对象的产生是在堆上,所以他们都是指向不同地址的对象,虽然他们的值都是一样的

二.关于intern方法

这是一个手动置入常量池的方法:调用此方法,会将当前字符串对象尝试置入常量池

主要分为两种情况:

1.若常量池中已经包含了当前对象的内容,不会将当前对象置入常量池,返回值是常量池中原有的对象地址
⒉若常量池中没有包含当前字符串对象的内容,就将当前对象置入常量池之中,返回值是当前对象的地址

1.情况一(已经包含)

        String s1 = "abc";

        String s2=new String("abc");

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

        s2=s2.intern();

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

第一个s1==s2输出的是false,前边已经讲解过了,因为new对象是在堆上产生的,s1是在常量池中产生,==比较的地址,显然他们的地址不一样.

第二个s1==s2,因为值为"abc"已经存在与常量池中了,不会将s2对象置入到常量池中,但是结果的返回值为s1的地址,此时令s2=s2.intern(),s2的地址便与s1的地址相同

2.情况二(已经包含)

        String s1 = "abc";

        String s2=new String("abc");

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

        s2.intern();

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

 第一个s1==s2同上

第二个s1==s2,因为值为"abc"已经存在与常量池中了,不会将s2对象置入到常量池中,所以s2指向的还是s2原本的地址,s1与s2的地址不相同,所以返回的false

 3.情况三(未包含)

        char[] ch = {'a', 'b', 'c'};

        String s2 = new String(ch);

        s2.intern();

        String s1 = "abc";

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

new出来s2的时候,常量池中并没有"abc"这个字符串,这个时候将s2压入到常量池中,然后s1直接赋值法直接就是和s2压入到常量池的地址一样了,具体看下图

 4.情况四

        String s2 = new String("abc");//"abc"是字符串常量,此时存在于常量池中了

        s2.intern();//此时常量池中已经存在"abc",因为上边new对象的时候"abc"在常量池

        String s1 = "abc";

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

因为刚开始new对象的时候是拿常量池中的"abc"new出来,所以此时常量池中已经有了"abc",这个时候s2的地址还是处在堆中,s1直接赋值"abc"在常量池中,所以s1和s2的地址不一样

三.关于字符串的不可变性

1.了解字符串的不可变性

String对象一旦产生,字符串对象中保存的值不可改变

        String s1="hello";

        s1+=",world";
        s1+="!!";

        System.out.println(s1);

很多人可能会疑问,这样s1的值不是改变了吗?

这样一段代码,改变的是s1的引用,它的指向一直在改变,不断指向新的字符串常量

不断在常量池中产生了新的字符串对象str这个引用一直在变
字符串常量池中一旦字符串对象产生,内容不变的.这就是字符串对象的不可变性

2.String对象不可变性的原因

 String对象的底层是用一个字符串数组进行保存的.

有些人可能以为String对象不可变是因为char数组是final修饰的,实则这是一个很大的误解,因为final修饰的引用对象,只是它的地址值不会发生改变,它的实际内容还是会改变的,下面这段代码便可以很好的证明

        final char[] ch={'a','b','c'};

        System.out.println(Arrays.toString(ch));//[a, b, c]

        ch[0]='g';

        System.out.println(Arrays.toString(ch));//[g, b, c]

实际上是因为字符串数组前边的private进行修饰,因为String类中没有具体的get和set方法,所以我们在外边的时候,无法直接对char数组进行改变

所以我们常用的subString,replace等操作字符串的方法,并没有对原来的字符串进行了改变,只是产生了新的字符串对象

        String s="abcdefg";
        String substring = s.substring(0, 5);
        System.out.println(s);//abcdefg

3.相关的考题

    public static void main(String args[]){
        String str = new String("good");
        char[ ] ch = { 'a' , 'b' , 'c' };
        change(str,ch);
        System.out.println(str);
        System.out.println(ch);
    }
    public static void change(String str,char ch[ ]){
        str = "abc";
        ch[0] = 'g';
    }

对于这样一段代码的输出是什么?

我们学习过了字符串的不可变性,进入到change方法之后,字符数组直接在堆进行改变,而对字符串的改变,直接产生了新的字符串,str指向了新的地址,而主方法里的str指向的还是原来的地址,所以最后输出

str="good"
ch="gbc"

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

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

相关文章

python+selenium使用webdriver启动chrome出现闪退现象解决

这两天发现之前开发的爬虫程序出问题了:谷歌浏览器出现打开立即闪退的现象,代码未修改过,检查也没有任何问题! 查看chrome浏览器发现版本更新了 ↑(点击chrome浏览器右上角三个点,最下面帮助→Google Chr…

[软件工程导论(第六版)]第9章 面向对象方法学引论(课后习题详解)

文章目录1. 什么是面向对象方法学?它有哪些优点?2. 什么是“对象”?它与传统的数据有何异同?3. 什么是“类”?4. 什么是“继承”?5. 什么是模型?开发软件为何要建模?6. 什么是对象模…

[软件工程导论(第六版)]第8章 维护(复习笔记)

文章目录8.1 软件维护的定义8.2 软件维护的特点8.3 软件维护过程8.4 软件的可维护性8.5 预防性维护8.6 软件再工程过程维护的基本任务:保证软件在一个相当长的时期能够正常运行软件工程的主要目的就是要提高软件的可维护性,减少软件维护所需要的工作量&a…

C语言编程规范 第一部分

、代码总体原则 1、清晰第一 清晰性是易于维护、易于重构的程序必需具备的特征。代码首先是给人读的,好的代码应当可以像文章一样发声朗诵出来。目前软件维护期成本占整个生命周期成本的40%~90%。根据业界经验,维护期变更代码的成本,小型系统…

Spring Batch ItemProcessor组件-默认处理器

目录 引言 概念 默认ItemProcessor ValidatingItemProcessor:校验处理器 ItemProcessorAdapter:适配器处理器 ScriptItemProcessor:脚本处理器 CompositeItemProcessor:组合处理器 自定义ItemProcessor处理器 转视频版 引…

图数据库中的 OLTP 与 OLAP 融合实践

在一些图计算的场景下,我们会遇到同时需要处理 OLTP 和 OLAP 的问题。而本文就给了一个 OLTP 与 OLAP 融合实践的指导思路,希望给你带来一点启发。 Dag Controller 介绍 Dag Controller 是 NebulaGraph 企业版的图系统,经过反复测试无误后已…

rabbitMq安装(小短文)--未完成

rabbitMq是在activeMq的基础上创造的,有前者的功能,比前者强,属于后来居上。系统环境:windows10首先下载相关软件Erlang,因为他是这个语言写的。https://www.erlang.org/downloads然后安装,并且弄到环境变量里验证是否…

Robot Framework自动化测试---元素定位

不要误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加入了selenium2的API。比如笔者所处工作中,更多的是拿Robot framework来做数据库的接口测试&#xf…

Leetcode.2257 统计网格图中没有被保卫的格子数

题目链接 Leetcode.2257 统计网格图中没有被保卫的格子数 Rating : 1709 题目描述 给你两个整数 m和 n表示一个下标从 0开始的 m x n网格图。同时给你两个二维整数数组 guards和 walls,其中 guards[i] [rowi, coli]且 walls[j] [rowj, colj]&#xff…

适合初学者的超详细实用调试技巧(下)

我们日常写代码的时候,常常会遇到bug的情况,这个时候像我这样的初学者就会像无头苍蝇一样这里改改那里删删,调试的重要性也就显现出来,这篇文章接着上文来讲解。 上文地址:(8条消息) 适合初学者的超详细实用调试技巧&…

Tomcat目录介绍,结构目录有哪些?哪些常用?

bin 启动,关闭和其他脚本。这些 .sh文件(对于Unix系统)是这些.bat文件的功能副本(对于Windows系统)。由于Win32命令行缺少某些功能,因此此处包含一些其他文件。 比如说:windows下启动tomcat用的…

3款强大到离谱的电脑软件,个个提效神器,从此远离加班

推荐3款让你偷懒,让你上头的提效电脑软件,个个功能强大,让你远离加班! 很多几个小时才能做好的事情,用上它们,只需要5分钟就行!! 1、JNPF —— 个人最喜欢的低代码软件 它为开发者…

利用OpenCV的函数equalizeHist()对图像作直方图均衡化处理

如果一幅图像的灰度值集中在某个比较窄的区域,则图像的对比度会显得比较小,不便于对图像的分析和处理。 图像的直方图均衡化可以实现将原图像的灰度值范围扩大,这样图像的对比度就得到了提高,从而方便对图像进行后续的分析和处理…

从Docker挂载逃逸原理复现分析到BlueMoon实战

Docker逃逸 什么是Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互…

Elasticsearch:在满意度调查中实现并使用情绪分析器

如果你通过博客或新闻关注 Elastic,你已经知道在最新版本的 Elasticsearch 中已经提供了用于自然语言处理 (NLP) 的资源。事实上,在我之前的博客文章中,我已经推出了很多关于 NLP 的博文。请详细阅读 “Elastic:开发者上手指南” …

【Linux 多线程同步】使用同步和互斥实现生产消费模型

目录 1.同步的接口 2.多线程但是按顺序来执行 3.生产消费模型 4.使用互斥加同步实现生产消费模型 (采用环形队列) 同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题 …

GraphTrip论文笔记【Information Fusion 92 (2023)】

Dual-grained human mobility learning for location-aware trip recommendation with spatial–temporal graph knowledge fusion 期刊:EI检索 Information Fusion 92 (2023) Challenges (1)异质交互信息的挖掘 POI位置信息、POI类别信息…

重新标记ImageNet:从全局标签到局部标签(附github代码及论文)

欢迎关注“计算机视觉研究院”计算机视觉研究院专栏作者:Edison_GImageNet可以说是最受欢迎的图像分类基准,但它也是一个具有显著噪声的标签。最近的研究表明,许多样本包含多个类,尽管被假定为单个标签基准。因此,他们…

【办公类-18-02】Python VScode 制作“照片整理.py”的exe文件(打包系列)

效果展示:背景需求:最近一年我都是机动班(非固定班主任),所以拍的照片不多,只需要每月把手机里的照片用QQ的“我的文件助手”导出来,然后打开VScode,找到“20211020按日期批量整理文…

独居老人一键式报警器

盾王居家养老一键式报警系统,居家养老一键式报警设备 ,一键通紧急呼救设备,一键通紧急呼救系统,一键通紧急呼救器 ,一键通紧急呼救终端,一键通紧急呼救主机终端产品简介: 老人呼叫系统主要应用于…