==更新中==[ 包装类 and API篇 ] 基于B站韩顺平老师零基础Java教程的学习笔记 6
- 写在最前面:本来本期应该还有Math类,Arrays类,Date类等内容…但是看这几章内容实在太困了…先跳过看集合了,预计五一假期前补完本文,也存在鸽了的可能性…
常用类
包装类
-
针对八种基本数据类型相应的引用类型即为包装类
-
有了类的特点,就可以调用类中的方法
包装类和基本数据的转换
- 演示装箱
String
基本介绍
-
String对象用于保存字符串,也就是一组字符序列
-
字符串的字符使用Unicode字符编码,一个字符无论是汉字还是字母都占两个字节
-
String类有很多构造器
-
String实现了接口Serializable(String可以序列化,实现网络传输)
-
实现了接口comparable(String可以相互比较大小)
-
String有属性
private final char value[]
,用于存放专门的字符,且被final修饰,是常量,不可修改内容可以修改,但地址不可修改,不能指向新的空间 -
字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的
- 比如:
String s1 = "hello"; s1 = "hi"; //创建了两个对象
- 此时千万不要认为是hi直接替换了hello,让s1=hi,那么它会找常量池中有没有hi,有则直接指向,没有就会重新创建,hello就没人指向丢失了
- 比如:
-
创建String对象的两种方式:
- 方式一:直接赋值
String s = "alioooooon";
- 先从常量池查看是否有"alioooooon"的数据空间,如果有直接指向,没有就重新创建然后指向,s最终指向的是常量池的空间地址
- 方式二:调用构造器
String s= new String(alioooooon);
- 现在堆中创建控件,里面维护了value属性,指向常量池的aliooooon空间,如果常量池没有alioooon,重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址
- 现在堆中创建控件,里面维护了value属性,指向常量池的aliooooon空间,如果常量池没有alioooon,重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址
- 方式一:直接赋值
-
字符串特性举例:
String a = "hello"; String b = "abc"; String c = a + b; //如何执行? //一共有三个对象
- c没有直接指向常量池中的"helloabc",它仍然是个字符串,最终是指向堆的
- 如果此时加一个
String d = "helloabc"
那么d == c
是false,因为d直接指向常量池中的helloabc,但是c指向堆,二者地址显然不同
String类的常见方法
-
String类是保存字符串常量的,但效率较低,每次更新都要重新开辟空间。因此Java设计者提供了StringBuffer和StringBuilder来增强String的功能并提高效率
-
String类常见方法应用实例1
- equals//区分大小写,判断内容是否相等
- equalsIgnoreCase//忽略大小写的情况下判断内容是否相等
- length//获取字符的个数,字符串的长度
- indexOf//获取字符在字符串中第一次出现的索引,索引从零开始,如果找不到返回-1
- lastIndexOf//获取字符在字符串中最后一次出现的索引,索引从零开始,如果找不到返回-1
- substring//截取指定范围的子串
- substring(5)->从索引x开始截取后面所有字串
- substring(0,5)->从索引0开始截取,截取到索引为5-1=4的位置
- trim//去除前后空格
- charAt//获取某索引处的字符,注意不能使用Str[index]这种方式
- 解释举例:
String str = "alioon"; //str[0] = ...这写法完全错误!!! //已知错误写法是吧str直接当作了数组,但实际上alioon是存在属性value中的 str.chatAt(0);//正确写法 ==> 0
- compareTo//比较两个字符串的大小,如果前者大,返回正数,后者大返回负数,相等返回0
- toCharArray//转换成字符数组
- format//格式字符串,%s 字符串,%c 字符,%d 整型,%.2f 浮点型(会四舍五入处理)
- %s,%d,%.2f,%c称为占位符
- 这些占位符由后面的变量按顺序来替换
- split//分割字符串
- replace//替换字符串中的字符
s.replace(a,b)//把a换成b
- 单纯使用s.replace没有任何影响,返回值才是替换过的
- concat//拼接字符串
s.concat(hello).concat(alioooon)
- toUpperCase//字符串全部转换成大写
s.toUpperCase()
- toLowerCase//字符串全部转换成小写
s.toLowerCase()
StringBuffer
注:jdk8后char[]变为了byte[]
- 基本介绍:
- java.lang.StringBuffer代表可变的字符序列,可以对字符内容进行增删
- StringBuffer长度可变,是一个容器
- StringBuffer的父类AbstractStringBuilder中有属性char[],且不是final修饰的,该数组存放了字符串内容,因此存放在堆中
String VS StringBuffer
- String保存的是字符串常量,值不可更改,每次String类的更新就是改变地址,效率较低,实质上是private final char value[]
- StringBuffer保存的是字符串变量,值可以更改,每一次StringBuffer的更新实际上可以更新内容而不必更改地址,效率更高,实质上是char[]
- 构造器解读:
- 默认创建一个大小为16的char[],用于存放字符内容
- 通过构造器指定char[]的大小
- 通过 给一个String 创建StringBuffer(也就是赋初值)
String 和 StringBuffer的转换
tips:append就是将字符串加在末尾
StringBuffer类的常用方法
tips:主要高频使用append 和 insert 方法
- append//增(追加)使用方法:s.append(增的内容)
- delete//删 使用方法:s.delete(11,14):意为删除***[11,14)***的字符,注意这里不包含14
StringBuilder
- 基本介绍:
- 一个可变的字符序列,此类提供一个与StringBuffer兼容的API,但不保证同步(不是线程安全的)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候,如果可能,建议优先使用StringBuilder,因为在大多数实现中,StringBuilder比StringBuffer更快
- 在StringBuilder上的主要操作是append和insert方法,可以重载这些方法以接受任意类型的数据
- 实现了Serializable,说明StringBuilder对象可以串行化(可以进行网络传输,保存到文件)
- StringBuilder类是final类不可被继承
- StringBuilder对象字符序列依然是存放在其父类的char[] value,因此字符序列是在堆中
- StringBuilder的方法没有做互斥处理,没有synchronized关键字。因此在**单线程(没有并发)**的情况下使用StringBuilder
String VS StringBuilder VS StringBuffer
- 效率:StringBuilder > StringBuffer > String
- 总结使用原则
- 如果字符串存在大量的修改操作,一般使用StringBuilder和StringBuffer
- 如果字符串存在大量的修改操作,并在单线程的情况下,一般使用StringBuilder
- 如果字符串存在大量的修改操作,并在多线程的情况下,一般使用StringBuffer
- 如果字符串很少修改,被多个对象引用,使用String,比如配置信息等