---------------------- 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,输出应该为:
但实际上输出确是:
使我大惑不解。因此,找了许多资料来看(尤其是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
分享到:
相关推荐
day01_Object类、常用API day02_Collection、泛型 day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda...Java基础小节练习题答案
最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示字符串常量最新单片机仿真 用P0口显示...
字符串处理程序,有对字符串各种操作的方法,如:随机数发生器,左填充char,右填充char,得到语言配置,读配置文件属性值,url编码,url编码解码,html编码,sql特殊字符去除函数,字符串到js中冲突去除函数,删除...
预处理中__DATE__中的"Aug 27 2013"格式的时间转换为yymmdd格式。
Java__字符串扩展.mp4
java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...
第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: 揭秘JVM字符串常量池和Java堆-01第4节: ...
通过随机数和按位算法对字符串的加密解密。(java版)
用P0口显示字符串常量.zip
Java__字符串.mp4
Java_I_5字符串
尚硅谷_Java11_字符串和Optional的新API 10.尚硅谷_Java11_字符串和输入流的新API 11.尚硅谷_Java11_Http客户端API 12.尚硅谷_Java11_Java11废弃的内容 13.尚硅谷_Java11_Epsilon垃圾收集器 14.尚硅谷_Java11_ZGC...
292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串常量(51单片机C语言实例Proteus仿真和代码)292-用P0口显示字符串...
5、 利用Set统计某字符串(可直接设定, 单词间用空格隔开)有多少单词,利用map统计该字符串中每个单词都出现几次。
基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符串常量.rar基于Keil+51用P0口显示字符...
java字符串处理取出括号内的字符串 都是我自己试过可以用的j
java 字符串 详细实例代码 字符串检索 可改变字符串 字符串生成器 日期和时间字符串格式化
java4数组字符串向量_2字符串回顾及测试概要.docx
AT89S52单片机C语言应用
_151_翻转字符串里的单词.java