String源码深度刨析

 前言

我们将从源码角度深度分析特点,来提升对他们的了解以及设计。

String、StringBuilder、StringBuffer的常见面试题及四大区别可以参考:String、StringBuilder、StringBuffer的四大区别解析


String

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    // 用final 修饰不可变的char 数组存放字符串
    private final char value[];

    // 缓存 String 的 hash 值
    private int hash; // Default to 0

    // 实现序列化的表示
    private static final long serialVersionUID = -6849794470754667710L;
}

 String 实现了三个接口:

Comparable: 说明 String 实现了比较功能,可以比较大小(按顺序比较单个字符的ASCII码)

Serializable: 说明 String 可以实现序列化

CharSequence: 表示是一个有序字符的序列,因为String的本质是一个char类型数组.


被 final 修饰的 char[]

fianl 修饰变量表示改变量的值一旦被初始化后不可以修改。fianl 不论是修饰变量、参数、方法、类都表示其 是完美的不可以被修改,或者逻辑顺序不能改变是一个基本逻辑实现元素。

 final 的详细讲解可以看final详解

 那为什么这里要用final修饰呢?

被 fianl 修饰就表示不能被继承或者重写修改,String类的设计是Java设计者不希望程序员继承String也就说明String类的最好用法不是继承,而是依赖和关联的关系。

先说被fianl修饰的字符数组

字符串是我们在开发过程中要进程使用的,每一次的创建对象随着次数的增加都会造成资源的大量消耗,导致内存消耗以及庞大的性能开销,为了提高性能,降低内存消耗,提出了字符串共享的方案,在方法区的常量池中保存下创建唯一的字符串去共给不同的类不同的方法以及线程去使用。

再回到这个数组上,字符串共享是解决内存消耗以及性能开销的必然选择,这里还没回答出为什么要被final修饰。共享带来的问题就是安全问题,在多个线程对通同一个字符串访问操作是不确定的,为了保证线程安全并且兼顾内存资源问题最好的办法就是使用fianl修饰。表示禁止修改。

 类为什么也要被fianl修饰?

final修饰的类表示不可以被继承,就是限制多态/限制行为。Java的一大特性就是安全性,如果不被fianl修饰,在使用Sring的时候会有太多的不确定性,每一个方法都围绕char数组展开,如果被继承方法进行了多态,会造成不同的语义或者错误的定义,使得String的行为性不确定,使得String对象的代码将是不安全的,所以设计成不能被继承的,来保证它的绝对安全。也说明了这个类最好的使用方法是依赖和关联,而不是继承。


创建方式以及存储区域

public class Demo1 {


    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = new String("hello");
        String s3 = "he" + "llo";
        String s4 = new String("he") + "llo";
        String s5 = new String("he") + new String("llo");
        String s6 = new String(s2);
        String s7 = new String(s6).intern();

        System.out.println(s1 == s2); //false
        System.out.println(s1 == s3); //true
        System.out.println(s4 == s1); //fasle
        System.out.println(s4 == s2); //false
        System.out.println(s5 == s2); //false
        System.out.println(s6 == s2); //fasle
        System.out.println(s7 == s1); //true
    }
}

        我们知道 s1 这种方式创建的对象是在常量池中,并且在栈区直接指向常量池中第一个字符的地址,第二种方式现在常量池中寻找对象如果没有就创建,然后在堆区创建一个对象引用常量池中的位置,再由栈区获取。每一次new对象都会在栈区创建一个新对象,比如 s7 使用了intern方法返回的结果就是 true 这是因为他们其实在常量池的地址都是一样的,但是因为有了堆区的指向,所以不相等,有了intern直接在栈区指向常量池的地址所以就返回了相等。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在JavaScript开发中,关于var、let和const你需要知道这些

文章目录&#x1f4cb;前言&#x1f3af;var&#x1f3af;let&#x1f3af;const&#x1f3af;相关面试题&#x1f4dd;总结&#x1f4cb;前言 计算机编程中最基本的一个就是使用名字&#xff08;或标识符&#xff09;表示值。绑定名字和值为我们提供了一种引用值和在程序中使…

阿里云ECS大测评

本篇博客是阿里云 ECS实例测评&#xff0c;这里采用阿里的C5.large计算型实例 本次对云服务器ECS产品能力的体验和建议&#xff0c;可帮助其他用户选用云服务,使用云服务器ECS创建应用场景测评 首先对实例的硬件(CPU&#xff0c;内存&#xff0c;磁盘)进行测试&#xff0c;采…

数智未来·持续创新 | 易趋受邀出席DSMC 2023中国制造业数智峰会

3月17日-18日&#xff0c;以“数智未来持续创新”为主题的DSMC 2023中国制造业数智峰会在长沙成功召开。由中国通信工业协会指导&#xff0c;信息侠主办&#xff0c;湖南省数字经济促进会、浙江省数字经济联合会、安徽省首席信息官协会联合支持。鉴于易趋项目管理软件在制造行业…

数据出境是什么意思?我国数据出境合规要求是什么?

随着经济全球化深入以及云计算等技术的发展&#xff0c;数据在全球范围跨境流动。数据跨境在促进经济增长、加速创新的同时&#xff0c;对数据主权、数据权属、个人信息保护等一系列问题逐渐浮出水面。今天我们就先来了解一下数据出境是什么意思&#xff1f;我国数据出境合规要…

校招失败后,在外包公司熬了 2 年终于进了字节跳动,竭尽全力....

其实两年前校招的时候就往字节投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

我们现在怎样做父亲

