String系列
看到网上有关于这方面的博客,讲的也都不错,不过还是想自己写下来,一来加深印象,二来梳理出来自己的对String系列知识的理解。
首先,需要先将这一系列的类列出来:String、StringBuilder、StringBuffer。
其次,将之分类:String和StringBuilder、StringBuffer。
为什么这样分呢?
这是因为,String,是不可变字符串,而后两者都是可变的,就像其他对象一样,可以更改,可以操作。
如果你不知道什么叫不可变字符串,那就看下面这一段:
一般来讲,我们都希望自己的字符串是不可变的,所以我们就有了String类。当我们String str = "ABC";的时候,这句话就相当于new出来了一个str(引用对象),又new出来一块内存区域,即“ABC”那个字符串对象。当我们str = str + "D";时,就相当于又分配出来一块内存区域,存放“ABCD”这个字符串对象,并将str这个引用指向新的内存区域,也就是说,那块存放“ABC”的内存就相当于没有引用指向它了,就成了没人要的垃圾,谁也找不到它了。
因为java不像C++,java的指针被称为安全指针。即,我们只能对其进行创建和复制。不能更改,无法操作。所以,那个“ABC”的内存就只能等着垃圾回收器来回收了。
到此,什么叫不可变字符串,已经理清楚了。
那可变字符串就一目了然了。即,当我们StringBuilder sb = "XY";sb = sb + "Z";时,我们只有一个字符串对象“XYZ”。也就是说,我们是通过str这个引用来操作存放“XY”的那块内存的值,而不是重新生成了一个字符串对象。这样在字符串经常变动的情况下,比Sting产生的对象要少得多得多,回收垃圾的时候自然也会少很多,当然执行效率就高咯。
比较完String和StringBuilder、StringBuffer,又一个问题又出来了:StringBuilder和StringBuffer的区别是什么呢?
这就牵扯到线程安全的问题了。
StringBuilder是非线程安全类。
posted on 2016-07-01 17:49 LinKing1993 阅读(163) 评论(0) 收藏 举报
浙公网安备 33010602011771号