API
API (Application Programming Interface) :应用程序编程接口
简单理解:API就是别人已经写好的东西,我们不需要自己编写,直接使用即可
Java API:指的就是 JDK 中提供的各种功能的 Java类。这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。
String概述
String是Java定义好的一个类,定义在java.lang包中,java.lang包是Java的核心包,所以使用的时候不需要导包。
java.lang.String类代表字符串,Java程序中的所有字符串文字(例如"abc")都为此类的对象。
String注意点
字符串的内容是不会发生改变的,它的对象在创建后不能被更改,字符串拼接产生一个新的字符串。
创建String对象的两种方式
-
直接赋值
-
new
String s1 = new String("abc");
String s2 = "abc";
s1记录的是new出来的,记录在堆里面的地址值。
s2是直接赋值的,所以记录的是字符串常量池中的地址值。
String类的构造方法:
构造方法 | 说明 |
---|---|
public String() | 创建空白字符串,不含有任何内容 |
public String(String original) | 根据传入的字符串,创建字符串对象(基本不用) |
public String(char[] chs) | 根据字符数组,创建字符串对象 |
public String(byte[] bys) | 根据字节数组,创建字符串对象 |
String s = "abc"; | 直接赋值的方式创建字符串对象,内容就是abc |
示例代码
public class StringDemo01 { public static void main(String[] args) { //public String():创建一个空白字符串对象,不含有任何内容 String s1 = new String(); System.out.println("s1:" + s1); //public String(char[] chs):根据字符数组的内容,来创建字符串对象 //应用场景:修改字符串中的内容 char[] chs = {'a', 'b', 'c'}; String s2 = new String(chs); System.out.println("s2:" + s2); //public String(byte[] bys):根据字节数组的内容,来创建字符串对象 //应用场景:以后在网络当中传输的数据其实都是字节信息 //我们一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了 byte[] bys = {97, 98, 99}; String s3 = new String(bys); System.out.println("s3:" + s3); //String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc //用得最多,最常见 String s4 = "abc"; System.out.println("s4:" + s4); } }
Java的内存模型
-
栈内存:方法运行的时候进栈,执行完毕出栈
-
堆内存:new出来的对象都在这里
-
方法区:临时存储字节码文件
-
String Table(串池):直接赋值的字符串存储在这里,new关键字创建的不在。
-
在JDK7以前,这个池子在方法区中,从JDK7开始,串池就从方法区中挪到了堆内存,但是无论位置在哪儿,它的运行机制总是不变的。
直接赋值方式:当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在,如果不参在,会创建新的,如果存在,直接复用。
构造方法方式:通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同。不会复用,浪费内存空间。
==号的作用(比的到底是什么)
-
比较基本数据类型:比较的是具体的值
-
比较引用数据类型:比较的是对象地址值
结论:==只能用于比较基本数据类型。不能比较引用数据类型。
字符串比较
boolean equals方法(要比较的字符串):完全一样才是true,否则为false
boolean equalsIgnoreCase(要比较的字符串):忽略英文状态下的大小写比较
StringBuilder概述
StringBuilder可以看成是一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率
StringBuilder构造方法
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
StringBuilder常用方法
打印StringBuilder对象不是地址值而是属性值,因为StringBuilder是Java已经写好的类,Java在底层对它做了一些特殊处理。
链式编程
当我们在调用一个方法的时候,不需要用变量接收它的结果,可以继续调用其他方法
依赖前一个方法的结果,再去调用后面的方法
使用StringBuilder的场景
-
字符串的拼接
-
字符串的反转
StringJoiner概述
StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
JDK8出现的
StringJoiner的构造方法
StringJoiner的成员方法
StringJoiner基本使用
//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]
总结
String:表示字符串的类,定义了很多操作字符串的方法
StringBuilder:一个可变的操作字符串的容器。可以高效的拼接字符串,还可以将容器里面的内容反转。
StringJoiner:JDK8出现的一个可变的操作字符串的容器,可以高效、方便的拼接字符串。在拼接的时候,可以指定间隔符号、开始符号、结束符号。
扩展内容
字符串存储的内存原理
直接赋值会复用字符串常量池中的
new出来的不会复用,而是开辟一个新的空间
字符串拼接的底层原理
如果没有变量参与,都是字符串直接相加,会触发字符串的优化机制,在编译的时候就已经是最终的结果了,会复用串池中的字符串。
如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。
StringBuilder提高效率原理图
所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存。
StringBuilder源码分析
-
默认创建一个长度为16的字节数组
-
添加的内容长度小于16,直接存
-
添加的内容大于16会扩容(原来的容量*2 + 2)
-
如果扩容之后还不够,以实际长度为准
容量:最多装多少;长度:已经装了多少