java.lang.String使用的final修饰,不能被继承
字符串底层封装了字符数组以及针对字符数组的操作算法
Java字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的编码
字符串一旦创建,对象内容永远无法改变,但字符串引用可以重新赋值
String s1 = "123abc"; String s2 = "123abc"; System.out.println(s1==s2); //true,s1与s2地址相同 s1 = s1+"!"; //创建新对象并把地址赋值给s1 System.out.println(s1==s2); //false,s1为新的对象的地址,与s2不同了
常量池:
java对字符串有一个优化措施:字符串常量池(堆中)
java推荐我们使用字面量/直接量的方式来创建字符串,并且会缓存所有以字面量形式创建的字符串对象到常量池中,当使用相同字面量再次创建字符串时会重用对象以减少内存开销,避免内存中堆积大量内容相同的字符串对象
String s1 = "123abc"; //常量池还没有,因此创建该字符串对象,并存入常量池 String s2 = "123abc"; //常量池已有了,直接重用对象 String s3 = "123abc"; //常量池已有了,直接重用对象 //引用类型==,比较地址是否相同 System.out.println(s1==s2); //true System.out.println(s1==s3); //true System.out.println(s2==s3); //true
常见面试题:String s = new String("hello");
问:创建了几个对象?
答:2个
第一个:字面量"hello"
---java会创建一个String对象表示字面量"hello",并将其存入常量池
第二个:new String()
---new String()时会再创建一个字符串,并引用hello字符串的内容String s1 = new String("hello"); //s1装的是new String()对象的地址 String s2 = "hello"; //s2装的是字面量"hello"的地址 System.out.println("s1:"+s1); //hello System.out.println("s2:"+s2); //hello System.out.println(s1==s2); //false,因为s1与s2的地址不同 //字符串实际开发中比较相等的需求都是比较字符串的内容 //因此我们应该使用字符串提供的equals()方法来比较两个字符串的内容 System.out.println(s1.equals(s2)); //true,因为s1与s2的内容相同
编译器编译特点编译器在编译时,若发现一个计算表达式可以在编译期间确定结果,则直接运算好并将结果保存到表达式中
//如下代码:常量池中会有3个存储,一个是123abc的地址,一个是123的地址,一个是abc的地址 //一个新的对象,它的值也是123abc String s1 = "123abc"; //编译器在编译时,若发现一个计算表达式可以在编译期间确定结果, //则直接运算好并将结果保存到表达式中 相当于String s2 = "123abc"; String s2 = "123"+"abc"; System.out.println(s1==s2); //true,s1与s2共用常量池中的 String s3 = "123"; //当字符串拼接产生的内容与常量池是某内容相同时,也不会重用常量池的对象 String s4 = s3+"abc"; //创建一个新的对象存储123abc System.out.println(s4==s1); //false
- String常用方法:
- length():获取字符串的长度(字符个数)
String str = "我爱Java!"; int len = str.length(); //获取str的长度 System.out.println(len); //String底层数组长度7
- trim():去除当前字符串两边的空白字符
String str = " hello world "; System.out.println(str); // hello world str = str.trim(); //去除当前字符串两边的空白字符 System.out.println(str); //hello world
-
indexOf(String str):检索给定字符串在当前字符串的开始位置
lastIndexOf(String str): 检索给定字符串在当前字符串中最后一次出现的位置
String str = "thinking in java"; int index = str.indexOf("in"); //检索in在字符串str中出现的开始位置 System.out.println(index); //2 index = str.indexOf("IN"); //当前字符串不包含给定内容IN,所以返回-1 System.out.println(index); //-1 index = str.indexOf("in",3); //从第4个字符开始找in第一次出现的位置 System.out.println(index); //5 index = str.lastIndexOf("in"); //找in最后一次出现的位置 System.out.println(index); //9 -
substring(int start,int end):截取当前字符串中指定范围内的字符串(含头不含尾--包含start,但不包含end)
String str = "www.baidu.cn"; String name = str.substring(4,9); //截取第4个到第7个----下标 System.out.println(name); //baidu name = str.substring(4); //从第4个一直截取到字符串末尾----下标 System.out.println(name); //baidu.cn
-
charAt():返回当前字符串指定位置上的字符
String str = "thinking in java"; char c = str.charAt(9); //获取位置9所对应的字符 System.out.println(c); //i
-
startsWith(String str)和endsWith(String str):判断当前字符串是否是以给定的字符串开始/结尾的
String str = "thinking in java"; boolean starts = str.startsWith("think"); //判断str是否是以think开头的 System.out.println("starts:"+starts); //true boolean ends = str.endsWith(".png"); //判断str是否是以.png结尾的 System.out.println("ends:"+ends); //false -
toUpperCase()和toLowerCase():将当前字符串中的英文部分转为全大写/全小写
String str = "我爱Java!"; String upper = str.toUpperCase(); //将str中英文部分转为全大写 System.out.println(upper); //我爱JAVA! String lower = str.toLowerCase(); //将str中英文部分转为全小写 System.out.println(lower); //我爱java!
- length():获取字符串的长度(字符个数)
- 正则表达式
经常用于检测字符串是否符合特定的规则,在网站上经常用于检测用户输入数据是否符合规范
boolean matchs(正则) 检测当前字符串是否符合正则规则
//定义正则表达式 String rule = "HelloWorld"; //定义被检测的字符串 String s1 = "HelloKitty"; String s2 = "HelloWorld"; //检测 s1 是否符合规则 boolean b1 = s1.matches(rule); //检测 s2 是否符合规则 boolean b2 = s2.matches(rule); System.out.println(b1); System.out.println(b2);
单个在Java中有特殊的含义,表示转义符号,不认为是一个斜杠,所以如果想要表示斜杠,需要在它的前面加一个用来转义的,也就是 \ 才表示成一个单纯的斜杠, t 制表符 r回车符 n换行符
StringBuilder
StringBuilder 用于提升String字符串的连接性
StringBuilder称为可变字符串
StringBuilder内部也是字符数组, 其API可以直接修改其内部数组的内容
当数组容量不足时候, 会自动扩容
运算期间会尽力减少创建数组的数量。
append() 追加, 在StringBuilder的后面添加字符,当容量满了,会自动扩容, 扩容规则 1倍+2;
insert(位置,字符) 插入字符;
delete(开始位置, 结束位置): 删除一定范围的字符,包括开始,不包括结束
StringBuilder的API返回的大多是当前对象,可以连续使用.调用方法。
toString() 方法可以将StringBuilder转换为String
buf-> char[]{A, C, B, 0, 0, 0, 0, 0, 0, 0, 0...0}
// 0 1 2 3 4 5
StringBuilder buf = new StringBuilder();
buf.append("A")
.append("A")
.append("A")
.append("B")
.insert(1,"C")
.delete(2,4);
Stirng str = buf.toString();
System.currentTimelillis()
long now = System.currentTimelillis(); system.out.println(now);



