Java的字符串类
字符串类的特点
- 一致性:在任何系统平台都保证字符串本身以及对字符串的操作是一致性的。
- 健壮性:可以自动捕获异常。
- 不可派生性:都被声明为final类,不能派生子类,以防用户修改其功能。
String类
String类的基本方法
(1)toUpperCase: 字母变大写
(2)toLowerCase: 字母变小写
(3)toCharArray: 变字符数组(还有getBytes()方法)
(4)charAt: 获取某个字符
(5)subString: 字符串的截取
(6)split: 字符串的分割
(7)replace:替换
(8)match:匹配测试
(9)replaceAll :全替换
(10) indexOf: 字符所在字符串的位置(下标值)(第一个)
(11)copyValueof():数组复制到字符串
(12)equals():字符串的比较,返回boolean值
(13)compareTo():字符串的比较,返回整形数
(14)length():获取字符串的长度
(15)concat():字符串连接,如"to".concat(“get”).concat(“her”)返回"together"
(16)Valueof():转换为字符串
/**
* String
*/
public static void method01(){
String str="safgwe5452df1g45e2s4f5";
//截取 subString
System.out.println(str.substring(3,7));
System.out.println(str.substring(3));
//分割 split
String[] ss=str.split("f");
System.out.println(Arrays.toString(ss));
//替换 replace
System.out.println(str.replace('f','F'));//替换字符
System.out.println(str.replace("fg","abcd"));//替换字符串
//字符所在下标indexOf 不存在返回-1,存在返回下标值
System.out.println(str.indexOf('f'));//第一个
System.out.println(str.lastIndexOf('f'));//最后一个
System.out.println(str.indexOf('f',2));
int index=str.indexOf("f")+1;
System.out.println(index+(str.substring(index).indexOf("f")));
//包含 contains
System.out.println(str.contains("A"));
}
String类的不可变性
1、不可变性
- String类是一个用final修饰的类,表示它是一个最终类,不可以被任何子类继承,同时也是不可改变的。
我们来看一下下面的例子:
public static void method02(){
String str1 = "Are you ";
str1 = str1 + "study";
str1 += "?";
System.out.println(str1);
}
这个例子中str1的值改变了,那他与上面所说的不可变矛盾了吗?其实并没有,当一个旧的字符串再次赋值时,它并没有在原来的内存地址上修改里面的数据,而是重新创建一个新的对象,产生新的地址,str变量只是String对象的一个引用,并不是对象的本身。对象在内存中是一块内存块,它的成员变量越多,这块内存区占的空间就越大。
- str是一个4个字节的数据,里面存放着它所指向的对象的地址,通过这个地址可以访问这个对象。
扩展
String类型的变量占用内存的4个字节,但用getBytes()计算的话,一个字母或者数字的长度为1,一个中文长度为3个字节,但是char类型占用内存2个字节,但也就可以存储一个中文字符,(至于为为什么我也不懂),另外在时vs2012中28个字节,G++中编译为4个字节,具体可以点击这里了解其他博主的测试 - str指向了最新生成的实例对象,之前存在的对象仍然存在,如果没有再次被引用,则会被垃圾回收机制回收
总结:
不可变类只是它的实例不能被修改的类,String类给str重新赋值 的仅仅是改变它的引用而已,并没有改变它原来地址上面的的值。
StringBuffer类与StringBuilder类
String ,StingBuffer,StringBuilder的区别:
String :是一个final类
StringBuffer: 可变长度且线程安全的字符序列,性能上效率低,但是安全
(有线程安全锁(synchronized))
StringBuilder:可变长度且非线程安全的字符序列,性能效率高,安全性低
(没有线程安全锁(synchronized))
StringBuffer 与StringBuilder的方法基本相同
/**
* 并不是直接修改String 的值,
* 而是创建一个新的String覆盖原来的String
*/
public static void method02(){
String a="1";
a="123";
System.out.println("a="+a);
StringBuffer sb=new StringBuffer("");
sb.append("abc").append("asf");//追加
sb.insert(1,"_");//插入
sb.append("你好吗");
sb.deleteCharAt(4);//删除一个字符
sb.delete(3,5);
sb.reverse();//翻转
System.out.println("sb="+sb.toString());
}
}