- 基本数据类型:byte short int long float double booleam(true / false) char
- 引用数据类型:类、数组、接口
- 引用数据类型的值是对象,在内存中开辟内存空间
- 字符串底层是 char 类型数组
- 当 String 是空字符串时:
- String str = "" ;
- 在内存中用的是 c 语言存储,c 语言 char 类型数组会有
{ ' \0 ' } 表示结束,也会占用内存空间
- 函数:
- subString(num1,num2):截取函数
- 获取从 num1 到 num2 的字符串
- replace("",""):
- 替换字符串。----> 将前面的字符串替换为后面的字符串
- indexOf(字符串1):
- 判断字符串1是否是本字符串的子串
- 如果是,返回第一个字符的下标
- 如果不是,返回 -1
- 判断字符串1是否是本字符串的子串
- split("字符串1"):字符串切分
- 按照字符串1进行切分,得到的是数组
- 也可以按照字符切分
- 字符:
- 汉字,字母,数字,符号,换行符,空格
- subString(num1,num2):截取函数
- 不可变字符串:
- 不可变:原值不能发生变化
- 底层是 c 语言数组,不管数组有多大,碰到 \0 才会结束,所以原数组修改会很麻烦
- 字符串常量池(在堆区中):
- 当字符串不被引用时,也不会被 java 回收机制清理掉
- 当有变量指向该字符串时,先会查找字符串常量池中有没有该字符串
- 如果有,变量直接指向该字符串
- 如果没有就在字符串常量池新建字符串再进行引用
- 字符串比较:
- == :判断的是两个字符串引用的地址是否一样
String a = "33"; String b = "44"; String c = "33"; System.out.println(a == b); //此时返回的是 false ,因为 a 和 b 在字符串常量池中指向的是两个不同的变量 System.out.println(a == b); //此时返回的是 true,因为 a 和 b 在字符串常量池中指向的是相同的变量
- == :判断的是两个字符串引用的地址是否一样
- equals:比较字符的值是否相等
- 在 Object 类中,本身判断的是地址是否相同
- 在 String 类型中:判断的是两个字符串的值是否相等
- String类型把父类 Object 中的 equest 方法重写
- null 串:不占用堆内存空间
//此时字符串为空串,不占用堆内存空间 String str = null;
- 码点:在内存中的编码值
- new:创建对象并开辟空间
- 开辟的空间不在字符串常量池中,而是在常量池以外的堆区中开辟
public static void main(String[] args) { //该字符串存储在堆区中的字符串常量池中 String a = "11"; //该字符串没有存储在堆区常量池中,而是直接在堆区中开辟的内存空间 String b = new String("11"); //两个字符串虽然值相同用,但是 == 判断的是两个字符串的地址是否相同 //这两个字符串一个在堆区的字符串常量池中,一个直接存储在堆中 //显然地址是两个,返回的是 false System.out.println(a == b); }
- 开辟的空间不在字符串常量池中,而是在常量池以外的堆区中开辟
- API 接口:
- 提供方法:方法名,入参数量以及对应类型,返回类型,方法功能说明
- 常用的方法:
- 字符串拼接:
- String 类型:
- 字符串的每次变化都会申请空间(4KB)
- 本地不可变:
- Java 检测机制:字符串多长就只能占用多大的空间,多余的空间也不能越界使用
- 当内存空间不够时,内存会回收资源重新申请新的空间,运算速度就慢了下来
- StringBuilder缓冲区:
- 本地可变:
- 每次有一个缓冲区:空间足够可以在本地拼接,空间满了就会继续申请新的空间来进行拼接
- 极大节省内存
- 本地可变:
- String、StringBuilder、StringBuffer的区别:
- String:
- 每个变量申请一块空间,性能非常慢
- StringBuilder:
- 当申请的空间不够时,才会申请空间来进行拼接存储
- 性能比 String 快很多
- StringBuffer:
- 多线程一起对他操作,线程安全,底层增加锁
- 性能比 StringBuilder 慢一点点(性能依然很快)
- String:
- 输入输出:
- 引用 :import java.util.*;
- 字符串输入:
- 注意事项:
- 字符包含:回车和空格
- 例:
- 在字符串接收之前先接收一个整形,在整形输入完毕之后敲回车或者空格会被第一个字符串接收到,此时字符串就会就会少一次
- 解决方法:把第一个字符串接收两次即可。第一次接收回车,第二次接收该字符串
- 注意事项:
- String 类型:
拓展知识:
- Buffer:
- 函数名字中带有buffer
- 底层原理和 StringBuffer 实现一样,底层都是一个足够大的数组,性能非常高
- 实现类里面带有 buffer 字样,性能都很高,都是上面实现原理和语言无关
- Stream 流:本质是数组,性能很快
- 网路通信框架 NIO ---> 三大核心之一就是 buffer