字符串本质是char[]类型的数组。
分类
- 不可变字符串String:定义好之后不能再修改,要修改只能创建新的内存地址
- 可变字符串:定义好之后还可以进行修改,改变时不会创建新的地址。
可变字符串有StringBuilder和StringBuffer。String、StringBuilder和StringBuffer都实现了CharSequence接口。
String创建
- 直接赋值
String str = "lala";
要么创建一个对象,要么不创建;
会先到常量池中看一下有没有存在该字符串常量,如果已经有了,就直接使用,不会创建新的地址;如果常量池中没有,就会在常量池中创建一个对象。 - 通过构造器来创建
String str2 = new String("lala");
至少要创建一个对象,因为使用了new必然要在堆中创建一个对象。
创建时在常量池中查找有没有传入的字符串常量,如果没有,创建一个字符串常量放到常量池中。
字符串对象值为空
- 表示引用为空,
String str = null;
还没有初始化,没有被分配内存空间。 - 表示空字符串,
String str = "";
已经创建了对象,已经分配了内存,内容为空。
字符串的比较
比较两个字符串相不相等
- == 比较两个字符串地址是否相等
- 使用equals(),它的逻辑是先比较两个字符串地址是否相等,若相等则字符串相等;若不相等,则判断该变量是否为字符串类型变量,若是再逐个字符比较。
(建议子类根据自己的需求去覆盖equals方法)
字符串编译优化
凡是单独使用""引用起来的,都是直接量,在编译时期就已经确定好了。
String str = "ABCD";
String str = "A"+"B"+"C"+"D";
String str = "AB"+"CD";
编译之后都是String str = "ABCD";
字符串常用方法
- char数组转换成字符串
char[] cs = new char[]{'A','B','C'};
String str = new String(cs);
- 字符串转换成char类型数组
char[] cs2 = str.toCharArray();
- 获取字符串中的信息
String str2 = "ialxh";
//返回字符串长度
System.out.println(str2.length());
//获取字符串当中的某一个字符
System.out.println(str2.charAt(2));
//返回一个子字符串在字符串第一次出现中的位置
String str3 = "ABCDEFCDG";
String str4 = "CD";
System.out.println(str3.indexOf(str4));
//返回一个子字符串在字符串最后一次出现中的位置
System.out.println(str3.lastIndexOf(str4));
- 大小写转换
//小写字母转换成大写
str.toUpperCase();
//大写字母转换成小写
str.toLowerCase();
- 忽略大小写判等
str4.equalsIgnoreCase(str5);
- 字符串截取
//字符串分割
String fileNames = "abc.java;hello.myxq;hello.txt.java;hello.class";
String[] res = fileNames.split(";");
System.out.println(Arrays.toString(res));
//判断每一个元素是否以hello开头
//遍历数组
for(String name : res){
//System.out.println(name);
//是否以hello开头
//判断字符串是否以指定字符串开头
if(name.startsWith("hello")){
//从最后一个点. 获取最后一个点的位置
int index = name.lastIndexOf(".");
//截取字符串
String newName = name.substring(index);
System.out.println(name);
}
}
- 把一个单词的首字母变成大写
String name = "mashroom";
//1.获取第一个字母
String res = name.substring(0,1);
//2.把获取的第一个字母变成大写
res = res.toUpperCase();
//3.获取除第一个字母的后面所有内容
String lastString = name.substring(1);
//4.把大写字母与其拼接
System.out.println(res+lastString);
- 去掉字符串中的空格
//去空格
//1.去掉首尾的空格
String s = " mash room ";
s = s.trim();//去掉首尾的空格
//2.去掉所有的空格
s = s.replace(" ","");//用一个新字符去代替老字符
String str1 = "";
String str2 = null;
String str3 = " ";
if(str3 != null && !"".equals(str3)){
System.out.println("不为空");
}else{
System.out.println("为空");
}
字符串拼接耗时
String > StringBuffer > StringBuilder
StringBuilder : 没有synchronized,效率更高
StringBuffer : 方法前面多了synchronized,加锁,更安全,效率相对低一些