String类
字符串是一个特殊的对象
字符串一旦初始化就不可以被改变
String str = "abc"
; 和String str1 = new String("abc")
有什么区别?
package lesson14;
public class test1 {
public static void main(String args[]){
/*
String类的特点:字符串对象一旦初始化就不会被改变。
* */
String s = "abc";
String s1 = "abc";
System.out.println(s1==s);
}
}
<<<
true
比较的是两个变量的目标地址,为什么结果是相同呢?
因为abc存储在字符串常量池中,如果没有该值就创建,如果有的话就引用。
字符串定义的第一种方式
package lesson14;
public class test1 {
public static void main(String args[]){
/*
String类的特点:字符串对象一旦初始化就不会被改变。
* */
String s = "abc";
String s1 = new String("abc");
System.out.println(s==s1);
System.out.println(s.equals(s1));
}
}
<<<
false
true
为什么是true呢?
因为String类复写了Object中的equals,直接比较字符串对象的值是否相同。
Object中的equals方法是比较地址值。
package lesson14;
public class test1 {
public static void main(String args[]){
byte [] t = {65,66,'3','4'};
String r = new String(t);
System.out.println(r);
}
}
<<<
AB34
会根据acill码表来查询数字对应的字节
可以把字节数组变成字符串
也可以把字符数组变成字符串
也可以根据字符数组的一部分变成字符串
- 获取
获取字符串的一部分内容(子串)
转换函数
- 将字符串变成字符串数字(切割)
package lesson14;
public class test1 {
public static void main(String args[]){
String s = "a,b,c";
String arr [] = s.split(",");
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
}
<<<
a
b
c
该函数支持正则表达式
2. 将字符串变成字符数组
package lesson14;
public class test1 {
public static void main(String args[]){
String s = "a,b,c";
char arr [] = s.toCharArray();
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
}
<<<
a
,
b
,
c
- 变成字节数组
package lesson14;
public class test1 {
public static void main(String args[]){
String s = "a,b,c";
byte arr [] = s.getBytes();
for (int i = 0; i <arr.length ; i++) {
System.out.println(arr[i]);
}
}
}
<<<
97
44
98
44
99
-
大小写转换
-
替换
这个只能替换单个字符
-
去除两端的空格(中间的没办法去除)
-
字符串连接
-
还有一堆静态方法可以将各种类型转化为字符串类型
-
比较大小
会按照字典顺序比较两个字符串
字符串本身是对象,因此字符串比较必须借助方法
package lesson14;
public class test1 {
public static void main(String args[]){
String s = new String("abc");
String s1 = s.intern();
System.out.println(s1==s);
}
}
<<<
false
寻找子串在父串中出现的次数
package lesson14;
public class test3 {
public static void main(String args[]) {
String s = "qweasdasciuaqwesdzmnxcvjgquqwe";
String son = "qwe";
int res = 0;
while (s.length()>son.length()){
if(s.indexOf(son)>=0){
res+=1;
}
s=s.substring(s.indexOf(son)+s.length());
}
System.out.println(res);
}
}
求两个字符串中最大的子串
package lesson14;
public class test3 {
public static void main(String args[]) {
String s = "qweasdasciuaqwesdzmnxcvjgquqwe";
String son = "qwe";
System.out.println(printMaxSub(s,son));
}
private static String printMaxSub(String s, String son) {
for (int i = 0; i <son.length() ; i++) {
for (int a = 0,b=son.length()-i; b!=son.length()+1; a++,b++) {
String str = son.substring(a,b);
if (s.contains(str)){
return str;
}
}
}
return null;
}
}
去除字符串两端的空白
package lesson14;
public class test5 {
public static void main(String args[]){
String s = " qweqwe ";
printTrimString(s);
}
private static void printTrimString(String s) {
while (s.startsWith(" ")){
s = s.substring(1);
}
while (s.endsWith(" ")){
s = s.substring(0,s.length()-1);
}
System.out.println(s);
}
}
这种方法要生成很多个String对象,因此需要改进一下
改进如下
package lesson14;
public class test5 {
public static void main(String args[]){
String s = " qweqwe ";
printTrimString(s);
}
private static void printTrimString(String s) {
int start = 0;
int end = s.length()-1;
while (s.charAt(start)==' '&&start<end){
start++;
}
while (s.charAt(end)==' '&&start<end){
end--;
}
System.out.println(s.substring(start,end+1));
}
}
StringBuffer
StringBuffer就是字符串缓冲区
用于存储数据的容器
特点:
1. 长度是可以变的
2. 可以存储不同类型的数据
有哪些方法呢?
package lesson14;
public class test6 {
public static void main(String args[]){
StringBuffer sb = new StringBuffer();
StringBuffer s1 = sb.append(1);
System.out.println(sb);
System.out.println(s1);
System.out.println(sb==s1);
}
}
<<<
1
1
true
添加方法
package lesson14;
public class test6 {
public static void main(String args[]){
StringBuffer sb = new StringBuffer();
StringBuffer s1 = sb.append(1);
sb.append(true).append(false);
System.out.println(sb);
}
}
<<<
1truefalse
插入方法
package lesson14;
public class test6 {
public static void main(String args[]){
StringBuffer sb = new StringBuffer();
StringBuffer s1 = sb.append(1);
sb.append(true).append(false);
sb.insert(1,123);
System.out.println(sb);
}
}
<<<
1123truefalse
删除方法
查找方法
修改方法
替换一段字符串
改一个字符
设置缓冲区长度
package lesson14;
public class test6 {
public static void main(String args[]){
StringBuffer sb = new StringBuffer();
StringBuffer s1 = sb.append(1);
sb.append(true).append(false);
sb.setLength(0);//相当于清空缓冲区
System.out.println(sb);
}
}
<<<
package lesson14;
public class test6 {
public static void main(String args[]){
StringBuffer sb = new StringBuffer();
StringBuffer s1 = sb.append(1);
sb.append(true).append(false);
sb.setLength(25);//相当于清空缓冲区
System.out.println(sb);
}
}
<<<
1truefalse
StringBuffer是可长度的,那么为什么还要有第三个构造方法呢?
如果我们确定了存储数据的长度,直接开辟相应大小的空间会比较高效。
StringBuilder
StringBuilder线程不安全。
StringBuffer是线程同步的。
她的出现是为了提升单线程效率。