String常见面试题

news2024/11/24 17:40:08

目录

    • 1.String为什么不可变
    • 2.String和StringBuilder、StringBuffer的区别
    • 3.String为什么要设置为不可变
    • 4.判断定义为String类型的s1和s2是否相等
    • 5.下面这句话在内存中创建了几个对象?
    • 6.判断定义为String类型的s1和s2是否相等
    • 7.判断定义为String类型的s1和s2是否相等
    • 8.判断定义为String类型的s1和s2是否相等

1.String为什么不可变

什么是不可变:String不可变很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。
在这里插入图片描述
源码

/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

从注释中,可以看出value变量是String用来存放字符的,还有一个hash成员变量是该String对象的哈希值缓存。
value,hash这两个成员变量都是private final修饰的,而String类中并没有提供set/get等公共方法来修改这些值,所以String类的外部无法修改String,同时final保证了在String内部,只要值初始化了,也不能被改变。
所以认为String对象是不可变的。
而在java中,数据也是对象,那么value也仅仅是一个引用,指向真正的数组对象,这将在下面的文章中用到。

2.String和StringBuilder、StringBuffer的区别

String,StringBuffer,StringBuilder,都是final类,不允许被继承,在本质上都是字符数组,不同的是,String的长度是不可变的而后两者长度可变,在进行连接操作时,String每次返回一个新的String实例,而StringBuffer和StringBuilder的append方法直接返回this,所以当进行大量的字符串连接操作时,不推荐使用String,因为它会产生大量的中间String对象。

StringBuffer和StringBuilder的一个区别是,StringBuffer在append方法前增加了一个synchronized修饰符,以起到同步的作用,为此也降低了执行效率;若要在toString方法中使用循环,使用StringBuilder

3.String为什么要设置为不可变

(1)不可变对象可以提高String Pool(字符串常量池)的效率和安全性。如果你知道一个对象是不可变动 ,那么需要拷贝的对象的内容时就不用复制它本身二只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存,效率也很好。二对于其他引用同一个对象的其他变量也不会造成影响。

(2)可不变对象对于多线程滴安全的,因为在多线程同事进行的情况下,一个可变对象的值很可能被其他线程改变这样会造成不可预期的结果么人使用不可变对象就可以避免这种情况出现。

java将String设成不可变最大的原因是效率和安全。

不可变对象的好处

不可变对象更容易构造,测试与使用;

真正不可变对象都是线程安全的;

不可变对象的使用没有副作用(没有保护性拷贝);

对象变化的问题得到了避免;

不可变对象的失败都是原子性的;

不可变对象更容易缓存,且可以避免null引用;

不可变对象可以避免时间上的耦合;

4.判断定义为String类型的s1和s2是否相等

  • String s1 = “abc”;

  • String s2 = “abc”;

  • System.out.println(s1 == s2); //true ,比较地址值,都在常量池,相等

  • System.out.println(s1.equals(s2)); //true,equals中,先判断两个对象的地址值,地址值相同,默认就是同一个对象,不会继续equalse中的具体值是否相等的判断了,直接会返回true。

5.下面这句话在内存中创建了几个对象?

  • String s1 = new String(“abc”); //两个对象 :abc在常量池,有自己的地址。 new String 创建 对象,在编译期间不能确定具体的值,所以会在 在在内存中创建的一个地址。

6.判断定义为String类型的s1和s2是否相等

  • String s1 = new String(“abc”);

  • String s2 = “abc”;

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

  • System.out.println(s1.equals(s2)); //true

7.判断定义为String类型的s1和s2是否相等

  • String s1 = “a” + “b” + “c”;

  • String s2 = “abc”;

  • System.out.println(s1 == s2); //true 地址值相同,都是常量,在常量池里面

  • System.out.println(s1.equals(s2)); //true 地址值相同,默认同一个对象,值当然也是相等的。

8.判断定义为String类型的s1和s2是否相等

  • String s1 = “ab”;

  • String s2 = “abc”;

  • String s3 = s1 + “c”;

  • System.out.println(s3 == s2); //false 不相等,s1是变量,编译的时候确定不了值,在内存中会创建值,s3在堆内存中,。s2在常量池,所以不相等。

  • System.out.println(s3.equals(s2)); //true 比较两个对象的值相等。

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

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

相关文章

【PHP】如何关闭buffer实时输出内容到前端

前言 默认情况下,我们在PHP里使用echo等函数输出的内容,是不会马上发送给前端的,原因是有 buffer 的存在,buffer又分两处,一处是PHP本身的buffer,另一处是Nginx的buffer。只有当buffer满了之后&#xff0c…

unity打包工具

接手了一个项目,打包存在重大问题,故此在unity addressables 基础上弄了一个简单的打包工具,代码也都做好了注释,操作非常简单以下为操作方法: 首先设置导入Addressables插件,并设置好详细参见&#xff1a…

普通学校,普通背景,普通公司,不普通总结。

作者:阿秀 InterviewGuide大厂面试真题网站:https://top.interviewguide.cn 这是阿秀的第「313」篇原创 小伙伴们大家好,我是阿秀。 可能很多人点开牛客、知乎、B站,一看帖子的标题都是"某985xxxx"、"不入流211xxx…

一文读懂集合竞价,建议收藏,读完少交学费

