关于创建String对象的抉择

标签(空格分隔): 与String有关的那些事儿
转自博客:java String 两种不同的赋值 比较


  • 关于创建String对象的抉择

    • 我的旧记忆
    • 新的认识
      • 类似普通对象通过new 创建字符串对象
      • 直接赋值
      • 手动入池
    • 国际惯例总结
    • 后话为什么String 可以直接赋值

我的旧记忆


之前我的大脑还是有概念的,只是比较模糊,我知道创建一个String对象有几种形式。

  • String string=new String()
  • String string=”jfirehj”

但是我是真不知道这两种形式有没有区别,因此在比较String 对象的时候,理解到不了位。

public class EmptyTest {public static void main(String[] args) {String s1 = "iiii";String s2 = "iiii";if(s1==s2){System.out.println("you are right");}if (s1.equals(s2)) {System.out.println("you are right again");}}
}

输出是

you are right
you are right again

再来一次

public class EmptyTest {public static void main(String[] args) {String s1 = new String("iiii");String s2 = new String("iiii");if (s1 == s2) {System.out.println("you are right");}if (s1.equals(s2)) {System.out.println("you are right again");}}
}

输出:

you are right again

使用new是在堆上创建了两个不同的对象。但是这个字符串创建的怎么来进行解释呢?


新的认识


找到的两篇写得比较好的博文:
第一篇
第二篇

原来就还有一个常量池的概念。

类似普通对象,通过new 创建字符串对象


String str = new String(“Hello”); 内存图如下图所示,系统会先创建一个匿名对象”Hello”存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把”Hello”存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收

直接赋值

如String str = “Hello”; 首先会去缓冲池中找有没有一个”Hello”对象,如果没有,则新建一个,并且入池,所以此种赋值有一个好处,下次如果还有String对象也用直接赋值方式定义为“Hello”, 则不需要开辟新的堆空间,而仍然指向这个池中的”Hello”,原来如此

这段代码证明结论:

手动入池

即使使用new关键字,第一种方式赋值,也可以使用一个java中的手动入池指令,让所创建的对象入池,以后依然可以背重复使用,利用下面两段代码可以测试, 如下图,结果显然是false,因为二者的地址不同。

国际惯例:总结

通过常量池的形式可以很好的提高效率,因此提倡直接赋值

后话:为什么String 可以直接赋值

打开了String.class,有这么一段介绍:

/**
* The <code>String</code> class represents character strings. All * string literals in Java programs, such as <code>"abc"</code>, are * implemented as instances of this class. * <p> * Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they can be shared. For example: * <p><blockquote><pre> *     String str = "abc"; * </pre></blockquote><p> * is equivalent to: * <p><blockquote><pre> *     char data[] = {'a', 'b', 'c'}; *     String str = new String(data); * </pre></blockquote><p> * Here are some more examples of how strings can be used: * <p><blockquote><pre> *     System.out.println("abc"); *     String cde = "cde"; *     System.out.println("abc" + cde); *     String c = "abc".substring(2,3); *     String d = cde.substring(1, 2); * </pre></blockquote> * <p> */  

通过上面的介绍,我们可以清楚,直接赋值的话,是通过编译器在起作用,当你对”abc”没有通过new创建时,他会自动默认给你调用构造函数new String(char value[]). 不显式调用String的构造函数(通过new叫显式调用),其实JDK编译器会自动给你加上。

编译器主动调用构造方法的情况出现很多次了也

关于创建String对象的抉择相关推荐

  1. java 获取对象方法有哪些方法有哪些方法有哪些_Java中创建String 对象的方法有哪些...

    Java中创建String 对象的方法有哪些 发布时间:2020-11-25 16:45:30 来源:亿速云 阅读:71 作者:Leah 这篇文章将为大家详细讲解有关Java中创建String 对象的 ...

  2. java 创建string对象机制 字符串缓冲池 字符串拼接机制

    对于创建String对象的机制,在这一过程中涉及的东西还是值得探究一番的. 首先看通过new String对象和直接赋值的方式有什么区别,看如下代码: public static void main( ...

  3. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...

    字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就 ...

  4. java string对象创建_String对象创建个数

    s = new String("xyz");创建了几个String Object?两个对象,一个是"xyx",一个是指向"xyx"的引用对象 ...

  5. java string对象创建对象_Java String 创建了几个对象

    我们首先来看一段代码: Java代码 String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢 ...

  6. 关于Java String对象创建问题解惑

    先看看下面的代码     public String makinStrings()     {         String s = "Fred";         s = s + ...

  7. java string对象创建_Java问题解析:到底创建了几个String对象

    // 如果d和c没有指向了同一个对象,则说明d没有被加入字符串池 else { System.out.println(""ab"+"cd" 创建的对象 ...

  8. Java 面试,创建了几个String 对象? 我让问!让你问!让你问!

    前言 上周忘记啥时候,学习群里面聊到这个String分配内存的问题,当时群里讨论还蛮激烈的. [无图,太久了找不到了,意思一下] 然后昨天有兄弟面试遭挫又私聊我,问到这个: 作为出手侠, 我又要出手了 ...

  9. javascript的string对象

    创建string对象: var str="bbb"; 方法和属性: 属性:length:字符串的长度 var str="aaaa"; document.writ ...

  10. java中String对象和String变量

    2019独角兽企业重金招聘Python工程师标准>>> java中String对象和String变量 (2011-12-27 20:40:27) 转载▼ 标签: it 最近在论坛上看 ...

最新文章

  1. web-view 跳转小程序页面 网页跳转小程序
  2. 小型电商web架构!小而美!
  3. Ubuntu 14.04.1 配置 Android 源码开发环境(jdk版本切换)(转载)
  4. Create Custom Instruments
  5. ResNet学习笔记
  6. 7-4 找到共同的选修课-hebust (10 分)
  7. Python(5):循环
  8. R语言:随机抽样(sample函数)
  9. “请先做自我介绍”:高手都是这样做自我介绍,这样介绍最加分
  10. 诗歌rails 之rails g
  11. [算法]不用第三个数交换2个数的位置
  12. Ext3.2 beta版已发布
  13. 【java】System成员输入输出功能out、in、err
  14. python简介pdf_Python以及QuTip包简介.PDF
  15. wxpython textctrl_wxpython中Textctrl回车事件无效的解决方法
  16. 美国智能机市场Android份额逼近苹果iOS
  17. Tosca:设置执行结束时间
  18. python使用selenium调用edge浏览器webdriver
  19. 台式计算机网卡驱动不能正常使用,电脑网卡驱动程序不正常怎么办 网卡驱动程序不正常解决方法...
  20. 编译coccinelle-1.0.0-rc24时的错误Error: Unbound module Parmap以及解决方法

热门文章

  1. 记录双十一微信群抢楼的脚本
  2. LM1875小功放电路解析与调校(出好声音)
  3. 自制太阳能手机充电器
  4. 【MySQL学习笔记(十六)】之redo日志超详细讲解
  5. altera Cyclone V再认识
  6. pt100铂电阻型号_铂热电阻型号(热电阻型号有什么表示)
  7. 想哭的鱼最新QQ伤感日志发布:你不该,不相信我
  8. Hbuilder连接苹果手机
  9. nvidia控制面板点了没反应win7_nvidia控制面板点击没反应 - 卡饭网
  10. Hexo 搭建个人博客(九)NexT 主题进阶配置