一、java.lang.String 类
1.String类的两种实例化方式
(1)直接赋值 - 在堆上分配空间,自动入池
eg:String str = "Hello";
(2)通过构造方法实例化String 类对象,手动入池
eg:String str = new String("Hello");
对象入池 - 手动入池方法
public native String intern() // 对象方法
在JVM底层会自动维护一个字符串的对象池,如果采用直接赋值的形式进行String 对象实例化,该对象会自动保存在这个对象池中。如果下次继续使用直接赋值的形式声明String对象,此时对象池中若有指定内容,则直接引用;如果没有,则开辟新的堆空间将其保存在对象池中供下次使用。
public class Work{
public static void main(String[] args){
String str1 = "hello";
String str2 = "hello";
String str3 = "hello";
System.out.println(str1 == str2);
System.out.println(str2 == str3);
System.out.println(str1 == str3);
}
}
输出结果为:
true
true
true
2.字符串相等比较
public boolean equals(String anotherString) // 成员方法
eg:str1.equals(str2); // 比较str1 和str2 的内容是否相等
String 类是引用数据类型,所以str 里存的是开辟的空间的地址,==比较的是地址。
字符串常量是String类的匿名对象,不可变更 - 字符串一旦定义后不可改变。
当String类变量和字符串常量比较时,一定要将字符串常量写在前面,避免出现NullPointerException异常。
例如:推荐使用“Hello”.equals(str);
因为如果str = null 时,str.equals("Hello"); 会出现异常,导致程序崩溃。
3.字符与字符串之间的相互转化
(1)字符数组 -> String(通过构造方法)
public String(char[] value) // 将整个字符数组转换为字符串
public String(char[] value, int offset, int count) // 从指定位置offset处开始的count个字符转换为字符串
(2)将字符串转换为单个字符
public char charAt(int index) // 取指定位置index处的字符
(3)将字符串转换为字符数组
public char[] toCharArray() // 通过String对象调用
//判断一个字符串中是否由数字组成
public static boolean isNumber(String str){
char[] data = str.toCharArray();
for(int i=0; i<data.length; i++){
System.out.println(data[i]);
if(data[i]<'0' || data[i]>'9'){
return false;
}
}
return true;
}
4.字节(byte)与字符串
(1)byte[ ] -> String(通过构造方法)
public String(byte[] value) // 将整个字节数组转换为字符串
public String(byte[] value, int offset, int count) // 从指定位置offset处开始的count个字节转换为字符串
(2)String -> byte[ ]
public byte[] getBytes() // 通过String对象调用
(3)将字符串按照指定编码转为字节数据
public byte[] getBytes(String charsetName) // charsetName为指定编码格式
5.字符串比较
(1)不区分大小写相等比较
public boolean equalsIgnoreCase(String anotherString) // 通过String对象调用
(2)比较两个字符串大小
public int compareTo(String anotherString) // 通过String对象调用
/**
(1)返回值 > 0 :表示当前对象大于比较对象(anotherString)
(2)返回值 = 0 :表示当前对象等于比较对象
(3)返回值 < 0 :表示当前对象小于比较对象
*/
6.字符串查找
(1)判断一个字符是否存在
public boolean contains(String str)
(2)判断是否以指定字符开始
public boolean startsWith(String str)
(3)判断是否以指定字符结束
public boolean endsWith(String str)
(4)从指定位置开始判断是否以指定字符开始
public boolean startsWith(String str, int index)
7.字符串替换
(1)替换全部指定内容
public String replaceAll(String regex, String replacement) // 用replacement替换regex
(2)替换首个内容
public String replaceFrist(String regex, String replacement)
8.字符串拆分
(1)将字符串按照指定格式全部拆分(转译)
public String[] split(String regex)
(2)将字符串部分拆分,数组长度为limit
public String[] split(String regex, int limit)
9.字符串截取
(1)从指定位置截取到结尾
public String substring(int beginIndex)
(2)从指定位置截取到指定位置 - [ ) 左闭右开
public String substring(int beginIndex, int endIndex)
10.String 类的其他方法
(1)去掉字符串中的左右空格,中间的保留
public String trim()
(2)字符串大小写转换 - 全部转换
public String toUpperCase() // 转大写
public String toLowerCase() // 转小写
//让一个字符串首字母大写
public static String firstCase(String str){
return str.substring(0,1).toUpperCase() + str.substring(1);
}
(3)取得字符串长度
public int length()
(4)判断字符串是否为空 - 只能判断字符串是否为空,而不是null
public boolean isEmpty()
// 完整判断字符串为空的方法:if(str == null || str.isEmpty())
11.两个SB类 - 方便进行字符串的修改
在java.lang 包里(基础包,自动导入)
StringBuffer 类、StringBuilder 类
(1)字符串修改
public StringBuffer append(各种数据类型)
(2)与String 的相互转化
// String -> StringBuffer:调用StringBuffer的构造方法或者append()方法
StringBuffer.toString() // StringBuffer -> String
public StringBuffer reverse() // 字符串反转
(3)删除指定范围的数据
public StringBuffer delete(int start, int end)
(4)插入数据
public StringBuffer insret(int offset, 各种数据类型) //offset为要插入的开始位置
(5)String 和两只SB的区别
- String 的内容不可修改,而两只SB可以修改内容(append)
- StringBuffer 采用同步处理,线程安全,效率较低;StringBuilder 采用异步处理,线程不安全,效率较高。
String 的 “+” 操作底层转换为StringBuilder 的 append 操作。