1、常用方法
1-1 字符串构造
-> 使用常量字符串构造;
-> 直接new String 对象;
-> 借助字符数组进行构造;
-> String是引用类型,内部并不存储字符串本身;
-> 用双引号" "括起来的,也是String类型的对象;
1-2 String对象的比较
(1) ==的使用作用不同:
对于基本数据类型,==比较的是变量中的值是否相等;
对于引用数据类型,==比较的是引用中的地址,即两个变量引用的是否为同一个对象。
(2)equals()方法:
字符串中逐个字符进行大小比较【按照字母顺序】,返回true/false
(3)compareTo()方法:
如果出现不相等的字符,返回两个字符大小的差值,返回int类型;
如果前n个字符相等(n为两个比较的字符串的最小长度),则返回两字符串长度的差值。
(4)compareToIngoreCase()方法:
与compareTo()方法一致,但是忽略大小写变化。
1-3 字符串的查找
-> char charAt(int i): 返回 i 位置的字符;
-> int indexOf(char ch): 返回 ch第一次出现的位置;
~ ~ ~
1-4 字符串之间的转换
(1)数值与字符串转换
valueOf()
eg1:数字转字符串
eg2:字符串转数字
parseInt/parseDouble :将字符串解析为数值
(2)大小写转换
并不改变字符串本身的大小写,而是产生了一个新的对象。
toUpperCase,toLowerCase
(3)字符串转数组
toCharArray()
(4)格式化
String.format();
(5)字符串替换
replace();replaceAll(); replaceFirst()
由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.
(6)字符串拆分
split()
-> 字符 "|","*","+"都需要加上转义字符,即在前面加 \\;
-> 如果要按"\"进行切分,必须写成" \\\\";
-> 如果一个字符串有多个分隔符,可用" | "作为连字符
(7)字符串截取
String substring(int beginIndex)
2、字符串常量池(StringTable)
当第二次存储该字符串时,先会去常量池检查是否存在该字符串,有则返回,没有则创建。这样就不会频繁的创建对象,节省时间。
程序运行速度也会更快,节省内存。
(1) 使用字符串常量进行赋值
加载字节码文件时,“hello”字符串已经创建好并保存在常量池中。
当用如下方法创建String对象时,在常量池中找到了,就把字符串的引用赋给s1,s2对象。
(2) 通过new创建String类对象
new的对象,均是唯一的。
3、字符串的不可变性
-> 优点:方便实现字符串对象池。如果是可变的话,就得考虑写实拷贝的问题;不可变对象是线程安全的;不可变对象方便缓存hashcode,作为 key 时可以更高效的保存到 HashMap 中。
-> 用final修饰类,表示类不能被继承了;
用final修饰引用类型,表明该引用变量不能引用其他对象,但是其引用对象中的内容可以修改。
4、字符串修改
所有的修改都会创建新的对象,效率低下。
4-1 StringBuilder和StringBuffer
-> StringBuffer是线程安全的,StringBuilder不是。但两者作用类似。
4-2 String,StringBuilder和StringBuffer的区别
(1)String的内容不能修改,但是StringBuilder,StringBuffer内容可以修改
(2)StringBuilder,StringBuffer大部分功能相似
(3)StringBuffer采用同步处理,属于线程安全操作