1.java.lang.String类型的基本性质:
①String表示字符串类型,属于引用数据类型,不属于基本数据类型;
②在java中用双引号括起来的都是String对象;
③java中规定,双引号括起来的字符串是不可变的,也就是说"abc"自出生到最终死亡,不可
变,不能变成"abcd",也不能编程"ab";
④在JDK当作把双引号括起来的字符串直接存储在"方法区"的"字符串常量池"当中的。
为什么要这样做?因为字符串在时机的开发中使用太频繁,为了执行效率,所以把字符
串放到了方法区的字符串常量池当中。
以下代码会产生"abcdef"、"xy"、"abcdefxy"三个字符串对象。
⑤String类型的对象也可以使用new关键字来创建对象:
String s3 = new String("xy");
注意:new对象的时候一定会在堆内存中开辟空间,而这个空间内保存的就是该字符串
对象在字符串常量池中的内存地址。
看以下程序段:
2.一个小问题:
3.String类的构造方法、常用方法等查阅JavaAPI帮助手册即可。
4.注意:判断数组长度和字符串长度不一样。
数组长度是length属性。
字符串长度是length()方法。
5.String中只有一个方法是静态的,不需要new对象。
valueOf():将非字符串转换成字符串。如果传入的是一个对象,则会调用该对象的toString方
法,并返回调用该方法后的字符串。
6.我们在实际开发中,如果需要进行字符串的频繁拼接(利用+加号),会有什么问题?
因为java中的字符串是不可变的,每一次拼接都会产生新字符串,这样会占用大量的方法区内
存,造成内存空间的浪费。
如果以后需要进行大量字符串的拼接操作,建议使用JDK中自带的:
java.lang.StringBuffer:底层实际上是一个byte[]数组,往StringBuffer中放字符串,实际上
是放到byte[]数组当中了。StringBuffer的初始容量是16。拼接字符串时调用append()方法即
可,append()方法底层在进行追加的时候,如果byte[]数组满了,会自动扩容,底层调用的就是
System.arraycopy()方法。String中的底层也是一个byte[]数组,但是该数组被final修饰,因
此不可变(并且被final修饰的引用一旦指向某个对象之后,不可再指向其他对象)。
如何继续优化StringBuffer的性能?
在创建StringBuffer对象的时候尽可能给定一个初始化容量,最好减少底层数组的扩
容次数,预估计一下,给一个大一些的初始化容量。
java.lang.StringBuilder:初始化容量也是16.
StringBuffer和StringBuilder的区别?
StringBuffer中的方法都有synchronized关键字修饰,因此StringBuffer在多线程环境下运
行是安全的;而StringBuilder中的方法都没有synchronized关键字修饰,因此StringBuffer
在多线程环境下运行是不安全的。即StringBuffer是线程安全的,StringBuilder是非线程
安全的。
PS:根据动力节点课程整理,如有侵权,联系删除。