`

对于String的认识

 
阅读更多

这段时间有不少关于String的帖子,也有很多很好的解释。我在这里就算是搜集一下,并简单地分析一下原因。一是我不熟悉JVM的底层规范,二是我觉得别人分析的很好,但是不能拘泥于这样分析,分析的目的是为了让我们明白其中的道理。
下面我列出参考的帖子,也方便大家去查看:

《深入研究java对String字符串对象的创建以及管理》

《操作符“+”的定义,他是否是new了一个新的字符串?》

《到底创建了几个String对象?》

还是靠程序来说话:

  1. public class VerifyString {
  2.     public static void main(String args[]){
  3.         String str1 = "I am a String";
  4.         String str2 = "I am a String";
  5.         String str3 = new String("I am a String");
  6.         String str5 = "I am a ";
  7.         String str6 = "String";
  8.         String str7 = str5 + str6;
  9.         String str8 = "I am a " + "String";
  10.         String str9 = str3.intern();
  11.         String str10 = str7.intern();
  12.         
  13.         if(str1 == str2)
  14.             System.out.println("str1 and str2 are the same String.");
  15.         else
  16.             System.out.println("str1 and str2 are the different Strings.");
  17.         
  18.         if(str1 == str3)
  19.             System.out.println("str1 and str3 are the same String.");
  20.         else
  21.             System.out.println("str1 and str3 are the different Strings.");
  22.         
  23.         if(str1 == str7)
  24.             System.out.println("str1 and str7 are the same String.");
  25.         else
  26.             System.out.println("str1 and str7 are the different Strings.");
  27.         
  28.         if(str1 == str8)
  29.             System.out.println("str1 and str8 are the same String.");
  30.         else
  31.             System.out.println("str1 and str8 are the different Strings.");
  32.         
  33.         if(str1 == str9)
  34.             System.out.println("str1 and str9 are the same String.");
  35.         else
  36.             System.out.println("str1 and str9 are the different Strings.");
  37.         
  38.         if(str1 == str10)
  39.             System.out.println("str1 and str10 are the same String.");
  40.         else
  41.             System.out.println("str1 and str10 are the different Strings.");
  42.         
  43.     }
  44. }

运行的结果是:

  1. str1 and str2 are the same String.
  2. str1 and str3 are the different Strings.
  3. str1 and str7 are the different Strings.
  4. str1 and str8 are the same String.
  5. str1 and str9 are the same String.
  6. str1 and str10 are the same String.

解释以上的输出结果,首先要理解一个叫String Pool的概念,虽然JVM没有明确提出这个概念,但是细想一下,别的语言String基本都是作为基本类型来处理的,而在Java中直接就是一个对象,然而奇怪的是对象能像基本类型那样直接赋常量。这就能看出Java设计者的那种取舍吧,毕竟作为对象来处理的话,效率没有基本类型那样高。我们不需要更多的理解,直接记住String str1 = "I am a String";是把"I am a String"扔到了字符串池中,然后把引用抛给str1,以后再有相同值的String变量也是这种赋值语句的,那么还是存在字符串池中,有就直接返回引用,没有就创建一个新的。所以说着语句就创建了一个String对象。再看下一个String str3 = new String("I am a String");这个创建了几个对象?两个!不要怀疑!一个是在new String("I am a String")创建在heap中的,另一个是str3也在heap中,它们所指向的字符数组是相同的,位于内存区的常量池中。关于这一点,请看大企鹅的这篇blog:《 还是 String》。接下来看str7和str8,明明两个的值是一样的,为什么结果不一样呢?这就牵扯到Java编译器对于不同str8的优化了。因为str7右边的是两个变量,而不是直接的两个值,编译器就无法在编译期间知道str8的值,相反,str8对于编译器来说直接就是str8 = "I am a String"了,这样的两种不同的情况,就有不同的结果了。再看str3和str7都和返回否定的,而为什么str9和str10返回的是一致的呢?因为intern()方法是把执行该方法的引用拖到了字符串池中,当然了如果字符串池中有的话,就直接返回引用了。

总结一下就是:
1. 区分好String str1 = "I am a String"和String str3 = new String("I am a String")创建对象的数目和地方。
2. 了解String str1 = "I am a " + "String"是编译期间确定值的。
3. 了解intern()方法。

分享到:
评论

相关推荐

    java自制string类例程

    总之,"java自制string类例程"是一个很好的实践项目,可以帮助初学者巩固对Java字符串概念的理解,提高编程技能,并对面向对象编程的核心原则有更深入的认识。在实际编程中,虽然我们通常使用内置的String类,但这种...

    第 04 节_GEE 的数据类型 (String, Number).pdf

    GEE(Google Earth Engine)是谷歌推出的一个云计算平台,主要用于处理和分析地球科学...通过本节的学习,我们应该已经了解了这两种数据类型在GEE中的基本用法和构建函数,并对GEE命令语言的基本语法有了初步的认识。

    Javascript实例-String对象-唐诗三百首

    通过学习这个实例,不仅可以提升编程技能,还能增进对中国传统文化的认识。同时,这种结合文化背景的编程实践也体现了编程不仅仅是逻辑和算法,更是一种表达和传播文化的手段。 在提供的压缩包“练习-唐诗三百首”...

    A First Course in String Theory

    物理学的发展历程中充满了统一事件,即不同现象被认识到是相互关联的,并通过调整理论来反映这种认识。其中最显著的例子之一发生在19世纪,当迈克尔·法拉第发现变化的磁场能够产生电场后,詹姆斯·克拉克·麦克斯韦...

    一些常用的string的校验和测试类

    在IT行业中,字符串(String)是数据处理中非常基础且重要的元素。无论是编程语言如Java、C#、Python,还是各种数据库、网络通信,都...对于源码的阅读和理解,有助于提升对字符串操作的深入认识,同时也能锻炼编程技巧。

    Javascript string 扩展库代码

    这类库的存在表明了开发者对于JavaScript原生String方法不足之处的共识。 ### 3. 需要的String扩展函数类型 作者建议通过参考其他编程语言和JavaScript库来决定应该包含哪些String扩展函数。比如C#和Java等语言,...

    c++ string

    很好的c++字符串参考手册,我就是通过它认识c++的强大的,并且学起来很有进

    C++实现String类实例代码

    在C++编程中,实现String类是一个常见的练习题,旨在考查程序员对类的构造、析构以及赋值等行为的理解程度。...通过对String类的实现,可以加深对类的封装性、数据隐藏、资源管理等面向对象基本概念的认识。

    PHP中simplexml_load_string函数使用说明

    通过这个函数的使用说明和示例,我们可以了解到PHP处理XML数据的灵活性和便利性,同时也认识到了在处理XML数据时需要注意的一些细节。simplexml_load_string函数是一个强大的工具,可以帮助开发者在应用程序中轻松地...

    阶段性章节复习:String类的使用 以及与基本数据类型变量间的运算 认识进制 常用运算符回顾之算术运算符、赋值运算符

    这是近期练习过的JavaSE基础源代码,含义注释及说明,适合复习Java基础使用,欢迎有需要的朋友下载交流学习。另外,热门专栏“Python从入门到人工智能”持续更新中,欢迎大家订阅学习和交流。

    c#中string的特性介绍及注意事项小结

    总结来说,理解`string`的不可变性和其内部实现机制对于编写高效且内存友好的C#代码至关重要。在处理字符串时,避免装箱操作和使用`StringBuilder`进行拼接可以显著提高性能并减少内存使用。此外,对`string`的这些...

    VBS编辑器Vbsedit

    这对于代码的可读性和维护性来说是非常重要的。 其次,Vbsedit提供了参数提示和自动完成关键字功能。当用户在编写代码时,编辑器会根据上下文智能提示可能的函数参数和关键字,极大地加快了编码速度,减少了手动...

    Modbus通讯协议学习 - 认识篇

    Modbus通讯协议学习 - 认识篇 Modbus通讯协议是应用于电子控制器上的一种通用语言,通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。Modbus协议定义了一个控制器能认识使用的...

    Java第4章 认识类和对象.含源代码

    public Student(String name, int age, String gender, String studentId, String major) { super(name, age, gender); this.studentId = studentId; this.major = major; } } ``` 多态是面向对象的另一大特性...

    Android知识体系梳理(4)-Java基础篇-Object方法分析,String的深度解析,String Pool分析,与StringBuilder、StringBuffer的对比

    无论是Object类的基本方法,还是String类的特性,都需要开发者在实践中不断加深认识,以便在编程时能够做出更优的选择。通过这样的知识梳理,可以系统地掌握Java在Android开发中的应用,为后续学习更复杂的Android...

    xml的解析深度认识完整版

    ### XML解析深度认识 #### 一、XML简介与解析方式 **XML (eXtensible Markup Language)** 是一种用于标记数据的语言,它被设计用来传输和存储数据。XML 的主要特性包括灵活性、可扩展性和易读性。XML 文件通常包含...

    认识C#中的委托和事件

    ### 认识C#中的委托和事件 #### 引言 在.NET Framework中,委托与事件是极其重要的概念,尤其对于那些希望深入了解面向对象编程语言C#的人来说更是如此。尽管这些概念初看起来可能有些难以理解,但是一旦掌握了其...

    Java Object类认识

    例如,`String s1 = new String("Hello"); String s2 = new String("Hello"); s1 == s2`将返回`false`,因为它们指向内存中的不同对象,尽管它们的值相同。 **equals() 方法**: - `equals()`方法是为了解决`==`在...

Global site tag (gtag.js) - Google Analytics