字符串函数:
String:
Public class TestString1{
Publicstatic void main(String[] args){
String name=”hello world”;//只创建了一个对象,”helloworld”只是作为常量存放在堆中
String s1=new String(“helloworld”);//创建了两个对象,一个引用对象一个string对象
String s2=” hello world ”;
Int x=name.length();//返回字符串的长度,也就是13
Char c=name.charAt(0);//返回字符串下标为0的字符,也就是h
String s=name.substring(5);//求子串,返回空格+world
String ss=name.substring(5,8);//求子串,返回空格+wo
String sss=name.trim();//去除掉左右两边的空格,不去除中间的空格
StringBuffer sb1=newStringBuffer(“hello world”);
Sb1.append(“ hello”);//增加字符串 hello
System,out,println(sb1);//输出helloworld hello
}
}
Final:最终类,不能被继承
StringBuffer 和 Stringbuilder:sring为字符串常量,而stringbuilder和stringbuffer均为字符串变量,即string对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的,例:
String str=”abc”;
System.out.println(str);
Str=str+”de”;
System,out.println(str);
这段代码会先输入“abc”,然后输入“abcde”,好像是把str给更改了,其实只是一种假象罢了,jvm对于这几行代码是这样处理的,首先创建一个string对象str,并把“abc”赋值给str,然后在第三行中,JVM又创建了一个新的对象也名为str,然后把原来的str的值和de加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制给回收掉了,所以str实际上并没有被更改,也就是说string对象一旦创建之后就不可更改了,所以java中对string对象操作实际上就是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢
而stringbuilder和stringbuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收操作,所以速度比string快很多
所以运行速度:stringbuilder>Stringbuffer>string
在线程安全上,Stringbuilder是线程不安全的,而stringbuffer是线程安全的
如果一个stringbuffer对象在字符串缓冲区被多个线程使用时,stringbuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但是stringbuilder的方法是没有该关键字,所以不能保证线程安全,有可能出现一些错误的操作,如果要进行的操作是多线程的,那么就要使用stringbuffer,但是在单线程的情况下,还是建议使用速度比较快的stringbuilder
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况