zoukankan      html  css  js  c++  java
  • 【JDK】分析 String str=““ 与 new String()

    一、基础概念

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

    1.1 常量池

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

    1.2 字符串常量池

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

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

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

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

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

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

    1.4 equals()==

    • ==
    1. 如果是基本类型,==表示判断它们值是否相等;
    2. 如果是引用对象,==表示判断两个对象指向的内存地址是否相同。
    • equals()
    1. equals()方法未被重写时(Object时),比较的是内存地址;
    2. equals()方法被StringIntegerDate等类重写时,其比较的是两个内容是否相同。

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

    2.1 String str=""

    例如:

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

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

    1. 如果常量池中没有“风尘博客”这个字符串,就需要创建;
    2. 常量池中存在“风尘博客"这个字符串,就直接拿来用。
    • 最后str指向常量池中的对象。

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

    2.2 String str=new String()

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

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

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

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

    JDK-String-compare-02

    技术交流,欢迎扫一扫!

    风尘博客

  • 相关阅读:
    ASCII、Unicode和UTF-8等常见字符编码格式介绍
    pycharm创建脚本头文件模板
    pycharm常用设置项和快捷键
    Genymotion安装apk问题
    [Android测试] Appium的一些坑问题错误解决 与 技巧集锦
    Appium+python自动化测试过程中问题
    python客户端和Appium服务端联调出现的问题解决办法
    移动端自动化测试环境搭建
    "http://127.0.0.1:4723/wd/hub"的解释
    wireshark抓包看ECN
  • 原文地址:https://www.cnblogs.com/VanFan/p/15305973.html
Copyright © 2011-2022 走看看