1.String类
- String是Java定义好的一个类。定义在java.lang包中,所以使用的时候不需要导包。
- Java程序中的所有字符串文字(例如"abcdefg" )。都被实为此类的对象。
- 字符串不可变,它们的值在创建后不能被更改。虽然 String 的值是不可变的,但是它们可以被共享
- 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )
1.1创建String对象的两种方式
-
直接赋值:
String name = "张三";
-
常用的构造方法
构造方法 说明 public String() 创建空白字符串,不含任何内容 public String(String original) 根据传入的字符串,创建字符串对象 public string(char[] chs) 根据字符数组,创建字符串对象 public string(byte[] chs ) 根据字节数组,创建字符串对象
public class StringDemo1 {
public static void main(String[] args) {
// 1.使用直接赋值的方式获取一个字符串对象
String s1 = "abc";
System.out.println(s1);
// 2.使用new的方式来获取一个字符串对象
// 空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println(s2);
// 传递一个字符串,根据传递的字符串内容再创建- -个新的字符串对象
String s3 = new String("abc");
System.out.println(s3);
// 传递一个字符数组,根据字符数组的内容再创建- - 个新的字符串对象
// 需求:我要修改字符串的内容。abcQbc//abc -->{'a','b','c'} -->{'Q','b','c'} --> "Qbc"
char[] chs = {'a', 'b', '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
}
}
1.2String类的内存模型
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。
- 不存在:创建新的
- 存在:复用
public class StringDemo {
public static void main(String[ ] args) {
String s1 = "abc";
String s2 = "abc";
}
}
// s1与s2指向同一个地址
1.3String类中字符串的比较
1.3.1==号的作用
-
基本数据类型:基本数据类型比较的是数据值
int a = 10; int b = 20; System.out.println(a == b);//false
-
引用数据类型:引用数据类型比较的是地址值
String s1 = new String("abc"); String s2 = new String("abc"); System.out.println(S1 == s2); //false
1.3.2equals方法的作用
-
- 方法介绍
public boolean equals(String s) //比较两个字符串内容是否相同、区分大小写
-
示例代码
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"; String s4 = "abc"; //比较字符串对象地址是否相同 System.out.println(s1 == s2); System.out.println(s1 == s3); System.out.println(s3 == s4); System.out.println("--------"); //比较字符串内容是否相同 System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3)); System.out.println(s3.equals(s4)); } }
-
- 方法介绍
public boolean equalslgnoreCase(String s) //忽略大小写的比较
1.4遍历字符串
-
常用的构造类型
构造方法 构造说明 public char charAt(int index) 根据索引返回字符 public int length() 返回此字符串的长 - 成员方法
方法名 说明 String substring(int beginIndex, int endIndex) 截取 注意点:包头不包尾,包左不包右 。只有返回值才是截取的小串 String substring(int beginIndex) 截取到末尾 String replace(旧值,新值) 替换 注意点:只有返回值才是替换之后的结果
1.5StringBuilder
1.5.1概述
StringBuilder可以看成是一个容器, 创建之后里面的内容是可变的。当我们在拼接字符串和反转字符串的时候会使用到
1.5.2作用
提高字符串的操作效率
1.5.3构造方法
构造方法 | 构造说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象, 不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
1.5.4常用方法
方法名 | 说明 |
---|---|
public StringBuilder append (任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 反转容器中的内容 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 通过toString()就可以实现把StringBuilder转换为String |
1.5.5基本使用
public class StringBuilderDemo {
public static void main(String[] args) {
// 使用StringBuilder的场景:
// 1.字符串的拼接
// 2.字符串的反转
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//2.添加元素
/*sb.append(1);
sb.append(2.3);
sb.append(true);*/
//反转
sb.reverse();
//获取长度
int len = sb.length();
System.out.println(len);
//打印
//普及:
//因为StringBuilder是Java已经写好的类
//java在底层对他做了一些特殊处理。
//打印对象不是地址值而是属性值。
System.out.println(sb);
}
}
1.5.6链式编程
public class StringBuilderDemo4 {
public static void main(String[] args) {
//链式编程:
//当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法
//1.创建对象
StringBuilder sb = new StringBuilder();
//2.添加字符串
sb.append("aaa").append("bbb").append("ccc").append("ddd");
System.out.println(sb);//aaabbbcccddd
//3.再把StringBuilder变回字符串
String str = sb.toString();
System.out.println(str);//aaabbbcccddd
}
}
1.6StringJoiner
1.6.1概述
- StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
- 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
- JDK8出现的
1.6.2构造方法
构造方法 | 构造说明 |
---|---|
public StringJoiner (间隔符号) | 创建一个StringJoiner对象, 指定拼接时的间隔符号 |
public StringJoiner (间隔符号,开始符号,结束符号) | 创建一个StringJoiner对象, 指定拼接时的间隔符号、开始符号、结束符号 |
1.6.3成员方法
方法名 | 说明 |
---|---|
public StringJoiner add (添加的内容) | 添加数据,并返回对象本身 |
public int length() | 返回长度(字符出现的个数) |
public String toString() | 返回一个字符串(该字符串就是拼接之后的结果) |
1.7小结
- String
- 表示字符串的类,定义了很多操作字符串的方法
- StringBuilder
- 一个可变的操作字符串的容器。
- 可以高效的拼接字符串,还可以将容器里面的内容反转。
- StringJoiner
- JDK8出现的一个可变的操作字符串的容器,可以高效,方便的拼接字符串。
- 在拼接的时候,可以指定间隔符号,开始符号,结束符号。
1.8字符串小拓展
1.8.1字符串存储的内存原理
String s = “abc”;直接赋值
特点:
此时字符串abc是存在字符串常量池中的。
先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。
如果没有abc,才会创建一个新的。
所以,直接赋值的方式,代码简单,而且节约内存。
1.8.2new出来的字符串
看到new关键字,一定是在堆里面开辟了一个小空间。
String s1 = new String(“abc”);
String s2 = “abc”;
s1记录的是new出来的,在堆里面的地址值。
s2是直接赋值的,所以记录的是字符串常量池中的地址值。
1.8.3==号比较的到底是什么?
-
如果比较的是基本数据类型:比的是具体的数值是否相等。
-
如果比较的是引用数据类型:比的是地址值是否相等。
结论:==只能用于比较基本数据类型。不能比较引用数据类型。
1.8.4StringBuilder源码分析
- 默认创建一个长度为16的字节数组
- 添加的内容长度小于16,直接存
- 添加的内容大于16会扩容(原来的容量*2+2)
- 如果扩容之后还不够, 以实际长度为准