离开了中学的课本后再没读过鲁迅的文章&#xff0c;今年想再读鲁迅。《我们现在怎样做父亲》这个题目本是鲁迅《坟》杂文集中的一篇&#xff0c;怎样做父亲是个人生大命题&#xff0c;毕竟一生中在这件事上不太能靠积累经验来熟练。所以&#xff0c;在做父亲这件事上不是一个技…

【BIM+GIS】BIM+GIS融合的意义与应用价值

文章目录 一、BIM、GIS解析二、BIM+GIS应用价值三、BIM+GIS应用四、BIM和GIS融合面临什么问题?一、BIM、GIS解析 BIM(建筑信息模型)是一种应用于工程设计、建造、管理的数据化工具,主要针对于微观单体建筑的应用,能够将建筑工程项目的各项相关信息数据集成在一个模型中,…

基于springboot实现生鲜超市管理的设计与实现演示【附项目源码】分享

基于springboot实现生鲜超市管理的设计与实现演示B/S的系统是通过能上网的电脑就可以使用&#xff0c;它最大的优点是不需要安装专门的软件&#xff0c;首先浏览器向服务器发出请求&#xff0c;然后服务器处理请求把信息再返回给浏览器。不需要再次对数据进行存取与计算数据&am…

行业分析| anyRTC智慧视频监控的应用

智慧视频监控是安全防范系统的重要组成部分&#xff0c;不仅可以达到一般视频监控系统的远程控制监控、视频回看&#xff0c;满足治安管理、城市管理、交通管理、应急指挥等需求&#xff0c;还具备防盗报警系统的预警信息作用&#xff0c;在预防、发现、控制、打击违法犯罪&…

零入门kubernetes网络实战-25->基于tap虚拟网络设备的测试用例以及协议栈封装解析介绍(helloworld级别)

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章主要是分享一下tap虚拟网络设备。 创建tap网络设备的方式跟tun完全一样&#xff0c;只需要将类型改为tap即可。 这里不再占用篇幅介绍了。 1、本…

Matlab与ROS(1/2)---Message(三)

0. 简介 消息是ROS中交换数据的主要容器。主题和服务使用消息在节点之间传输数据。为了标识其数据结构&#xff0c;每条消息都有一个消息类型。例如&#xff0c;来自激光扫描仪的传感器数据通常以sensor_msgs/LaserScan类型的消息发送。每种消息类型标识消息中包含的数据元素。…

【Java Web】002 -- JS Vue快速入门

目录 一、JS快速入门 1、什么是JavaScript? 2、JS引入方式 ①、示例代码 3、JS基础语法 ①、书写语法 ②、变量 ③、数据类型 ④、运算符 ⑤、流程控制语句 4、JS函数 ①、第一种函数定义方式 function funcName(参数1&#xff0c;……) ②、第二种函数定义方式 var funcName …

Chatgpt4来了,测试小姐姐实测,在失业的边缘疯狂试探~

GPT-4是OpenAI于2023年3月发布的最新人工智能模型&#xff0c;它是继GPT-3.5之后的又一次重大突破。它的核心技术是基于Transformer的自回归语言模型&#xff0c;它使用了大量的无标注数据进行预训练&#xff0c;学习了自然语言和其他模态之间的通用表示和关系。我们今天来看看…

★Flash

1.NOR Flash和NAND Flash的区别 读速&#xff1a;Nor很快&#xff0c;NAND快 擦除/写入&#xff1a;Nor低&#xff0c;NAND高 访问方式&#xff1a;Nor一次写一个字节&#xff0c;按总线时序读写&#xff1b;NAND一次写多个&#xff08;512字节的块&#xff09;&#xff0c;…

【2023中高级向】53道vue面试题附答案

1. 谈一谈对 MVVM 的理解&#xff1f; 参考答案&#xff1a; MVVM 是 Model-View-ViewModel 的缩写。MVVM 是一种设计思想。Model 层代表数据模型&#xff0c;也可以在 Model 中定义数据修改和操作的业务逻辑;View 代表 UI 组件&#xff0c;它负责将数据模型转化成 UI 展现出来…

Spring MVC 图片的上传和下载

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Graph Neural Networks: Graph Structure Learning

最近研究GNN的应用方面&#xff0c;遇到了很大的瓶颈&#xff0c;所以回归理论&#xff0c;潜心阅读图结构学习的理论知识&#xff0c;也希望给大家在学习时带来帮助&#xff0c;如有错误请私信指正&#xff01; Graph Neural Networks: Graph Structure Learning 摘要&#…

Day912.多环境配置隔离 -SpringBoot与K8s云原生微服务实践

多环境配置隔离 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于多环境配置隔离的内容。 多环境支持&#xff0c;是现在互联网开发研发和交付的主流基本需求。通过规范多环境配置可以规范开发流程&#xff0c;并同时提示项目的开发质量和效率等。 一个公司应该规范…

计算机组成原理实验1---运算器 预习报告

本实验为哈尔滨工业大学计算机组成原理实验&#xff0c;实验内容均为个人完成&#xff0c;目的是分享交流&#xff0c;如有抄袭将追究责任&#xff0c;笔者能力有限&#xff0c;若因此影响读者的分数&#xff0c;本人深表抱歉。 一、 实验目的 了解运算器的组成结构基于数据通…

mybatis resource配置mapper

<mapper resource"com/hm/mapper/UserMapper.xml"/> 这种配置mapper和package配置资源的区别&#xff1f; 1.package解析mapper过程&#xff0c; 获取name对应的路径&#xff0c;获取class下的mapper,根据mapper里的路径拼接.xml解析文件&#xff0c;此时命名…