`
dyllove98
  • 浏览: 1376042 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:38147
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:78287
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:131410
社区版块
存档分类
最新评论

Java String类

 
阅读更多

String类

官方文档中String类的基本说明:

  public final class String

  extends Object

  implements Serializable, Comparable<String>, CharSequence

Java程序中的所有字面值(string literals),即双引号括起的字符串,如"abc",都是作为String类的实例实现的。

String是常量,其对象一旦创建就不能再被改变。换句话说,String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创造了一个全新的String对象,以包含修改后的字符串内容。

String对象具有只读特性,指向它的任何引用都不可能改变它的值,因此,也不会对其他的引用有什么影响。

 

字符串连接

为String对象重载的“+”操作符可以用来连接String。

编译器看到String对象后面跟着一个“+”时,就将与之相加的其他对象(可能并不是字符串)也转换为字符串,转换时是通过调用该对象的toString()方法。

当使用+拼接字符串时,会生成新的String对象,而不是向原有的String对象追加内容。

与之形成对比的是StringBuffer类,StringBuffer类使用append()方法追加字符串,向原有对象追加而不是创建新的对象。

append()方法返回当前StringBuffer对象,因此可以串联起来使用。

如:

StringBuffer buffer = new StringBuffer();

buffer.append("Hello").append(" World");

 

StringBuffer类的toString()方法返回String类对象。

StringBuffer类和String类的主要区别就是StringBuffer类的对象可以改变,而String类的对象一旦创建,就不能改变内容。

Java SE5中引入了StringBuilder,StringBuilder和StringBuffer的主要区别是后者是线程安全的。

 

String类的equals()方法

String类的equals()方法,覆写了Object类的equals()方法,判断当前字符串与传进来的字符串的内容是否一致

所以字符串相等的判断是用equals()方法,而不是使用==。

String中的equals()方法源代码如下:

String类的equals()
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
                int j = anotherString.offset;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                        return false;
                }
                return true;
            }
        }
        return false;
    }

 

这是个很好的例子,以后为自己的类覆写equals()方法的时候可以借鉴这个思路。

并且注意,分析一个类的equals()方法时,要看这个类是否覆写了Object类的方法,如果没有覆写,那么该类的equals()方法仍然和Object类中的方法实现一样,即和==实现一样的功能。

 

String Pool

String Pool,字符串池。

 

采用字面值赋值方式创建对象

String str1 = "aaa";

String str2 = "aaa";

当以字符串直接创建String类的对象时,会在字符串池中查找是否已经存在该常量。

如上例中,会在String Pool中查找是否存在"aaa"这个对象,如果不存在,则在String Pool中创建一个"aaa"对象,然后将其地址返回,赋给变量str1,这样str1会指向String Pool中的这个"aaa"对象。

如果在String Pool中查找时已经存在该对象,则不创建任何对象,直接将String Pool中的这个对象地址返回,如上面str2直接得到"aaa"对象的地址,它和str1实际上指向同一个对象。

 

采用new的形式创建对象

采用new的形式创建对象:

String str = new String("aaa");

new关键字必然会创建一个对象。

这种形式创建字符串对象时仍然会在String Pool中查找。

如果没有,则首先在String Pool中创建相应的对象,然后再在堆中创建一个对象;

若相同对象已经存在,则在堆中创建对象。

无论哪种情况,最后返回的地址都是堆中的地址。

如上例,首先在String Pool中查找有没有"aaa"这个字符串对象,如果有,则不在String Pool中再去创建"aaa"这个对象了,直接在堆(heap)中创建一个"aaa"字符串对象,然后将堆中的这个"aaa"对象的地址返回来,赋给str引用。

如果没有,则首先在String Pool中创建一个"aaa"对象,然后再在堆中创建一个"aaa"对象,然后将堆中的这个"aaa"对象的地址返回来,赋给str引用。

 

intern()方法

调用如"Hello". intern()方法,如果字符串池中已经存在字符串"Hello"(通过equals()方法判断相同),则返回这个对象的引用;如果不存在,则把当前调用intern()方法的对象加入字符串池中,然后返回这个对象的引用。

对于任意的两个字符串s和t来说,

  s.intern() == t.intern() 为真等价于 s.equals(t) 为真。

All literal strings and string-valued constant expressions are interned.

所有的字面值都是interned的,因为它们都在String Pool中。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics