Stirng类,一个有故事的类

简介: Stirng类,一个有故事的类

一 故事背景

乐乐工作时有时候会和同事探讨一些技术问题,今天同事抛出了一个问题

String s ="str"  和 String s = new String("str")

他们有什么区别,让乐乐觉得对Stting类的了解还不够,于是准备对String类重新认识一遍

二 分析开始

简单的问题往往很复杂,乐乐觉得说的就是String,那就看看为什么他很简单,又为什么他很复杂?从源码开始扒

  1. 源码

    public final class String

      implements java.io.Serializable, Comparable, CharSequence {
      /** The value is used for character storage. */
      private final char value[];
    
      /** Cache the hash code for the string */
      private int hash; // Default to 0
    
      /** use serialVersionUID from JDK 1.0.2 for interoperability */
      private static final long serialVersionUID = -6849794470754667710L;
      ...
      
    这个类老长了,不过你一定看到了`final`,为啥要记这个,因为面试时会问,相加之后是几个对象。
    `String s ="str"`和 `String s = new String("str")`有没有区别,你可能说没有,但是现实是有。
    啥区别?`String s ="ss"` 是在编译时,放到常量池中的
    `String s = new String("str")` 是在运行期,做了两件事,第一放到常量池,第二放到head堆内存中,下面我们通过代码验证
    
  2. 代码验证

    String str5 = new String("杨")+new String("乐乐");
    System.out.println(str5== str5.intern() ); //true

    String str6 = new String("杨乐乐");
    System.out.println(str6== str6.intern() ); //false

    先说下面的 下面的false是因为new String的时候创建了两个对象一个对象放到了堆内存head中一个放到了常量池中,然后 执行str6.intern方法实际上是先去常量池中找是否有“杨乐乐”,如果有就返回杨乐乐,最终他们进行比较,但是str6指向的是head堆内存,而str6.intern指向的是常量池,就返回false了,然后说上面的就比较复杂,复杂在intern()这个方法。

首先 String str5 = new String("杨")+new String("乐乐");做了几件事,新建一个“杨”放在了head及常量池 又新建一个 “乐乐”放在head及常量池,
最终str5成为了new String(“杨乐乐”)的引用
而str5.intern() 实际上是 先在常量池中找“杨乐乐” ,但是他没有找到
没有找到后 “他就在常量池中增加了一个 new String(“杨乐乐”)的引用 ” 最终str6== str6.intern() 比较了两个引用相同,所以返回true。

然后我和同事说网上的答案有问题,网上的关于intern方法的解答
intern方法的用途
  关于字符串String中的intern方法,是当前的字符对象(通过new出来的对象)可以使用intern方法从常量池中获取,
如果常量池中不存在该字符串,那么就新建一个这样的字符串放到常量池中。
这里面没有说引用,同事说这个是jdk1.6和jdk1.7的区别,后来查验 的确如此。

相关文章
|
数据安全/隐私保护
「域渗透」域账户的几种攻击方式
「域渗透」域账户的几种攻击方式
|
监控 安全 C#
attempt to write a readonly database错误的解决(C#,SQLite)
今天打包WPF程序,安装后总是打不开,查看监控日志原来是SQLite的问题,报错如图     当向SQLite数据库中存入新纪录时总是显示attempt to write a readonly a database。
3605 0
|
3月前
|
负载均衡 Java Nacos
微服务架构中的服务注册与发现流程
本内容介绍了微服务架构中的服务注册与发现流程,包括服务注册中心(如Nacos)、服务提供者和调用者的角色分工。服务启动时自动注册信息至注册中心,调用者通过客户端负载均衡(如Spring Cloud Loadbalancer)选取服务实例进行远程调用。同时,内容还讲解了OpenFeign的工作原理,其作为HTTP客户端集成负载均衡,通过接口定义、代理生成、请求发送与结果解析,实现服务间的高效通信。
|
监控 Unix Linux
如何使用 Linux less 命令?
【4月更文挑战第25天】
894 1
如何使用 Linux less 命令?
|
12月前
|
算法 测试技术 量子技术
时隔5年,谷歌再创量子霸权里程碑!RCS算法让电路体积增加一倍
谷歌在量子计算领域取得重大突破,通过随机电路采样(RCS)算法,成功将量子电路体积翻倍,实现了量子霸权的里程碑。这一成果发表于《自然》杂志,展示了量子动力学与噪声交互作用下的相变现象,推动了量子计算在密码学、材料科学等领域的应用潜力。尽管如此,量子计算仍面临错误率高、可扩展性差等挑战。
243 3
|
监控 网络协议 应用服务中间件
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
本文详细解析了Tomcat架构中复杂的`Connector`组件。作为客户端与服务器间沟通的桥梁,`Connector`负责接收请求、封装为`Request`和`Response`对象,并传递给`Container`处理。文章通过四个关键问题逐步剖析了`Connector`的工作原理,并深入探讨了其构造方法、`init()`与`start()`方法。通过分析`ProtocolHandler`、`Endpoint`等核心组件,揭示了`Connector`初始化及启动的全过程。本文适合希望深入了解Tomcat内部机制的读者。欢迎关注并点赞,持续更新中。如有问题,可搜索【码上遇见你】交流。
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
|
存储 运维 Linux
Linux磁盘精准缩容:操作详解与技巧
在Linux系统管理中,有效的磁盘空间优化对于维护系统性能至关重要。本文将深入探讨如何在Linux环境下安全地进行磁盘缩容,帮助你合理调整存储资源,确保系统高效运行。跟随本篇的步骤,一起优化你的Linux系统磁盘空间!
Linux磁盘精准缩容:操作详解与技巧
|
移动开发 前端开发 JavaScript
前端需要掌握的技术有哪些方面?
前端需要掌握的技术有哪些方面?
607 1
|
机器学习/深度学习 存储 算法
MOF
金属有机框架(MOF)材料是一种由金属离子或簇与有机配体构成的三维网状结构,具有大的比表面积、高的孔隙率、可控的结构和性质等优点。由于其独特的结构和性质,MOF材料在能源存储、同位素分离、生物医疗等领域具有广泛的应用前景。
656 1
|
Shell Linux 开发工具
在Linux中,当你需要给命令绑定⼀个宏或者按键的时候,应该怎么做呢?
在Linux中,当你需要给命令绑定⼀个宏或者按键的时候,应该怎么做呢?