字符串和相关API
java不会字符串即凉一半 学好字符串很重要
API 为应用程序编程接口
获得字符串对象
1.直接赋值
空参构造
string s1=“abc”;
s1 记录的是串池里的地址
2.用new的方式
string s2=new string();
new(在堆内存里开辟空间,再把地址给栈内存里的对象)
equals关键字
equals 比较字符串 返回值为布尔类型
equalslgnoreCase 比较字符串 不过是忽略大小写
boolean result =s1.equals.s2
直接用 == 比较 是比较地址值
string中的字符串方法
1.根据索引返回字符
public char charAt(int index)
2.返回字符串长度
public int length()
3.截取字符串
方法重载
String str="abcdef"; System.out.println(str.substring(1,3)); //截取字符串2,3索引处的字符串 //即为bc
String str="abcdef"; System.out.println(str.substring(1)); //返回字符串1索引往后的字符串 //即为bcdef
4.判断是否包含字符
Scanner sc=new Scanner(System.in); String str="abcdef"; System.out.println(str.contains("abc"));
返回布尔类型数值
5.用正则表达式拆分字符串
String str="abc,de,f"; String x[]=str.split(","); for(String i:x){ System.out.print(i); }
输出 abcdef
6. 返回指定内容在字符串中第一次出现处的索引
如果存在返回索引首索引
如果不存在返回-1
String str="abcdefc"; System.out.println(str.indexOf("de"));
返回值为3
遍历字符串
String str =sc.next(); char c=str.charAt(i) i为字符串的索引 sout(c)
char类型在判断时会转化为int类型 根据ASCII码表
StringBuilder类
查表法 变量只在所属{}内有效
StringBuilder sb=new StringBuilder("abc"); sb.append() 添加元素 sb.reserve() 容量内数据翻转 sb.length() 获得长度 sb.tostring() 转化为字符串 sb.capacity() 容量 sb.length() 长度
StringBuilder
默认容量为16(byte)(字节)
录入ASCII值
扩容
第一次:16*2+2=34
第二次:以实际容量为准
StringBuilder的底层实现可以被看作是一个动态数组。它使用一个可变长度的字符数组来存储字符串内容,并随着需要动态地调整数组的大小。
当创建一个StringBuilder对象时,会初始化一个初始容量为16的字符数组。然后,当我们对StringBuilder对象进行字符串追加、插入、删除等操作时,如果当前字符数组的容量不足以容纳新的字符,StringBuilder会自动进行扩容。
在扩容时,StringBuilder会创建一个新的更大容量的字符数组,并将原有的字符复制到新数组中。这种动态调整数组大小的能力使得StringBuilder类具有动态数组的特性。
通过动态数组,StringBuilder能够高效地处理字符串的修改,避免了频繁创建新的字符串对象带来的性能开销。因此,它适用于需要频繁修改字符串的场景,提供了一种高效的方式来构建和操作字符串。
链式编程
我们在调用一个方法时,不需要用变量接收结果,可以继续调用其他方法
int a=getString().subString(1).replace(“A”,“Q”).length(); 截取字符串的索引1到末尾然后替换A为Q在求长度赋值给a
StringBuilder sb =new StringBuilder; result=new StringBuilder().append(str).reverse.to String;
StringJoiner类
StringJoiner sj=new StringJoiner("---"); sj.add("a").add("b")
输出为:a---b
即指定中间间隔符号
开始标记 间隔 开始 结束
字符串的存储原理
直接赋值的字符串会复用字符串常量池中的
new出来的字符串不会复用,而是开辟一个新空间
字符串池
Java字符串池(String Pool)是一个存储字符串的缓存区域,它位于堆内存中,用于提高字符串的使用效率和节约内存空间。
在Java中,字符串属于不可变对象,即一旦创建就不能修改。因此,为了避免重复创建相同的字符串对象,Java提供了字符串池机制,将相同的字符串对象缓存到字符串池中,供后续使用。当需要创建新的字符串对象时,会首先在字符串池中查找是否已存在相同内容的字符串,如果存在则直接返回该对象的引用,否则创建新的字符串对象并放入字符串池中。
Java中的字符串池有两种形式:常量池和运行时常量池。其中,常量池是字节码文件中的一部分,用于存储编译期间产生的字符串常量。而运行时常量池则是在程序运行过程中动态生成的,用于存储运行期间产生的字符串常量。
等于运算符号== 比较的是什么
基本数据类型比较的是数据值
应用数据类型比较的是地址值
字符串拼接
JDK8之前:用StringBuilder类中的append方法
JDK8之后:先预估字符串拼接后总大小,再放入数组产生新的字符串
没有变量:复用串池中的字符串
有变量:创建,浪费内存