Java.lang->String
- java的字符串是常量,它的值在创建后不能修改(字符串里的元素不能修改);
- 不能用String[索引]的形式来取得对应索引处的元素值
- 初始化,
String s="hello world"
等价于char data[] = {'h', 'e', 'l','l','o',' ','w','o','r','l','d'};
,然后String s = new String(data);
;
StringBuilder、StringBuffer、String区别
- String一旦创建不可变,不可进行修改;而StringBuilder、StirngBuffer可变长,可修改,通过
setCharAt()
方法; - 因为StringBuilder线程不安全的性质,适合单线程使用,效率高;StringBuffer提供线程安全支持,适合多线程;
Object.toString()
这种形式的返回值并不像我们通常以为的那样,而是一个带有对象字符串hashcode(后面会专门记录hashcode的知识)的字符串形式,即对象的字符串表示形式,反正就不是返回转换后字符串的本身;
所以,没有特殊需求,做题的时候还是不要用这种,用Arrays.toString()
这种;
示例:
Arrays.toString(数组)
Arrays类包含用来操作数组(排序、搜索、转换等)各种方法,可以把数组当作列表的静态工厂;
以Arrays.toString(char[] a)
为例,它的实例输出如下:
就是以一种这样的形式[字符数组元素1,字符数组元素2,......]
输出,源码的确差不多这样:
逻辑很清楚,上面判断就不说了,下面则是以StringBuilder.toString()
的形式返回的,那么这不就是Object.toString()
的形式吗,为什么会输出字符串而不是之前的带有hashcode的东西?
看看JDK中关于StringBuilder.toString()
的介绍:
相当于对toString
方法进行了重写(所有对象都是Object的子类,子类对父类方法重写);
果然,但这里的value和count是什么意思,我看了StringBuilder源码里面没有关于它俩的说明,想到这应该是父类的东西,value代表字符数组,count应该是要copy的个数,意思是从索引0开始copy value,共copy count个元素;
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
取AbstractStringBuilder看看:
的确是这样,count是字符数组使用了的字符个数,而不是分配的空间大小;
所以StringBuilder的toString()方法和普通Object的toString()方法不一样的,前者重新new了一个字符串,后者返回object的带有hashcode的字符串!
示例:
new String()
这个其实也可以不说的,但是还是记录下;
就是当我想在函数中返回一个字符串,Object.toString()肯定用不了,可以用Arrays.toString(数组);还一种方式就是直接new一个字符串,本质应该是一样的:
反正Arrays.toString()的本质也是构建StringBuilder,然后通过StringBuilder.toString()实现,都要新new处一块内存用于存放数组内容;