包装类:
* 含义:
* Java中针对8种基本类型提供对应的引用数据类型
* 分类:
* 整数型:
* Byte(byte),Short(short),Integer(int),Long(long)
* 浮点型
* Float(float),Double(double)
* 布尔型
* Boolean(boolean)
* 字符型
* Character(char)
* 学习目的:
* 1.基本类型数据和包装类型数据的转换
* 2.基本类型数据和字符串数据的转换
* 3.笔试题
拆箱和装箱:
* 拆箱:将包装类型数据转换成基本类型数据
* 装箱:将基本类型数据转换成包装类型数据
*
* 装箱的方式:
* 1.包装类型的构造器
* 2.包装类型的静态方法valueOf(基本类型数据)
* 3.自动装箱(JDK5.0)推荐
* 由JVM隐式调用valueOf()完成装箱的过程
*
* 拆箱的方式:
* 1.包装类型的实例方法xxxValue()
* 备注:xxx为对应实例的基本类型单词
* 2.自动拆箱(JDK5.0)(推荐)
* 由JVM隐式调用xxxValue()完成拆箱的过程
基本类型数据和字符串类型数据的转换
*
* 将基本类型数据转换成字符串类型数据的方式:
* 1.字符串连接符
* 2.先进行装箱,在调用包装类型的实例方法toString()
* 3.包装类型的静态方法toString(基本类型数据)
* 4.String类的静态方法valueOf(基本类型数据)(推荐)
*
* 将字符串类型数据转换成基本类型数据的方式:
* 1.包装类型的构造器,在进行拆箱
* 2.包装类型的静态方法parseXxx(字符串数据)(推荐)
* 备注:Xxx为对应实例的基本类型单词
*
* 注意事项:
* 1.将字符串类型数据转换成基本类型数据时,字符串中的内容必须在该基本类型的数据范围内,否则发生数据格式化异常(NumberFormatException)
* 2.Character类并没有提供将字符串类型数据转换成char类型数据的方式
String类
* 类的特点
* String 类代表字符串。
* 类的位置
* java.lang
* 类的构造器
* public String()
* 初始化一个新创建的 String 对象,使其表示一个空字符序列
* public String(byte[] bytes)
* 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
* public String(byte[] bytes,int offset,int length)
* 通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
* public String(char[] value)
* 分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
* public String(char[] value,int offset,int count)
* 分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
* public String(String original)
* 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;
* public String(StringBuffer buffer)
* 分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。
* public String(StringBuilder builder)
* 分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。
* 类的方法
* 判断功能方法
* 获取功能方法
* 转换功能方法
* 分割功能方法
*
* String对象的创建方式:
* 1.字符串字面值赋值
* 2.通过new创建
String类的特点及源码分析:
* 1.在程序中所有的字符串字面值都是String类的实例
* 2.字符串实例是常量,一旦创建不可以改变
* 3.字符串实例不可变性的原理:
* 底层封装了一个被final修饰的数组
* 4.字符串底层数组的数据类型是:
* JDK8.0(包含)以前:char[]
* JDK9.0(包含)以后:byte[]
* 5.在JDK9.0中,为什么将char[]的底层数组修改为byte[]的底层数组?
* 时间复杂度
* 如果底层数组是char[],数组中元素类型是char,进行底层操作时,先将char转换byte,再由byte转换成二进制位
* 如果底层数组是byte[],数组中元素类型是byte,进行底层操作时,直接将byte转换成二进制位
* 空间复杂度
* 底层数组是char[],会根据内码的存储规则进行存储,
* 当存储字符串内容是"abc"时,每个字符根据内码规则占2个字节,总共3个字符,共占内存6个字节
* 当存储字符串内容是"尚硅谷"时,每个字符根据内码规则占2个字节,总共3个字符,共占内存6个字节
* 底层数组是byte[],会根据开发环境的编码规则进行存储,
* 如果是GBK编码,当存储字符串内容是"abc"时,每个英文字符占2个字节,总共3个字符,共占内存6个字节
* 如果是GBK编码,当存储字符串内容是"尚硅谷"时,每个汉字字符占2个字节,总共3个字符,共占内存6个字节
* 如果是utf8编码,当存储字符串内容是"abc"时,每个英文字符占1个字节,总共3个字符,共占内存3个字节
* 如果是utf8编码,当存储字符串内容是"尚硅谷"时,每个汉字字符占3个字节,总共3个字符,共占内存9个字节
* 6.String实例为什么可以存储中文?
* JVM的底层和String类的底层都有UTF-16编码完成,仅支持Unicode码表中的中文
* 7.String实例的极限长度是多少?
* 最短字符串长度为0,最长字符串长度为65535
* 8.""的null的区别
* "",字面值常量,字符串对象
* null字面值常量,引用类型的默认值
String类判断功能的方法
* public boolean equals(Object anObject)
* 将此字符串与指定的对象比较
* public boolean equalsIgnoreCase(String anotherString)
* 将此 String 与另一个 String 比较,不考虑大小写。
* public boolean contains(CharSequence s)
* 当且仅当此字符串包含指定的 char 值序列时,返回 true。
* public boolean startsWith(String prefix)
* 测试此字符串是否以指定的前缀开始。
* public boolean endsWith(String suffix)
* 测试此字符串是否以指定的后缀结束。
* public boolean isEmpty()
* 当且仅当 length() 为 0 时返回 true。
String类获取功能的方法
* public char charAt(int index)
* 返回指定索引处的 char 值。
* public int indexOf(String str)
* 返回指定子字符串在此字符串中第一次出现处的索引。
* public int lastIndexOf(String str)
* 返回指定子字符串在此字符串中最右边出现处的索引。
* public int length()
* 返回此字符串的长度。
* public String substring(int beginIndex)
* 返回一个新的字符串,它是此字符串的一个子字符串
* public String substring(int beginIndex,int endIndex)
* 返回一个新字符串,它是此字符串的一个子字符串。
String类转换功能的方法
* public String concat(String str)
* 将指定字符串连接到此字符串的结尾。
* public byte[] getBytes()
* 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
* public char[] toCharArray()
* 将此字符串转换为一个新的字符数组。
* public String replace(CharSequence target,CharSequence replacement)
* 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
* public String toLowerCase()
* 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
* public String toUpperCase()
* 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
String类分割功能的方法:
* public String[] split(String regex)
* 根据给定的"规则"的匹配拆分此字符串。
*
*
* String类split()的注意事项:
* 1.在根据指定的规则进行分割后,指定规则会消失
* 2.如果给的规则不在字符串的最后,连续的规则进行多次分割,分割后的内容是长度为0的字符串
* 3.如果给的规则在字符串的最后,在最后的规则进行分割时忽略不计
StringBuffer类和StringBuilder类的相同点和不同点:
* 相同点
* 1.二者拥有相同的父类
* 2.与String不同,二者是可变的字符序列
* 不同点:
* 线程安全性不同:
* StringBuffered类是线程安全的,适用于多线程程序,如果在单线程中进行使用,相比StringBuilder类低很多
* StringBuilder类是线程不安全的,适用于单线程程序,如果在多线程中进行使用,需要手动添加线程安全
StringBuilder类
* 类的特点
* 1.一个可变的字符序列。
* 原因:底层数组没有被final进行修饰
* 2.StringBuilder类是线程不安全的,适用于单线程程序,如果在多线程中进行使用,需要手动添加线程安全
* 类的位置
* java.lang
* 类的构造器
* public StringBuilder()
* 构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符。
* 类的方法
* public StringBuilder append(String str)
* 将指定的字符串追加到此字符序列
* public StringBuilder insert(int offset,String str)
* 将字符串插入此字符序列
* public StringBuilder reverse()
* 将此字符序列用其反转形式取代。
StringBuilder类的源码分析:
* 1.StringBuilder类底层数组的初始容量是多少
* 初始容量是多少取决于创建对象时所选择的构造器
* (1)StringBuilder()
* 初始容量:16
* (2)StringBuilder(CharSequence seq)
* 初始容量:参数长度+16
* (3)StringBuilder(int capacity)
* 初始容量:自定义
* (4)StringBuilder(String str)
* 初始容量:参数长度+16
* 2.StringBuilder类底层数组的扩容原理(规则)
* JDK8.0(包含)以后:
* (原来数组长度 << 1 ) + 2
* JDK7.0(包含):
* 原来数组长度 * 2 + 2;
* JDK6.0(包含)以前:
* (原来数组长度 + 1) * 2;
* 3.StringBuilder类底层数组扩容的时候,为什么+2?
* 为了防止通过自定义初始容量数组传0的特殊情况