String
不可变性
给字符串赋值时,并没有修改数据而是重新开辟一个空间
String name = "hello";//"hello"常量存储在字符串池中
name = "zhangsan";//"zhangsan"赋值给name
这里hello如果没人用就成为了垃圾了
此时又把zhangsan赋给另一个栈里的字符串的话,程序会先在字符串池中找有无zhangsan,如果有就不再开辟空间直接让name2指向zhangsan
String name = "hello";//"hello"常量存储在字符串池中
name = "zhangsan";//"zhangsan"赋值给name
String name2 = "zhangsan";
共享:
另一种创建方式
String str = new String("java");
这种方式堆立马会有一个对象,字符串池里面也会有一个“java”
字符串常用方法
System.out.println(str.length());//返回字符串长度
System.out.println(str.charAt(3));//返回某个位置的字符,第一个算0!和数组一样
System.out.println(str.contains("jc"));//判断是否包含有某个字符串
结果:
4
a
false
System.out.println(str.indexOf("av"));//某字符串首次出现的位置
System.out.println(str.indexOf("a",2));//从第几个字符(含本身)开始找
System.out.println(str.lastIndexOf("a"));//某字符串最后一次出现的位置
结果:
1
3
3
字符串案例
public class Demo04 {
/* "this is a text
1.将每个单词提取出来
3.text前面插入easy
*/
public static void main(String[] args) {
String str = "this is a text";
String[] s = str.split(" ");//通过空格分隔
//不能直接打印数组
for (int i=0;i< s.length;i++) {
System.out.println(s[i]);
}
String str2 = str.replace("text","easy text");
System.out.println(str2);
}
}
可变字符串
- StringBuffer:可变长字符串,运行效率慢,线程安全
- StringBuilder:可变长字符串,运行效率快,线程不安全
- 和String区别:1.效率更高2.节省内存
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//append,追加,在后面加
sb.append("java世界第一");
System.out.println(sb.toString());
sb.append("java真香");
System.out.println(sb.toString());
sb.append("java不错");
//insert,在想要的位置前面加
sb.insert(0,"我在最前面");
System.out.println(sb.toString());
//replace,替换,可以输入开始位置和结束位置,含头不含尾,结束位置不会换
sb.replace(0,5,"hello");
System.out.println(sb.toString());
//delete,删除
sb.delete(0,5);
System.out.println(sb.toString());
}
结果:
java世界第一
java世界第一java真香
我在最前面java世界第一java真香java不错
hellojava世界第一java真香java不错
java世界第一java真香java不错