String(引用数据类型)
String对象一经创建就不会发生变化(在常量池里),即便是赋予新的值,也不是在原来的基础上改变,而是创建一个新的字符串对象,将引用指向这个对象,会造成空间的浪费;
String str1="abc"; 字符串 abc存在于常量池 , str1="sss"; 给str1赋予新的sss值,意味着在常量池增加了一个字符串sss,对原来的字符串abc并无影响;str1只是引用,str1由原来指向常量池中abc的地址转为指向常量池中sss的地址;
String的常用方法:
charAt(int index):根据索引返回对应的值;indexOf(String st):找st第一次在字符串中出现的位置;
length():返回字符串的长度;replace( char oldstr, char newstr)//replace( String oldstr, String newstr):将字符串中oldstr用newstr代替;
split():根据某个符号将字符串进行分割;substring(int beginindex,int endindex)//substring(int beginindex):返回一个子串,
trim():返回一个字符串,去掉前导和尾随空格; concat(String str):将指定的字符串拼接到字符串的末尾;
compareTo(String anotherstring):按字典顺序比较两个字符串;toString():返回的是一个字符串;
equals()方法比较的是字符串内容;endWith(String suffix):测试此字符串是否以指定的后缀结尾。
lastindexOf(String str)返回指定子字符串最后一次出现的字符串中的索引。
StringBuffer创建一个对象,是在同一个实例的基础上做改变,对字符操作效率高;
线程同步,线程安全效率低;
StringBuilder:线程不安全,并发操作,效率高;
单线程的情况使用StringBuilder比较好,多线程使用使用StringBuilder 加锁,也可以直接使用StringBuffer;
相对String,StringBuffer与StringBuilder另外独有的方法:
append(String str):将字符串加入到序列中;capacity();返回当前的容量;
delete(int start,int end):删除指定位置的字符串;delete(int index):删除指定的索引对应的字符;
reverse():导致序列被序列的相反代替;replace(int satr,int end,String str):用字符串代替指定位置的字符串;
insert(int s,String str):将字符串插入指定序列中
equals():默认比较的是内存地址,如比较内容需要重写equals;
两个等号(==):
基本数据类型:比较内容,引用数据类型:比较地址
String str1="";与String str2=null;的区别:
String str1="' 创建了一个长度为0的字符串,并且为其分配了内存空间;
String str2=null 声明了一个str2对象的引用,但是系统并没分配内存空间;
String st=new String("abc");在内存中有两个对象,堆区有一个new String,常量池有一个字符串;
过多关于String StringBuffer StringBuilder 的知识,看API,以及源代码进一步了解;