`

黑马程序员_java字符串常量

 
阅读更多
---------------------- android培训java培训、期待与您交流! ----------------------
在学习多线程部分的时候看到了下边一种情况,感觉不是太理解,所以通过搜索,找到以下解释,特留作记忆:

   在使用线程同步的时候syschronized(object)只有object是同一个对象的时候,被syschronized(){}括起来的代码才能起到同步作用,现在又多个线程调用同一个方法,且传入一个String类型的参数,如:

function(String key){
   syschronized(key){
   //该处代码互斥
  }
}
//当调用function的时候两次调用均传入传入字符串"1",则可是想同步,问题就出现了,原来只知道
/**
1、String是final类,不可继承;
2、String类比较字符串相等时时不能用“ == ”,只能用“equals”; 
3、String类不可更改。*/


//认为不同的字符串就是不同的对象,为什么还可以实现互斥呢,下边内容给出了解释

以前关于String的理解仅限于三点:
1、String是final类,不可继承;
2、String类比较字符串相等时时不能用“ == ”,只能用“equals”;
3、String类不可更改。

String使用非常方便,因此一般涉及字符串时都用该类进行字符串处理。至于String类的类在机制,则极少去探究。直到读到下面这个例子。

class X{ 

   public static String strX="hello";
}
class Y{
   public static String strY="hello";
}
class Z{
   public static String strZ="hell"+"o";
}
class Test{
   public static void main(String[] args){
         System.out.println( X.strX==Y.strY);
         System.out.println( X.strX==Z.strZ);
         String s1="hel";
         String s2="lo";
         System.out.println( X.strX==(s1+s2));
         System.out.println( X.strX==(s1+s2).intern());
}}



按照我的理解,类X,类Y,类Z中的三个常量字符串属于不同的对象,用 == 操作符比较,那么结果必然是false,输出应该为:

  • false
  • false
  • false
  • false




但实际上输出确是:

  • true
  • true
  • false
  • true



使我大惑不解。因此,找了许多资料来看(尤其是C++和Java比较编程,里面解释比较详细),终于逐渐明白了原因。

== 只有在两个比较对象指向同一对象时,其值才为true。X.strX==Y.strY 与 X.strX==Z.strZ 测试结果都为true,说明这三个常量指向的都是同一个对象。

在Java中,String是字符串常量。由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。每个字符串常量只有一个String对象来表示。即使这个字符串常量出现在一个程序的不同位置甚至一个程序的不同程序包中。也就是说,X.strX与Y.strY由于都是同一字符序列,因此指向的肯定是同一对象。

Z.strZ也是如此。"hell"+"o",两个常量字符串相加后,创建了一个新的字符串常量(这个工作是编译期间完成的),它与X.strX,Y.strY有相同的字符序列,因此指向同一对象。

虽然一个常量表达式将两个字符串常量链接在一起的结果在编译器已完成,但是,
  • String s1="hel";
  • String s2="lo";
  • String s3=s1+s2;




这段代码中,s3只能在运行期间创建。这三条语句所创建的"hello"字符串作为String对象存储在内存中的一个独立位置。

Java提供一个机制,通过String类定义的intern()方法把一个运行时创建的字符串加到字符串常量池(如果它还没有入池)。如果上面的三条代码改为:
String s1="hel";
String s2="lo";
String s3=(s1+s2).intern();




Java将把s1+s2所返回的字符串对象中的字符序列与已经存储在字符串常量池中的字符串进行比较。如果找到一个匹配,intern()就返回这个字符串的引用。如果没有找到匹配,s1+s2所返回的字符串将被加入到字符串常量池中,并返回这个字符串常量的引用。

这就解释了为什么X.strX==(s1+s2)返回false,而X.strX==(s1+s2).intern()返回true。(s1+s2).intern()指向strX,strY,StrX指向的字符串常量"hello"。


---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima
分享到:
评论

相关推荐

    黑马程序员_Java基础辅导班教程课件[第01期]第13天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...

    黑马程序员入学Java精华总结

    ### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...

    黑马程序员入学Java知识(精华总结)

    ### 黑马程序员入学Java知识(精华总结) #### 一、Java概述与基础知识 ##### 1、何为编程? 编程是指使用计算机语言来编写指令,这些指令被计算机执行以完成特定任务的过程。通过编程,我们可以控制计算机的行为...

    黑马程序员入学面试题

    - `StringBuffer`:线程安全的可变字符串,适合多线程环境下的字符串操作。 - `StringBuilder`:非线程安全的可变字符串,效率高于StringBuffer。 #### 39. 集合 Java集合框架提供了丰富的数据结构,包括List、Set...

    毕向东13字符串01

    在第一部分“黑马程序员_毕向东_Java基础视频教程第13天-01-String(概述).avi”中,讲解了字符串的基础知识。字符串在Java中是不可变的对象,这意味着一旦创建,就不能改变其内容。它们是通过`String`类或`...

    黑马程序员毕向东java基础课堂完整版文档

    《黑马程序员毕向东Java基础课堂完整版文档》是一份全面且深入的Java学习资源,由知名教育机构黑马程序员的讲师毕向东倾力打造。这份资料涵盖了从Java编程基础到高级特性的全过程,旨在帮助初学者系统地掌握Java编程...

    黑马程序员《Java自学宝典》源代码

    Java自学宝典是针对初学者和有一定基础的学习者设计的一套完整的Java学习资源,由知名的教育机构黑马程序员出品。这份源代码压缩包包含了书中各个章节的实例代码,旨在帮助学习者深入理解Java编程语言的核心概念和...

    黑马程序员入学Java知识

    ### 黑马程序员入学Java知识 #### Java概述与基础知识 1. **何为编程?** - 编程是通过特定的计算机语言来编写指令,让计算机执行一系列任务的过程。 2. **Java语言概述,历史、特点** - **概述**:Java是一种...

    黑马程序员Java基础视频辅导班Day02

    "黑马程序员Java基础视频辅导班Day02"的内容主要涵盖了常量、变量以及运算符这些核心概念。 首先,我们来讨论常量。常量是程序中不会改变的值,它们一旦被定义,就不能再进行修改。在Java中,有两种类型的常量:字...

    【黑马面试宝典】虐面试官神器之必备黑马程序员面试宝典V2.51

    Java中的字符串常量池优化了字符串的使用,提高了效率。 这些知识点的深入理解和掌握对于Java程序员来说至关重要,无论是在日常开发还是面试中,都能体现出扎实的基础和专业素养。学习和熟练应用这些概念,将有助于...

    字符串1302

    在Java编程语言中,字符串(String)是一个至关重要的概念,它被广泛用于数据...在观看“黑马程序员_毕向东_Java基础视频教程第13天-02-String(常见功能-获取和判断).avi”时,建议结合实例进行练习,加深理解和记忆。

    黑马程序员基础班精华笔记总汇

    - **字符串常量**:被双引号括起的字符序列。 - **字符常量**:被单引号括起的单个字符。 - **整数常量**:所有的整数值。 - **小数常量**:所有的小数值。 - **布尔常量**:`true`和`false`。 - **空常量**:...

    黑马java教程知识点笔记整理

    String类是Java中的核心类,用于处理字符串。字符串是不可变的,可以通过String类提供的各种方法进行操作,如concat()、substring()、indexOf()、replace()等。 【异常处理】 Java使用异常处理机制来处理运行时...

    黑马程序员之C#编程学习笔记

    在"黑马程序员之C#编程学习笔记"中,我们可以深入理解C#的基础概念和核心特性,尤其针对初学者,这是一份非常实用的学习资料。 首先,C#的基本语法结构与C++和Java有诸多相似之处,它支持类、接口、继承等面向对象...

    毕向东静态06

    - 字符串的常量池:Java会缓存所有字面量字符串,避免重复创建。 - `String`类的方法:如`length()`、`charAt()`、`substring()`、`indexOf()`、`replace()`等。 - `StringBuilder`和`StringBuffer`类:用于字符...

    JAVA基础课件

    6. **字符串处理**:Java中的String类提供了丰富的字符串操作方法,课件会详细讲解字符串的创建、比较和操作。 7. **异常处理**:Java通过异常处理机制来捕获和处理运行时错误,课件将介绍try-catch-finally语句块...

    最全面的 C++ 笔记 【黑马程序员】.zip

    这份“最全面的 C++ 笔记 【黑马程序员】.zip”文件包含了深入学习C++所需的关键知识点,适合初学者和有一定经验的开发者。下面我们将深入探讨C++的一些核心概念和重要特性: 1. **基本语法与数据类型**:C++的基础...

    黑马面试题汇总(理论部分)借鉴.pdf

    当"+"用作字符串连接符时,为了避免混淆,可能需要使用括号明确运算优先级,例如:String str = "Hello," + " World";。 以上知识点涵盖了Java语言的基础,包括数据类型、数组、运算符、逻辑操作、变量和常量的使用...

Global site tag (gtag.js) - Google Analytics