• 说出下面程序的输出
class StringEqualTest {

    public static void main(String[] args) {
      String s1 = "Programming";
                String s2 = new String("Programming");
                String s3 = "Program" + "ming";
                String s4=new String(s2);
         String s5 = "Programming";
                System.out.println(s1 == s2);//false
                System.out.println(s4 == s2);//false
                System.out.println(s1 == s3);//true
                System.out.println(s1 == s1.intern());//true
}
}

解释:

在此引入常量池这个概念:

常量池(constant
pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量

首先,我们要知道Java会确保一个字符串常量只有一个拷贝。

因为例子中的s1和s3中的Programming”都是字符串常量,它们在编译期就被确定了,所以s1==s3为true;而”Program”和”ming”也都是字符
串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s3也同样在编译期就被解析为一个字符串常量,所以s3也是常量池中
”kvill”的一个引用。

所以我们得出s5==s1==s2;

用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String()
创建的字符串不放入常量池中,它们有自己的地址空间。

所以有s2!=s4

String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。

再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个 方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用, 如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;

案例

String s0= “kvill”;
String s1=new String(”kvill”);
String s2=new String(“kvill”);
System.out.println( s0==s1 );
System.out.println( “**********” );
s1.intern();
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
结果为: false
**********
false //虽然执行了s1.intern(),但它的返回值没有赋给s1
true //说明s1.intern()返回的是常量池中”kvill”的引用
true
  • 关于equals()和==:

这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;String类已经重写过了equals方法。

而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用

而在符合数据类型中,则equals和==都是比较两对象的地址是否相同,除非重写equals,详见hashcode与equals的区别。

  • 使用equals方法比较两个相同的StringBuffer对象
     StringBuffer sb0=new StringBuffer("hello");
StringBuffer sb1=new StringBuffer("hello");
System.out.println(sb0==sb1);
System.out.println(sb0.equals(sb1));
System.out.println(sb0.toString().equals(sb1.toString()));
false
false
true

StringBuffer 类没有重写Object类下的equals方法,所以实质还是==比较,所以如果需要比较两个StringBuffer对象是否相等则toString()方法转为String。

  • .关于String是不可变的

    这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str=”kv”+”ill”+”
    “+”ans”;

    就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “ 生成 ”kvill
    “存在内存中,最后又和生成了”kvill
    ans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原
    因了,因为StringBuffer是可改变的。

  • 可不可以在分割字符串是使用多个分割符
String str="2012-05-25 13:24:16";
String[] s=str.split("-|:|\\s");
for(String temp:s){
System.out.print(temp+" ");
}
2012 05 25 13 24 16

关键点就是在split()方法中使用多个分割符;其实split()方法里的分割符参数是一个正则表达式,所以可以使用或操作符(|)链接多个分割符,这样在分割的时候就会按照所有的分割符对字符串进行分割了。\s表示空格,不过在字符串使用过程中还需要在\s之前添加转义字符"\",否则会出现编译错误。

java String 深入理解的更多相关文章

  1. 我对java String的理解 及 源码浅析

    摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 每天起床告诉自己,自己的目标是 ”技术 + 英语 还有生活“! ...

  2. 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念

    转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ...

  3. Java提高篇——理解String 及 String.intern() 在实际中的应用

    1. 首先String不属于8种基本数据类型,String是一个对象.   因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ...

  4. 跟着刚哥梳理java知识点——深入理解String类(九)

    一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...

  5. 通过反编译深入理解Java String及intern(转)

    通过反编译深入理解Java String及intern 原文传送门:http://www.cnblogs.com/paddix/p/5326863.html 一.字符串问题 字符串在我们平时的编码工作 ...

  6. java String长度与varchar长度匹配理解(字符和字节长度理解)

    java String长度与varchar长度匹配理解(字符和字节长度理解) string中的length()长度,返回的是char的数量,每个char可以存储世界上任何类型的文字和字符,一个char ...

  7. java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换

    java中如何理解:其他类型 + string 与 自增类型转换和赋值类型转换 一.字符串与其他类型连接 public class DemoString{ public static void mai ...

  8. Java总结篇系列:Java String

    String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...

  9. java String 中 intern方法的概念

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

随机推荐

  1. LUA闭包概念演示

    闭包的一个重要场景,形成一个自治的环境, 让操作可以封闭运行, 即函数运行时有状态的,可以从闭包创建时候的环境独立开来. 例如下面的lua闭包, genFilter 其入参parmIn是 函数的内部变 ...

  2. django url 软编码

    期初用django 开发应用的时候,完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRedirect()也是硬编码转向地址,当然在template 中也是一样了, ...

  3. json在action,$.ajax{}中的使用

    首先需导入包:ezmorph-1.0.4.jar Action中的调用的方法: public void getObject(){  try {   if(cname!=null&& ! ...

  4. 多边形和圆的相交面积(模板)hdu2892、hdu4404

    area Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. Java基础(7):二维数组初始化时需要注意的问题

    二维数组可以先指定行,再指定列:但不能先指定列,再指定行 没有说明二维数组的行的个数,在定义二维数组时也可以只指定行的个数,然后再为每一行分别指定列的个数.如果每行的列数不同,则创建的是不规则的二维数 ...

  6. ofbiz进击 第五节。 --OFBiz配置之[general.properties] 共有属性的分析(含email)

    文件内容如下 unique.instanceId=ofbiz1     #--为JobManger方法提供实例的ID(必须小于20个字符)    currency.uom.id.default=USD ...

  7. git操作??

    一直在搞git,但是难度真的很大,我的英语超烂,而申请git账号时全部是英文的,我就拿着翻译有道词典,必应.进行翻译,一个一个单词的往上面打,一张网页能翻译一下午,最后还是不知道应该具体怎么去操作,所 ...

  8. paper 92:Lena与图像处理

    如果你是个数字图像处理技术的研究人员,或这方面的工程师, 想必对这位戴有羽状帽饰的美女不会感觉陌生.我第一次在国际知名的学术性刊物上见到这位美女时,不禁叹为天人,毕竟在这样严肃的学术期刊上,还从未出现 ...

  9. zw版【转发·台湾nvp系列Delphi例程】HALCON AffineTransImage

    zw版[转发·台湾nvp系列Delphi例程]HALCON AffineTransImage unit Unit1;interfaceuses Windows, Messages, SysUtils, ...

  10. 轻量linux-Crunch bang

    主页地址:http://crunchbang.org crunch bang11昵称 wheezy crunchbang 11 基于 debian7