一. 前置知识
API-Application Programming Interface-应用程序编程接口,接口可以简单理解为别人写好的东西,我们拿过来直接使用即可.顾名思义,JavaAPI指的就是JDK提供的各种功能的Java类,它们将底层的实现封装了起来.
二. java.lang.String
该类为字符串,在Java中所有字符串文字都为此类的对象(该包为常用包,无需导包)
注:字符串的内容是不能被修改的,它的对象创建后就不能被修改了.
推:所以字符串的拼接也就是生成一个新的字符串,并非在原来的空间进行修改.
衍:字符串的拼接-"abc" + true = "abctrue"
"123" + "西门"="123西门"
"一匹黑马" + 666="一匹黑马666"
三. 创建字符串
1.直接赋值
String a = "hellothere";
2.new方法-空参构造-获取空白字符串
String b = "";
3. 有参构造,字符数组入参创建String对象
char[] chs = {'a', 'b', 'c'};
String s = new String(chs);
4. 有参构造,字节数组入参创建String对象
byte[] bytes = {97,98,99,100};
String b = new String(bytes);
四. String的底层原理
String池,在JDK1.7之后是一个独立存在的空间(不在堆内存中),当我们创建一个String对象的时候,会在该空间中划出一部分给该对象,并将地址给与对应的标识符.如果再创建相同对象的时候,可以使用池中已有的.
注意,与之相对应的就是new方法创建的字符串,通过这种方式创建出来的字符串,会在堆内存中单独创建出来一块空间,即便是重复的对象也会重复划分出空间使用,所以衍生出两个问题:1.浪费空间.2.字符串值相同但地址不同(比较的时候?)
五.字符串的比较
提问: == 该符号比较的是什么?
回答: 数值.
评论:错误.
解释:分情况而言,引用数据类型和基本数据类型有不同,基本数据类型比较的就是数值,因为他们都在栈内存中,直接比较值即可;引用数据类型在堆内存中,标识符存储的都是地址值,那么使用==进行比较,就是在比较地址值.
衍生: 字符串的创建方式不同,比较情形则不同-如果是"直接赋值"的方式,字符串都在"池"中,同值比较的时候,地址值也相同,自然相等,反之亦然;而用new方法创建的字符串,因为是在堆内存中不断划分的空间,同值比较的时候,地址值依然不同,结果和实际情况不符合.
方法: boolean equals