【JDK】分析 String str=““ 与 new String()

一、基础概念

为了讲清楚他们的差异,这里先介绍几个概念。

1.1 常量池

所谓常量池:顾名思义就是用来存放一些常量的。该常量是在 编译期被确定,并被保存在已编译的 .class文件中,其中包括了类,方法,接口等包含的数值常量,字符常量和字符串常量。

1.2 字符串常量池

在常量池中,有个专门用来存储字符串常量的,称之为字符串常量池。

当我们需要使用字符串时,首先会在该字符串常量中查找是否存在该字符串,若存在则直接进行使用;若不存在,则会新建一个对应的字符串,并保存在该字符串常量池中。

1.3 在编译期间创建的常量和运行期间创建的常量保存的地址是不一样的

对象的引用都是存放在栈中

  1. 编译期间创建的常量保存在常量池中;
  2. 运行期间通过 new创建时,会直接创建一个新字符串常量并会存储在堆中。

所以我们可以发现,在堆中,可以有很多重复相同的字符串,而在常量池中,不会出现重复的值。

1.4 equals()==

  • ==

  • 如果是基本类型, ==表示判断它们值是否相等;

  • 如果是引用对象, ==表示判断两个对象指向的内存地址是否相同。

  • equals()

  • equals()方法未被重写时( Object时),比较的是内存地址;

  • equals()方法被 StringIntegerDate等类重写时,其比较的是两个内容是否相同。

二、 String str=""new String() 的区别

2.1 String str=""

例如:

String str = "风尘博客";
  • 先在栈区创建 str引用,然后关于创建对象。

这个表达式,可能会创建一个对象,也可能不会创建对象。

  1. 如果常量池中没有”风尘博客”这个字符串,就需要创建;
  2. 常量池中存在”风尘博客”这个字符串,就直接拿来用。

  3. 最后 str指向常量池中的对象。

注意!这里就是上面说的,从常量池中直接取用,所以,两者引用地址应该也相同,即 == 比较为 true

【JDK】分析 String str=““ 与 new String()

2.2 String str=new String()

String str=new String("风尘博客")
  • 同样的,先在栈区创建 str引用;

这个表达式,可能会创建一个对象,也可能创建两个对象。

  1. 然后会直接创建一个字符串存放在堆中;
  2. 其次,同样的:如果常量池中没有”风尘博客”这个字符串,就需要创建;常量池中存在”风尘博客”这个字符串,就直接拿来用。

  3. 最后 str指向常量池中的对象。

注意!这里这里和上面不一样,这里直接在堆里创建对象,每新建一个都会创建一个,所以,两者引用地址肯定不相同,即 == 比较为 false

【JDK】分析 String str=““ 与 new String()

Original: https://www.cnblogs.com/VanFan/p/15305973.html
Author: 风尘博客
Title: 【JDK】分析 String str=““ 与 new String()

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573556/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 监控JAVA应用的好工具javamelody

    今天在JAVAEYE首页看到这个工具的推荐,看了下,不错:JavaMelody能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内…

    Java 2023年5月29日
    080
  • 面试突击71:GET 和 POST 有什么区别?

    GET 和 POST 是 HTTP 请求中最常用的两种请求方法,在日常开发的 RESTful 接口中,都能看到它们的身影。而它们之间的区别,也是一道常见且经典的面试题,所以我们本文…

    Java 2023年5月29日
    067
  • LocalDateTime查找最近的五分钟点

    /** * 最近的五分钟 * @param dateTime * @return */ public static LocalDateTime getNear5(LocalDate…

    Java 2023年6月8日
    053
  • Linux 无法启动vmmon的问题[主要出现于Arch系]

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    0104
  • 史上最简单的 SpringCloud 教程 | 终章

    https://blog.csdn.net/forezp/article/details/70148833转载请标明出处:http://blog.csdn.net/forezp/a…

    Java 2023年5月30日
    058
  • springboot项目打包方式

    springboot和 ssm 项目打包方式 1.打jar包 说明:springboot项目默认的打包方式就是打jar包,因为它内嵌了tomcat,用不着打war包部署到tomca…

    Java 2023年6月5日
    0153
  • DBeaver首选项

    1.自动保存 2.SQL格式 可根据个人习惯选择SQL格式; 本人习惯紧凑格式。 3.自定义模板 将常用的SQL语句添加至模板,在SQL编辑器内输入模板名称按下Tab键,即可唤出全…

    Java 2023年6月8日
    083
  • Java_并发工具包 java.util.concurrent 用户指南(转)

    译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/in…

    Java 2023年5月29日
    079
  • 数据库篇:mysql锁详解

    前言 sql事务的执行,如果需要锁定数据进行更新操作,则必定离不开锁 共享锁和排他锁 表锁 行锁 Record Lock 间隙锁 Gap Lock 行锁+间隙锁 Next-Key …

    Java 2023年6月5日
    087
  • 使用java调用 salesforce SOAP API

    可以从github上下载最新版本然后用maven工具构建 下面列下我用wsc工具打成jar包测试过程中的代码: java -cp force-wsc-27.0.0-jar-with…

    Java 2023年6月7日
    049
  • Lambda表达式

    jdk8更新了一个新特性,Lambda表达式,它采用了一种简洁的语法定义代码块,取代了大部分的匿名内部类,主要用内部类完成实现接口。 这里给出一系列接口,供上下文操作 public…

    Java 2023年6月5日
    092
  • Reference 引用类

    Reference Queue *Method Summary: Reference *Method Summary: void():Clears this reference o…

    Java 2023年6月8日
    072
  • 哈工大软件构造Lab2(2022)

    (防扒小助手) 本人CSDN博客: 本人博客园博客(同步CSDN): 如果对你有用的话欢迎点赞关注哟! 1、实验目标概述 2、实验环境配置 3、实验过程 3.1 Poetic Wa…

    Java 2023年6月9日
    086
  • Spring源码分析 之浅谈设计模式

    一直想专门写个Spring源码的博客,工作了,可以全身性的投入到互联网行业中。虽然加班很严重,但是依然很开心。趁着凌晨有时间,总结总结。 首先spring,相信大家都很熟悉了。 1…

    Java 2023年5月30日
    057
  • Kubernetes-Statefulset

    1. 简介 StatefulSet 是用来管理 有状态应用的工作负载A…

    Java 2023年6月7日
    084
  • OAuth2.0

    一、OAuth2.0 为何物   OAuth 简单理解就是一种授权机制,它是在客户端和资源所有者之间的授权层,用来分离两种不同的角色。在…

    Java 2023年6月8日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球