目录
四.StringBuilder和StringJoiner的使用
一.string类的介绍
(一)概述:
java中所有的双引号字符串:“”,都是string类的对象,是一种引用数据类型。
(string类使用时无需导包)
(二)特点:
1.字符串不可变,创建后的值不可修改。
2.string的值不可变,但是可以被共享。
3.字符串效果上等于字符数组char[],底层原理是字节数组byte[].
二.string类的创建
(一)构造方法:
1.创建空白字符串对象,初始化不含任何内容。
String s1 = new String();
system.out.println("s1:" + s1);//输出为空
2.根据字符数组的内容,来创建字符串对象。
char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
System.out.println("s2:" + s2);//输出abc
3.根据字节数组的内容,来创建字符串对象。
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
System.out.println("s3:" + s3);//abc,字节数组会根据额ASCLL码实现转换
4.直接赋值
String s4 = "abc";
System.out.println("s4:" + s4);//abc
(二)创建字符串对象两种方式的区别
1.通过构造方法创建:
通过new创建的字符串对象,每一次new都会在堆内存区域申请一块内存空间,即使字符串内容相同,但是不同的字符串变量地址值不同,在堆内存中有自己的存储空间。
2.直接赋值方式创建:
以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池(堆内存中)中维护,具有相同的地址
注:使用直接赋值的方式最简单并且节约内存。
(三)字符串的比较
1.==号的使用
比较基本数据类型:比较具体的值
比较引用数据类型:比较对象的地址值
2.如何实现字符串内容的比较equals()
string的成员方法:equals(),比较两个字符串的内容是否相同,区分大小写
public class StringDemo02 {
public static void main(String[] args) {
//构造方法的方式得到对象
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);//在堆内存区
String s2 = new String(chs);//在堆内存区
//直接赋值的方式得到对象
String s3 = "abc";//在字符串池中,也在堆内存
//比较字符串对象地址是否相同
System.out.println(s1 == s2);//false
System.out.println(s1 == s3);//false
//比较字符串内容是否相同
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s3));//true
}
}
三.string类的常见成员方法
1.charAt()//返回指定索引的一个char值 注:调用方式:a.charAt()
char c = str.charAt(i);
System.out.println(c);
2.length()//返回字符串的长度
int len = sj.length();
System.out.println(len);//15
3.substring()//返回字符串的子字符串
注:当形参只有一个时,只给出截取字符串的第一个下标,则会返回从该下标开始到结尾的子字符串
String phoneNumber = sc.next();//13112349408
//2.截取手机号码中的前三位
String star = phoneNumber.substring(0, 3);
System.out.println(star);
//输出为1311
4.replace()//对指定的字符串内容实现自定义内容替换
public class Test9敏感词替换 {
public static void main(String[] args) {
//1.定义一个变量表示骂人的话
String talk = "后裔你玩什么啊,TMD";
//2.把这句话中的敏感词进行替换
String result = talk.replace("TMD", "***");
//3.打印
System.out.println(talk);
System.out.println(result);
}
}
输出:
后裔你玩什么啊,***
四.StringBuilder和StringJoiner的使用
注:这两个类主要用于提高拼接字符串相关操作的效率,避免浪费内存空间。
他们都可以看作一个容器,内容都可以修改。
(一)StringBuilder
1.构造方法
2.常用的成员方法
代码示例:
public class StrBuilderDemo01 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb);//输出abc
//在容器内添加元素
sb.append(1);
sb.append(2.3);
sb.append(true);
System.out.println(sb);//输出abc12.3true
//容器内的内容翻转
System.out.println( sb.reverse());//输出eurt3.21cba
int len=sb.length();
System.out.println(len);//输出11
//对于stringBuidler是被特殊处理的输出是属性值不是地址值
System.out.println(sb);
}
}
(二)StringJoiner
1.构造方法
2.常用的成员方法
代码示例:
public class StrBuilderDemo01 {
public static void main(String[] args) {
//1.创建一个对象,并指定中间的间隔符号
StringJoiner sj = new StringJoiner("---");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//aaa---bbb---ccc
//1.创建对象
StringJoiner sj = new StringJoiner(", ","[","]");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
int len = sj.length();
System.out.println(len);//15
//3.打印
System.out.println(sj);//[aaa, bbb, ccc]
String str = sj.toString();
System.out.println(str);//[aaa, bbb, ccc]
}
}
注:StringBuilder,StringJoiner不是字符串,只是一个容器,任何操作之后如果需要调用字符串的方法需要将其转换为字符串形式
五.字符串的相关内存原理
1.字符串存储的内存原理(上面有提及)
在创建字符串时,直接赋值会复用字符串常量池中的已存在的字符串,不存在就会在串池中生成新的字符串。
字符串string作为一种引用字符串类型,使用new会在堆内存区中开辟新的空间,每个字符串都具有不同的地址值。
2.==号比的是什么(上面有提及)
3.字符串拼接的底层原理
如果没有变量参与,都是字符串直接相加,编译之后就是拼接完成以后的结果,会复用串池中的字符串。
如果变量有参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。
4.StringBuilder提高效率原理图
所有拼接的内容都会往stringBuilder中放,节约内存。
5.StringBuilder容器的相关知识
1.默认创建一个长度为16的字节数组
2.添加的内容长度小于16,直接存
3.添加的内容大于16会扩容(原来的容量*2+2)
4.如果扩容之后还不够,以实际长度为准
本文章总结一些关于string类的基础知识,旨在便于后续复习。