集合竞价每个时间段交易规则及作用都不一样,了解集合竞价的规则,有利于琢磨主力的意图。 大部分同学都不是很关心集合竞价,也不知道如何利用集合竞价买卖股票。如上图所示,有同学在9点15看着股票涨停,立马冲进去&…

[Machine Learning][Part 2]监督学习的实现

目录 线性模型实现: cost function :代价函数或者损失函数——衡量模型优劣的一个指标 理论: 代码实现: 梯度下降——自动寻找最小的cost function 代价函数 梯度的概念: 梯度下降公式: 实现一个简单的监督学习…

web:[极客大挑战 2019]LoveSQL

题目 打开页面显示如下 查看源代码,查到一个check.php,还是get传参 尝试账号密码输入 题目名为sql,用万能密码 1or 11# 或 admin or 11 给了一段乱码,也不是flag 查看字段数 /check.php?usernameadmin order by 3%23&pass…

Go语言开发小技巧易错点100例(九)

往期回顾: Go语言开发小技巧&易错点100例(一)Go语言开发小技巧&易错点100例(二)Go语言开发小技巧&易错点100例(三)Go语言开发小技巧&易错点100例(四)Go…

Java之SpringCloud Alibaba【六】【Alibaba微服务分布式事务组件—Seata】

一、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 在关系数据库中,一个事务由一组SQL语句组成。 事务应该具有4个属性: 原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomicity) ∶个事务…

无人直播间

失败!! 采用 ffmpeg 技术进行推流 推流代码: 【需要将rtmp替换为你的推流地址】 ffmpeg -re -stream_loop -1 -i "rain.mp4" -c copy -f flv ""推流地址获取 以哔哩哔哩为例 点击下方链接 开播设置 - 个人中心 - …

Java【手撕链表】LeetCode 143. “重排链表“, 图文详解思路分析 + 代码

文章目录 前言一、两数相加1, 题目2, 思路分析2,1 找到中间结点2.2, 逆序后半段链表2.3, 合并两个链表 3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管…

springcloud之自我介绍

写在前面 在这篇文章 中我们分析了单体应用的问题,以及用来解决这些问题的解决的方案微服务,并接着看了微服务需要考虑的各种,如服务调用,负载均衡,服务治理,链路追踪,分布式事务,等…

Konva离屏缓存

前言 cache实例方法定义在Node基类上,通过该方法可以实现图形缓存,在Konva中Stage、Layer、Group、Shape等所有容器类和图形类都直接或间接继承了Node基类,故而都可以使用缓存方法。本篇文章就是探讨Konva背后的缓存机制,版本是v…

300以内的开放耳机哪款好、300以内神级耳机推荐

开放式耳机基于不入耳、长久舒适佩戴的特点,在 2023 年迎来了增长爆发期。基于其开放式不入耳设计,佩戴时耳道会持续保持畅通状态,减少了对耳朵的压力,既能在通话或欣赏音乐时提供清晰的声音,又能让周围的环境声音透过…

Scala第二章节

Scala第二章节 scala总目录 章节目标 掌握变量, 字符串的定义和使用掌握数据类型的划分和数据类型转换的内容掌握键盘录入功能理解Scala中的常量, 标识符相关内容 1. 输出语句和分号 1.1 输出语句 方式一: 换行输出 格式: println(里边写你要打印到控制台的数据);方式二…

【Java 进阶篇】MySQL多表查询之子查询详解

在数据库查询中,多表查询是一项非常常见且重要的任务。它允许我们从多个相关联的表中检索和组合数据,以满足各种复杂的查询需求。在多表查询中,子查询是一种强大的工具,用于在查询中嵌套另一个查询。本文将深入探讨MySQL中的子查询…

直播软件开发技巧:7个实时视频传输和弹幕功能的关键步骤

近年来,随着直播行业的快速崛起,直播软件的开发变得越来越重要。直播软件的成功不仅依赖于稳定的实时视频传输,还需要强大的弹幕功能来提升用户体验。作为直播软件开发领域的专家,我将与您分享七个关键步骤,帮助您掌握…

python使用mitmproxy和mitmdump抓包在电脑上抓包

mitmproxy是一个中间人角色,供python抓包使用。 本机环境:win10 64位,python3.10.4。首先安装mitmproxy,参考我的文章 记录一下python2和python3在同一台电脑上共存使用并安装各自的库以及各自在pycharm中使用的方法-CSDN博客 一…

SimpleCG文字输出基础

前言 前面已经介绍了图形绘制,本篇将介绍简单的文字输出操作方法。其实文字在计算机中也是作为图形处理的,只是一种特殊的图形,是按固定预设字模图形来绘制的,称为字体。文字输出就是按文字所在字体中的对应图形绘制出来&#xff…

【golang】调度系统之整体介绍

调度系列 调度系列之goroutine 调度系列之m 调度系列之p 调度系列之sysmon 前面几篇对调度体系的G、M、P、sysmon分别进行了介绍。拆分的介绍有助于聚焦单一的角色,比较快地建立认识,同时也能更深入细节,但是不足以建立全局的认知。本篇在前面…

C理解(五):编译,链接库,宏,关键字,变量

编译 编译过程 文件.c->(预处理)->文件.i->(编译)->文件.S->(汇编)->文件.o->(链接)->elf程序 预处理 内容:加载头文件(#include),清除注释(//,./*),替换条件编译(#if #elif #endif #ifdef),替换宏定义(#define) …