课程笔记Day13
- 字符串类 String
- 字符串加强类 StringBuilder
- 大数据类 BigDecimal
- 数据格式化 NumberFormat
- 枚举
第一章 字符串类 String
第01节 基础理论
关于String类,他是字符串,相当于将多个字符串联在一起。
需要注意的是字符串底层是 final char value[]
因此他的底层是不可以改变了。
如果你感觉字符串,底层发生了变化,那么他一定是创建了一个新的字符串数据。
第02节 构造方法
介绍
获取对象的方式,主要有四种,我们称之为 4+1 也就是 四种构造方法 和 一种直接赋值的方式
方法 | 实例 | 说明 |
---|---|---|
String() | String s1 = new String(); | 无参构造 |
String(byte[]) | String s2 = new String(new byte[]{65,66,67}); | 字节数组转字符串 |
String(char[]) | String s3 = new String(new char[]{‘A’,‘B’,‘C’}); | 字符数组转字符串 |
String(String) | String s4 = new String(“ABC”); | 字符串包装构造 |
不过我们一般推荐采用直接赋值的方式,格式如下:
String name = "hello";
字符串的内存图
第03节 常用方法
一、基础方法
方法API | 方法介绍 |
---|---|
public int length() | 获取到字符串的长度,也就是字符串当中字符的个数 |
public char charAt(int) | 通过索引,获取到对应位置的字符 |
public char[] toCharArray() | 将字符串,转换成为字符数组 |
二、比较方法
方法API | 方法介绍 |
---|---|
public boolean equals(Object) | 判断字符串是否相等(完全相等) |
public boolean equalsIgnoreCase(String) | 判断字符串是否相等(忽略大小写) |
public boolean startsWith(String) | 判断字符串是否以指定的字符串开头 |
public boolean endsWith(String) | 判断字符串是否以指定的字符串结尾 |
三、获取新字符串
方法API | 方法介绍 |
---|---|
public String toLowerCase() | 字符串全部转换成为小写 |
public String toUpperCase() | 字符串全部转换成为大写 |
public String substring(int) | 字符串截取,从索引到末尾 |
public String substring(int,int) | 字符串截取,包括开头,不包括结尾 |
public String concat(String) | 字符串合并,合并成为新的字符串 |
public String trim() | 字符串去空格,消除前后空格 |
public String replace(CharSequence,CharSequence) | 字符串替换,替换后成为新的字符串 |
四、字符串转换其他
方法API | 方法介绍 |
---|---|
public int indexOf(int) | 从前往后,获取字符(int->char),第一次出现的索引位置 |
public int indexOf(String) | 从前往后,获取字符串,第一次出现的索引位置 |
public int lastIndexOf(int) | 从后往前,获取字符(int->char),第一次出现的索引位置 |
public int lastIndexOf(String) | 从后往前,获取字符串,第一次出现的索引位置 |
public String[] split(String) | 根据指定的字符串,分割字符串,成为多段,变成字符串数组 |
注意细节: 采用 String[] split(String) 分隔符如果是
.
则需要使用\\.
第04节 统计字符
import java.util.Scanner;
//练习:键盘录入一个字符串,获取到各类字符有多少个?
// ABCabc1234!@
//大写字母 3个
//小写字母 3个
//数字字符 4个
//其他字符 2个
public class Test10 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String str = sc.nextLine();
//得到字符数组
char[] array = str.toCharArray();
//定义统计变量
int countBig = 0;
int countSmall = 0;
int countNumber = 0;
int countOther = 0;
for (int i = 0; i < array.length; i++) {
//遍历,得到单独的字符
char c = array[i];
if (c>='A' && c<='Z'){ //大写字母
countBig++;
}else if (c>='a' && c<= 'z'){ //小写字母
countSmall++;
}else if (c>='0' && c<= '9'){ //数字字符
countNumber++;
}else{
countOther++;
}
}
System.out.println("countBig = " + countBig);
System.out.println("countSmall = " + countSmall);
System.out.println("countNumber = " + countNumber);
System.out.println("countOther = " + countOther);
}
}
第二章 字符串加强类 StringBuilder
第01节 基础理论
字符串的加强类主要包含两个,分别是:
- StringBuilder
- StringBuffer
这两个字符串的加强类,构造方法和成员方法都相似,相比之下有什么区别呢?
StringBuffer 他是线程安全的,安全性高,但是效率偏低。
虽然 StringBuilder 的安全性不高,但是效率高,我们更加推荐使用 StringBuilder
回顾前面介绍的字符串的内存图。在字符串的内存图当中,进行字符串的拼接操作的时候,我们发现会产生内存垃圾。
而 StringBuilder 和 StringBuffer 他们两个设计出来,最主要的作用,就是用来做字符串的拼接。
第02节 常用方法
构造方法
方法API | 方法说明 |
---|---|
public StringBuilder() | 无参数构造,使用较多 |
public StringBuilder(String) | 带参数构造,将字符串String转化成为StringBuilder |
成员方法
方法API | 方法说明 |
---|---|
StringBuilder append(任意数据类型) | 可以进行数据的追加 |
StringBuilder reverse() | 将字符串,进行反转,之前是 abcd 反转变成 dcba |
String toString() | 可以将 StringBuilder 转换成为 String |
相互转换
字符串和StringBuilder之间的相互转换。目的:为了使用彼此的功能
1. 字符串 String ---> 字符串增强类 StringBuilder
String ss = "hello";
StringBuilder sb = new StringBuilder(ss); //采用构造方法,将字符串作为构造方法参数传入
2. 字符串增强类 StringBuilder ---> 字符串 String
StringBuilder sb = new StringBuilder();
sb.append("hello").append(123);
String ss = sb.toString(); //直接使用 toString()方法
第03节 加强练习
需求
键盘输入一个字符串,判断是否是对称字符串。
例如:
abc 不是对称字符串
aba 他是对称字符串
abba 他是对称字符串
代码
import java.util.Scanner;
//练习:判断是否是对称字符串
public class Test04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串:");
String strOld = sc.nextLine();
//判断是否是对称字符串。
//反转原始的字符串,得到新的字符串,拿新的字符串和原始字符串比较
//如果相等,则表示是对称字符串,否则不是对称字符串。
StringBuilder sb = new StringBuilder(strOld);
String strNew = sb.reverse().toString();
//采用三元运算符
System.out.println(strOld.equals(strNew) ? "是对称字符串" : "不是对称字符串");
}
}
第三章 大数据类 BigDecimal
第01节 基础理论
我们的double 数据在进行运算的过程当中,可能出现数据不精确的情况。这是由于 计算机二进制表示法不精确导致的。
但是有些场景当中,我们需要精确的运算,例如:银行、证券、炒股、科研。
这里就不能满足,因此需要精确计算,推荐大家采用新的类 BigDecimal
//学习 BigDecimal 的引入案例
public class Test01 {
public static void main(String[] args) {
System.out.println(0.1 + 0.2); //0.30000000000000004
}
}
//发现问题:double类型,计算不精确
第02节 常用方法
构造方法
方法API | 方法说明 |
---|---|
BigDecimal(double) | 将 double 类型的数据,转换成为 BigDecimal 的对象 |
BigDecimal(String) | 将 String 类型的数据,转换成为 BigDecimal 的对象 |
成员方法
方法API | 方法说明 |
---|---|
public BigDecimal add(BigDecimal) | 加法运算 |
public BigDecimal subtract(BigDecimal) | 减法运算 |
public BigDecimal multiply(BigDecimal) | 乘法运算 |
public BigDecimal divide(BigDecimal) | 除法运算(整除方式) |
public BigDecimal divide(BigDecimal,int,int) | 除法运算(存在无限循环) |
第03节 基础练习
基础用法
//目标:学习BigDecimal 的加减乘除
public class Test03 {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal("0.1");
BigDecimal bd2 = new BigDecimal("0.2");
//加法运算
BigDecimal he = bd1.add(bd2);
System.out.println("he = " + he); //he = 0.3
//减法运算
BigDecimal cha = bd1.subtract(bd2);
System.out.println("cha = " + cha); //cha = -0.1
//乘法运算
BigDecimal ji = bd1.multiply(bd2);
System.out.println("ji = " + ji); //ji = 0.02
//除法运算
BigDecimal shang = bd1.divide(bd2);
System.out.println("shang = " + shang); //shang = 0.5
}
}
//小结: 和add 差subtract 积multiply 商divide
无法整除的情况
import java.math.BigDecimal;
//目标:学习BigDecimal的 无法整除的情况
public class Test04 {
public static void main(String[] args) {
//创建对象
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal bd3 = new BigDecimal("0.3");
//直接相除
//三个参数:
//参数1: 除数
//参数2: 保留小数点后几位
//参数3: 舍入模式 进一法ROUND_UP 去尾法ROUND_DOWN 四舍五入BigDecimal.ROUND_HALF_UP
BigDecimal result = bd2.divide(bd3,4,BigDecimal.ROUND_HALF_UP);
System.out.println("result = " + result);
}
}
//小结: 如果无法整除,则会出现异常。杜绝异常,可以传入三个参数的方法
第四章 数字格式化 NumberFormat
第01节 基础理论
DecimalFormat 是关于数据操作的,格式化数据的类,他是 java.text.NumberFormat
的一个子类。
可以用于格式化 十进制的数字。他的作用有
- 科学计数法表示(1.23E4)
- 百分数表示 (12%)
- 金额表示 ($123)
- 定点数 (123.4)
- 整数 (123)
使用格式
new DecimalFormat(String).format(数据); //主要是这里的String 参数如何填写的问题。
格式化的效果
格式 | 说明 |
---|---|
new DecimalFormat(“0”).fromat(数据); | 获取一位整数 |
new DecimalFormat(“0.00”).fromat(数据); | 保留两位小数 |
new DecimalFormat(“00.000”).fromat(数据); | 获取两位整数,不够补零,保留三位小数 |
new DecimalFormat("#").fromat(数据); | 保留所有整数部分 |
new DecimalFormat("#.##%").fromat(数据); | 以百分比方式计数,并且获取两位小数 |
new DecimalFormat("#.###E0").fromat(数据); | 科学计数法,保留三位小数部分 |
new DecimalFormat(",###").fromat(数据); | 每三位以逗号分隔 |
第02节 案例代码
import java.text.DecimalFormat;
import java.text.NumberFormat;
//快速入门
public class Test01 {
public static void main(String[] args) {
//创建对象
String patten = "####,####";
NumberFormat nf = new DecimalFormat(patten);
String text = nf.format(12345678);
System.out.println("text = " + text); //text = 1234,5678
}
}
//小结:有什么作用呢? 可以便于阅读
第五章 枚举
第01节 基础理论
什么是枚举?
在前面讲解数据类型的时候,提到过: 数据类型分为基本数据类型和引用数据类型。
其中枚举就是 引用数据类型的一种。
男人和女人。这就是枚举。(就是可以穷举的,列出来的东西)
星期一、星期二、星期三、星期四、星期五、星期六、星期日 ---》 星期
春天、夏天、秋天、冬天 --》四季
金牌、银牌、铜牌 --》 奖牌
黑桃、红桃、梅花、方块 ---》花色
定义格式
enum 枚举类名称{
枚举项1, 枚举项2, 枚举项3;
}
使用格式
枚举类名称.枚举项
第02节 快速入门
案例代码
枚举类
//扑克枚举类
public enum PuKe {
//黑桃、红桃、梅花、方片
HEITAO,HONGTAO,MEIHUA,FANGPIAN;
}
测试类
public class Test {
public static void main(String[] args) {
System.out.println(PuKe.HEITAO); //HEITAO
System.out.println(PuKe.HONGTAO); //HONGTAO
}
}
第03节 枚举本质
我们可以把枚举类,进行反编译,查看反编译之后,底层的代码实现。
反编译的快捷键: javap 类名称.class
第04节 应用场景
枚举他可以作用在 switch 语句当中。可以写在 switch语句的 小括号 上面。
回顾:在 switch 语句当中,switch 的小括号里面,可以写什么类型的数据呢?
1、byte
2、short
3、char
4、int
5、String
6、枚举 enum
枚举类
//扑克枚举类
public enum PuKe {
//黑桃、红桃、梅花、方片
HEITAO,HONGTAO,MEIHUA,FANGPIAN;
}
测试类
//枚举在 switch 语句当中的使用
public class Demo {
public static void main(String[] args) {
//创建对象 黑桃是PuKe的对象
PuKe key = PuKe.FANGPIAN;
switch (key) {
case HEITAO:
System.out.println("♠");
break;
case HONGTAO:
System.out.println("♥");
break;
case MEIHUA:
System.out.println("♣");
break;
case FANGPIAN:
System.out.println("♦");
break;
}
}
}
今日小结:
今日主要学习了String类和StringBuilder类
String类型要知道
java.lang.String类的底层结构是final char value[],所以String对象具有原内容不能变的特性。
方式1
直接通过双引号的方式定义,这种定义方式的字符串是存在常量池中。常量池是给JAVA虚拟机运行时分配的一块空间,主要用来存放一些常量数据。
代码演示
public static void main(String[] args) {
String name = "haley";
}
方式2
通过new的方式定义,这种定义方式的字符串是存在堆内存中。
代码演示
public static void main(String[] args) {
String name =new String("haley") ;
}
StringBuilder类重点
StringBuffer跟StringBuilder区别
主要在于StringBuffer是线程安全的,
而StringBuilder`是线程非安全的。
两者的API几乎一样。StringBuffer与StringBuilder官方推荐使用StringBuilder