String概述
java.lang.String类代表字符串,Java程序中的所有字符串文字(例如"abc")都为此类的对象
String是Java定义好的一个类,定义在java.lang包中,所以使用的时候不需要导包
Java程序中的所有字符串文字都被定义为此类的对象
字符串的内容是不会发生改变的,他的对象在创建后不能被更改
String name="尼古拉斯";
String schoolName="黑马";
sout(name+schoolName);
//创建了新的字符串
当使用双引号直接赋值的时候,系统会检查该字符串在串池中是否存在
-
不存在 创建新的
-
存在 复用
构造 方法 | |
---|---|
pubilc String() | 创建空白字符串,不含任何内容 |
public String(string original) | 根据传入的字符串 创建字符串对象 |
public String (char[] chs) | 根据字符数组,创建字符串对象 |
public String (byte[] chs) | 根据字节数组,创建字符串对象 |
public class StringDmeo1 {
public static void main(String[] args) {
//使用直接赋值的方式获取一个字符串对象
String s1 = "abcc";
System.out.println(s1);//abc
//使用new的方式来获取一个字符串对象
//空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println("@" + s2 + "!");
//传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
//用的少
String s3=new String("abvc");
System.out.println(s3);//abvc
//传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
//需求 修改字符串的内容 abc Qbc
//abc--->{'a','b','c'}--->{'Q',b,c}--->"Qbc"
char[] chs={'a','b','c','d'};
String s4=new String(chs);
System.out.println(s4);//abcd
//传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
//应用场景 以后在网络中传输的数据其实都是字节信息
//我们一般要把字节信息进行转换,转成字符串,用到这个构造
byte [] bytes={97,98,99,100};
String s5=new String(bytes);
System.out.println(s5);//abcd
//查了ASCII码
}
}
字符串的比较
引用数据类型比较的是地址值
字符串的比较
- boolean equals(要比较的字符串) 完全一样的结果才是true,否则为false
- boolean equalsignoreCase (要比较的字符串) 忽略大小写的比较
遍历字符串
- public char charAt(int index):根据索引返回字符
- public int length():返回此字符串的长度
- 数组的长度: 数组名.length
- 字符串的长度:字符串对象.length()
字符串
- String substring(int beginIndex,int endIndex) 截取
- 注意点 包头不包尾,包左不包右
- 只有返回值才是截取的小串,原来的其实没有变
- String substring (int beginIndex) 截取到末尾
StringBuilder概述
stringbuilder可以看作是一个容器,创建之后里面的内容是可变的
作用 提高字符串的操作效率
stringbuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并且返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 通过toString()就可以实现把STringBuilder转换成string |
stringjoiner的构造方法
方法名 | |
---|---|
public StringJoiner(间隔符号) | 创建一个stringjoiner对象,指定拼接时的间隔符号 |
public StringJoiner(间隔符号,开始符号,结束符号) | 创建一个stringjonier对象,指定拼接时的间隔符号,开始符号,结束符号 |
stringjonier sj=new stringjonier("---") 1---2---3
stringjonier sj=new stringjonier(",","[","]")[1,2,3]
StringJonier的成员方法
方法名 | 说明 |
---|---|
public StringJonier add(添加的内容) | 添加数据,并返回对象本身 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 返回一个字符串(该字符串是拼接之后的结果) |
字符串原理
字符串存储的内存原理
- 直接赋值会复用字符串常量池中的
- new出来的不会复用,而是开辟一个新的空间
==号比较的到底是什么
- 基本数据类型比较数据值
- 引用数据类型比较地址值
一个加号 堆内存中两对象
jdk8字符串拼接底层原理
预估字符串的长度,创建一个数组,把字符串放到数组中
字符串拼接的时候有变量参与,在内存中创建了很多对象,浪费空间,时间也非常慢
结论: 如果很多字符串变量拼接,不要直接+,在底层会创建多个对象,浪费时间,浪费性能
字符串拼接的底层原理
- 如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串
- 如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存
stringbuilder提高效率的原因
- 所有要拼接的内容都会在string builder中放,不会创建很多无用的空间,节约内存
超过16的时候会扩容变成34
如果超出*2+2的容量则以实际容量为准