目录
一,API
API概述:
API (Application Programming Interface) :应用程序编程接口
java API
指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。
使用API帮助文档
二、字符串
1.String类概述
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的对象。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!
2.String类特点
- 字符串不可变,它们的值在创建后不能被更改
- 虽然 String 的值是不可变的,但是它们可以被共享
- 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )
3.创建String类的两种方式
(1).直接赋值
String name = "XXXXXXX"
(2).String类的构造方法
public class StringDemo01 {
public static void main(String[] args) {
//public String():创建一个空白字符串对象,不含有任何内容
String s1 = new String();
System.out.println("s1:" + s1);
//String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
String s2 = "abc";
System.out.println("s2:" + s2);
//public String(char[] chs):根据字符数组的内容,来创建字符串对象
//需求:可以修改字符串内容
char[] chs = {'a', 'b', 'c'};
String s3 = new String(chs);
System.out.println("s3:" + s3);
//public String(byte[] bys):根据字节数组的内容,来创建字符串对象
//应用场景:以后在网络中运输的数据都是用的字节信息
//当需要把字节信息进行转换成为字符串,此时需要这个构造
byte[] bys = {97, 98, 99};
String s4 = new String(bys);
System.out.println("s4:" + s4);//abc
}
}
4.创建String类的内存图
可以理解成字符串常量池,顾名思义其用来存储字符串,但只存储直接赋值的字符串,对于new出来的字符串不存储
JDK7版本之前其在方法区中
从JDK7开始,其从方法区挪到了堆内存
当直接赋值时,系统会检查字符串在字符串串池中是否存在,如果不存在就创建新的,如果存在的话直接复用
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同,所以这种方式可能会浪费内存
5.字符串的比较
1.= = 号的作用
- 比较基本数据类型:比较的是具体的值
- 比较引用数据类型:比较的是对象地址值、
注意:键盘输入的abc,与直接赋值的abc是不相等的,因为前者是new出来的,后者是直接赋值
2.equals方法的作用
比较两个字符串的内容,完全一样true,否则为false
public boolean equals(String s)
boolean result = s1.equals(s2) ;
3.equalsIGnoreCase方法的作用
比较两个字符串的内容,但是不区分大小写
综上所述要想比较两个字符串的内容应该用String的算法==方法,而不能用==
三、StringBuilder
1.StringBuilder概述
StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率
注:Java在底层对其做了一些特殊处理,打印对象不是地址值而是属性值(具体值)
public class StringBuilderDemo4 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("abc");
System.out.println(sb);//abc
}
}
2.StringBuilder构造方法
3.StringBuilder常用方法
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
}
}
值得一提的是String类不能修改,但是StringBuilder类是可以修改的比如reverse反转字符串,实际上是对字符串本身直接操作的
public class StringBuilderDemo3 {
public static void main(String[] args) {
//1.创建对象
StringBuilder sb = new StringBuilder("abc");
//反转
sb.reverse();//cba
System.out.println(sb);
}
}
4.链式编程
当我们在调用一个方法的时候,不需要用变量接受它的结果,可以继续调用其他方法
上述代码段,添加字符串部分,就是链式编程简化后的
四、StringJoiner
1.概述
- StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
- 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
- JDK8出现
2.StringJoiner的构造方法
//1.创建一个对象,并指定中间的间隔符号
StringJoiner sj = new StringJoiner("---");
//2.添加元素
sj.add("aaa").add("bbb").add("ccc");
//3.打印结果
System.out.println(sj);//aaa---bbb---ccc
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]
3.StringJoiner的成员方法
实例参考上一个代码段和上上一个代码段
4.链式编程
StringJoiner也支持链式编程,参考上一个代码段和上上一个代码段
五、字符串相关类的底层原理
1. 字符串存储的内存原理
(1). String s = “abc”;直接赋值
特点:
此时字符串abc是存在字符串常量池中的。
先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。如果没有abc,才会创建一个新的。
所以,直接赋值的方式,代码简单,而且节约内存。
(2). new出来的字符串
看到new关键字,一定是在堆里面开辟了一个小空间。
String s1 = new String(“abc”);
String s2 = “abc”;
s1记录的是new出来的,在堆里面的地址值。
s2是直接赋值的,所以记录的是字符串常量池中的地址值。
2. ==号比较的到底是什么?
如果比较的是基本数据类型:比的是具体的数值是否相等。
如果比较的是引用数据类型:比的是地址值是否相等。
结论:==只能用于比较基本数据类型。不能比较引用数据类型。
3.字符串拼接的底层原理
拼接时右侧没有变量
拼接的时候没有变量,都是字符串。触发字符串的优化机制。
在编译的时候就已经是最终的结果了。
javac命令会将程序员编写的java命令进行编译成class文件,检查拼接过程中是否有变量,如果没有变量在编译过程中就已经是最终的结果了,会复用串池中的字符串
拼接时右侧有变量
(1) JDK8之前会用StringBuilder进行拼接
a和b分别加入到串池中。然后用append方法将s1和b拼接成ab,再通过tostring方法转化为字符串
第三行代码也是同理,c加入到串池中,然后再创建一个Stringbuilder方法让s2、c进行拼接成abc,然后用tostring方法将其转化为字符串
虽然StringBuilder效率高,但是在拼接s2和s3时分别使用了StringBuilder(一个加号就得创建两个对象)这样比较繁琐,速度慢,性能差
(2) JDK8之后会用StringBuilder进行拼接
系统预估字符串长度并创建一个数组,然后将这个数组变成一个字符串
这个方法中,虽然简单了不少,但是预估过程也需要大量时间
结论:很多字符串变量进行拼接,不要直接用+,因为会在底层穿件多个变量,浪费时间,浪费性能
4.StringBuilder提高效率原理图
StringBuilder是一个内容可变的容器,因此速度快