黑马程序员——java小结_002_String类

来源:互联网 发布:淘宝买家钻石等级 编辑:程序博客网 时间:2024/06/09 13:59

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

         学C++的都对string类型熟悉无比,但是当接触到java中的string类型时,又会觉得无比陌生和别扭。

       从概念上讲,java的字符串就是Unicode字符序列。java没有内置的字符串类型,而是在标准java类库中提供了一个预定义类,顺道称之为string,每个用双引号括起来的字符串都是string的一个实例。

       在C程序员第一次接触java字符串的时候,必定会迷惑的,因为在c里面字符串其实就是字符数组。这是错误的其实java中的字符串更像是cahr*指针

       char* string= "string"

       其实java中的string类隐含了一个属性——final,也就是说string类不可修改。

       当然java中String类本就没有提供用于修改字符串的方法。

    例如String s = "abc";

    java中的String类型一旦初始化就不可改变,例如string s= "abc",先在栈中创建一个对String类的对象引用变量s,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc,

    如果已经有”abc” 则直接令s指向“abc, 且这个地址是固定的,同样也就意味着指向这个地址的string对象永远是“abc”;

     但这不意味着java无法修改,string的修改机制是将里面的内容提取出来——修改——再存到一个新的地址——将原来的对象指向这个新的内存地址,

      这样让string达到修改的目的,但是原来的“abc”依然还在原来的内存地址上,没有消失 也没有修改。

       举个例子:

String s = new String("abc"); 

String s = "abc"; 

    两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量s,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令s指向”abc”,如果已经有”abc” 则直接令s指向“abc”。 

      比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。 

<span style="font-size:14px;">String s1 = "abc"; String s2 = "abc"; System.out.println(s1==s2); //true </span>

可以看出s1和s2是指向同一个对象的。 

<span style="font-size:14px;">String s1 =new String ("abc"); String s2 =new String ("abc"); System.out.println(s1==s2); // false </span>

用new的方式是生成不同的对象。每一次生成一个。

 

这样做是否会降低效率呢?(效率就是¥)

答案是:也对,也不对。

        诚然,修改一个代码单元要比创建一个新的字符串更加有效,但是java中不可变的字符串有一个有点:字符串共享。

         这要提到一个观点,java设计师认为共享带来的效率提高远远大于提取,拼接字符串所带来的低效率。

         作为从c转过来的程序员来说,这就仁者见仁智者见智,但不可否认在某些情况下这是正确的。

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


0 0
原创粉丝点击