day13
- StringBuilder字符生成器(缓冲区)
1.1 StringBuilder类的概述
StringBuilder 类,来自java.lang 包
StringBuilder : 表示一个可变的字符序列,对比String字符串,String表示一个不可变的字符序列,在进行大量的字符串拼接时,可以节省时间和空间
String : 底层,就是一个字符数组,使用final修饰了,字符串常量
StringBuilder : 底层,也是一个字符数组, 但是字符数组,没有使用final修饰,可以将StringBuilder理解成一个容器,容器中可以装字符,如果容器装满了,StringBuilder底层默认给你分配一个更大的容器,继续承装字符
1.2 StringBuilder构造方法
- StringBuilder() : 创建一个StringBuilder对象, 默认开辟一个16大小的字符数组空间
- StringBuilder(int capacity) : 创建一个StringBuilder对象,开辟一个capacity大小的字符数组空间
- StringBuilder(String s) : 创建一个StringBuilder对象,开辟s字符串+16大小的字符数组空间
- capacity() : 获取StringBuilder缓冲区大小, 返回值类型int类型
代码
package com.zgjy.stringbuilderDemo;
public class StringBuilderDemo {
public static void main(String[] args) {
// 1. StringBuilder()
StringBuilder s = new StringBuilder();
int space = s.capacity();
System.out.println(space);// 16
System.out.println(“s:”+s);
// 2. StringBuilder(int cap)
StringBuilder s1 = new StringBuilder(23);
System.out.println(s1.capacity());// 23
// StringBuilder对象打印结果不是地址值,证明重写了父类的
// toString方法,重写后,打印的是StringBuilder中的字符序列
System.out.println("s1:"+s1);
// 3. StringBuilder(String s)
StringBuilder s2 = new StringBuilder("1234");
System.out.println(s2.capacity());// 20
System.out.println("s2:"+s2);
}
}
1.3 StringBuilder添加功能
StringBuilder主要就是通过append 和 insert的重载方法,将任意的数据类型,转换成字符序列,添加到StringBuilder缓冲区中
- append(Object obj): 将参数以字符串的形式,在末尾追加到StringBuilder所表示的字符串缓冲区中,返回值类型StringBuilder类型
注意 : append方法因为返回值类型为StringBuilder,因此方法可以进行链式调用(可以连续调用多个append方法) - insert(int index , Object obj): 将参数obj添加到StringBuilder所表示的字符序列的index索引位置上
- length() : 获取到StringBuilder中字符数量,返回值类型int类型
代码
package com.zgjy.stringbuilderDemo;
public class StringBuilderAdd {
public static void main(String[] args) {
appendMethod();
insertMethod();
}
public static void appendMethod() {
StringBuilder s = new StringBuilder();
System.out.println(s.capacity());// 16
// 1. append方法,将任意数据类型以字符串的方式拼接到StringBuilder
// 的字符串缓冲区中,返回值类型为StringBuilder
s.append(true);
s.append(3.14);
s.append("1234abc");
s.append(578);
// 2. 当字符序列数量超过StringBuilder缓冲区大小,那么
// StringBuilder底层,默认给开辟更大的数据存储空间
System.out.println(s.capacity());// 34
System.out.println(s);//true3.141234abc5
// 3. append因为返回值类型为StringBuilder,因此方法可以链式调用
s.append(false).append("11").append(4);
System.out.println(s);// true3.141234abc578false114
}
public static void insertMethod() {
StringBuilder s = new StringBuilder();
s.append(true);
// insert() : 向0索引位置添加数据3.14
s.insert(0, 3.14);
System.out.println(s);
// 向1索引位置添加数据hello
s.insert(1, "hello");
System.out.println(s);
// 求StringBuilder字符序列的长度
System.out.println(s.length());// 13 ,索引位置0-12
s.insert(12, 'b');
System.out.println(s);// 长度14,索引0-13
// 末尾追加,insert方法,支持在数组长度位置上添加数据
// 相当于与末尾追加,与append方法结果一致
s.insert(14, "abc");
System.out.println(s);
// 错误代码,数组下标越界,33索引前面的32索引没有内容
//s.insert(33, "abc");
//System.out.println(s);
}
}
1.4 StringBuilder删除功能
- delete(int begin,int end) : 将StringBuilder所表示的字符序列中从begin索引开始,到end-1索引结束,中间的所有字符,全部删除,返回值类型是StringBuilder对象本身
- deleteCharAt(int index) : 将指定索引位置index上的字符,从StringBuilder字符序列中删除,返回值类型StringBuilder对象本身
代码
package com.zgjy.stringbuilderDemo;
public class StringBuilderDelete {
public static void main(String[] args) {
//deleteMethod();
deleteCharAtMethod();
}
public static void deleteMethod() {
StringBuilder s = new StringBuilder(“true34abc”);
s.delete(1, 4);// 删除1-3索引的数据 rue
System.out.println(s);// t34abc
}
public static void deleteCharAtMethod() {
StringBuilder s = new StringBuilder("true34abc");
s.deleteCharAt(4);// 删除4索引上的字符3
System.out.println(s);//true4abc
// 删除,先找到8索引,然后删除,没有8索引
// 添加,没有8索引,有7索引,末尾追加
System.out.println(s.length());// 8
// s.deleteCharAt(8);// 没有8索引,删除失败
}
}
1.5 StringBuilder替换和反转功能
- replace(int start ,int end ,String str): 将StringBuilder所表示的字符序列,从strart索引开始,到end-1索引结束,之间的字符使用str字符串进行替换,返回值类型StringBuilder对象
- reverse(): 将StringBuilder所表示的字符序列内容,进行反转,返回值类型StringBuilder对象
代码
package com.zgjy.stringbuilderDemo;
public class StringBuilderReverse {
public static void main(String[] args) {
StringBuilder s = new StringBuilder("falseHello123");
s.replace(1, 5, "哈哈");// 1-4索引范围的字符alse替换成哈哈
System.out.println(s);// f哈哈Hello123
// reverse() : 将StringBuilder所表示的字符序列内容,进行反转
s.reverse(); //321olleH哈哈f
System.out.println(s);//321olleH哈哈f
}
}
1.6 String和StringBuilder的区别
- String是一个不可变字符序列
- StringBuilder 是一个可变的字符序列
使用场景上 : 如果开发中,遇到需要做比较多的字符串的拼接的需求,请你使用StringBuilder
举例 : 提供一个数组 int[] arr = {1,2,45,67,8,-9,13,10}; ,将数组中的所有内容拼接成一个字符串进行返回
- String字符串进行拼接
String s = “[‘’
for( int i = 0 ; i < arr.length ; i ++){
int count = arr[i];
s = s + count +”,”; // 整个过程,在常量池中频繁的创建字符串常量空间
} - StringBuilder 字符串缓冲区
StringBuilder s = new StringBuilder(“[”);
for( int i = 0 ; i < arr.length ; i ++){
int count = arr[i];
s.append(count); // 整个过程,只有一个StringBuilder 对象
}
String ss = s.toString(); // 这是第二个对象,String ss
1.7 StringBuilder和StringBuffer的区别
StringBuffer : 就是一个字符序列的缓冲区
StringBuilder : 也是一个字符序列的缓冲区
区别:
- StringBuffer 类,开始与JDK1.0版本,线程安全的类
- StringBuilder 类,开始与JDK1.5版本,线程不安全类
- StringBuilder 运行速度比StringBuffer快
StringBuilder 类被设计用作 StringBuffer 的一个简易替换,指在线程安全,单线程情况下,建议使用StringBuilder
说明 : 1. StringBuffer的使用方法和方法,与StringBuilder一样
3. 真实开发场景中,StringBuffer使用率比较高
1.8 String和StringBuilder作为参数传递
代码
package com.zgjy.stringbuilderDemo;
public class StringBuilderParam {
public static void main(String[] args) {
String ss = “QQ”;
getString(ss);
System.out.println(ss);// 2. QQ
StringBuilder sb = new StringBuilder("12");
getStringBuilder(sb);
System.out.println(sb);// 4. 12true
}
public static void getStringBuilder(StringBuilder s) {
s.append("true");
System.out.println(s);// 3. 12true
}
public static void getString(String s) {
s = "123";
System.out.println(s);// 1. 123
}
}
String类型作为参数传递内存图:
StringBuilder作为参数传递内存图:
-
基本数据类型包装类
2.1 基本数据类型包装类的概述
4类8种基本数据类型,只能表示一些比较简单直接的数据
需要对这些基本数据类型的数据,进行一些操作,于是将基本数据类型封装起来,封装到一个类中,将这个类称为基本数据类型的包装类 -
开发场景下:
前端(做数据的输入)-----> 后台系统(接收前台传递的数据,进行数据的处理)
前端界面 : 输入项 ,用户注册界面
用户名 —> Sring
密码—>String
年龄—> int类型
出身年月----> 日期类型
但是 : 数据在系统之间进行传递的时候,全部都是以String类型字符串传递
问题 : 需要将String类型,转换成int类型和对应的日期类型
解决 : 创建了一个int类型的对应的引用数据类型,可以作为String和int之间的桥梁 -
集合
集合中存储的所有数据,必须是引用数据类型
2.2 基本数据类型对应的包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
2.3 Integer类型
Integer 类型就是int基本数据类型的包装类
Integer 类在对象中包含了一个基本类型 int 的值,以后Integer就表示这个int类型的数据
2.3.1 Integer构造方法
- Integer(int value) : 将一个int类型数据value,转换成一个Integer类型的对象
- Integer(String s) : 将一个String类型所表示的数值,转换成Integer类型的对象
注意 : 不是所有的字符串都可以转换成数值类型,如果字符串无法转换成数值,那么就会报出NumberFormatException
NumberFormatException : 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
代码
package com.zgjy.integerDemo;
public class IntegerDemo {
public static void main(String[] args) {
// 1.Integer(int value) : 将一个int类型数据value,
// 转换成一个Integer类型的对象
Integer it = new Integer(5);
System.out.println(it);// 5
// 2. Integer(String s) : 将一个String类型所表示的数值,
// 转换成Integer类型的对象
Integer it1 = new Integer("123");
System.out.println(it1);
// 3. String类型无法转换成数值类型时,报出NumberFormatException
Integer it2 = new Integer("abc");
System.out.println(it2);
}
}
2.3.2 Integer转换方法
- intValue() : 将一个Integer类型的数据,转换成一个int类型数据,返回值类型是int类型
静态方法
2. parseInt(String s ): 静态方法,可以直接类名.直接调用
将一个字符串s,直接转换成int类型数据,返回值类型int类型
3. toHexString(int i) : 静态方法,将一个int类型的数据,转换成一个16进制的字符串
4. toOctalString(int i) : 静态方法,将一个int类型的数据,转换成一个8进制的字符串
5. toBinaryString(int i) : 静态方法,将一个int类型的数据,转换成一个2进制的字符串
6. valueOf(int i) / valueOf(String s) : 静态方法,将一个int类型或者是String类型转换成Integer类型
代码
package com.zgjy.integerDemo;
public class IntegerChange {
public static void main(String[] args) {
Integer i = new Integer(“12”);
// 1.intValue() : 将一个Integer类型的数据,
// 转换成一个int类型数据,返回值类型是int类型
int age = i.intValue();
System.out.println(age+5);
// 2. parseInt(String s) : 将一个字符串s,直接转换成int类型数据,返回值类型int类型
int result = Integer.parseInt("345");
System.out.println(result+1);
// 3. 十进制与16进制,8进制,2进制的互相转换
String s = Integer.toHexString(15);
System.out.println(s);
String s1 = Integer.toOctalString(15);
System.out.println(s1);
System.out.println(Integer.toBinaryString(2));
}
}
2.3.3 Integer的常量(了解)
MAX_VALUE : int类型的最大值表示
MIN_VALUE : int类型的最小值表示
SIZE : int类型在内存中占有的比特位数
TYPE : 基本类型int的Class实例
代码
package com.zgjy.integerDemo;
public class IntegerChangLiang {
public static void main(String[] args) {
// 1. Integer中的静态常量
System.out.println(Integer.MAX_VALUE);//2147483647
System.out.println(Integer.MIN_VALUE);//-2147483648
// 一个int类型数据,占有4字节大小,每个字节对应8个比特位
System.out.println(Integer.SIZE);// 32
Class c = Integer.TYPE;
System.out.println©;// int
}
}
2.4自动装箱和自动拆箱
自动装箱 : 表示将一个基本数据类型,封装成一个引用数据类型
自动拆箱 : 表示将一个引用数据类型,转换成一个基本数据类型
自动装箱的体现 : 基本数据类型可以直接给引用数据类型赋值
Integer i = 18; ----> 将一个int类型18,直接赋值给Integer类型变量i ,自动装箱
自动拆箱体现 : 引用数据类型可以直接和基本数据类型进行运算
i = i + 5 ;
代码
package com.zgjy.integerDemo;
public class IntegerZhuangXiang {
public static void main(String[] args) {
// 1. 自动装箱
Integer ii = new Integer(18);
Integer i = 18 ;
// 2. 自动拆箱
/*分析 : 1) 先进行等号右边的计算 i + 5 , 于是将i的值进行自动拆箱,变成一个基本数据类型 18, 18+5 = 23, 23是一个int类型
2) i = 23 ; 将基本数据类型23赋值给引用数据类型变量i,自动装箱
*/
i = i + 5 ;
System.out.println(i); // 23
}
}
- 正则表达式
3.1 正则表达式的概念
正则表达式本身就是一个字符串,能表示一些规则
正则表达式的作用 : 进行数据的合法性验证
正则表达式 : 好处, 验证数据比较简单. 弊端 : 写对正则比较困难
3.2 正则表达式的写作方式
从API中,搜索pattern,里面就有正则表达式的写作规则
介绍正则表达式的匹配方法:
来自于String类中, matches(String regex) : 表示字符串是否符合regex的正则表达式规则,如果符合规则,返回值为true,不符合规则,返回false
- 字符类,表示匹配一个字符
[abc] : 匹配一个字符,这个字符只能是abc中的其中一个
[^abc] : 匹配除了abc中的任意一个字符
[0-9] : 匹配0-9的任意一个数字
[a-zA-Z] : 匹配任何一个字母
代码
package com.zgjy.pattern;
public class RegexDemo {
public static void main(String[] args) {
regexMethod();
}
// 正则表达式的字符匹配
public static void regexMethod() {
String regex = “[abc]”;
String regex1 = “[^abc]”;
String s = “1”;
if(s.matches(regex)) {
System.out.println("匹配");
}else {
System.out.println("不匹配");
}
System.out.println(s.matches(regex1));// true
}
}
-
预定义字符类
. : 表示匹配任意一个字符
\d : 匹配0-9任意的一个数字
\D : 匹配不是0-9中的任意一个字符
\s : 匹配一个空格
\S : 非空格
\w: 匹配一个字符[a-zA-Z0-9_]
\W : 匹配一个与\w相反的字符 -
数量词
regex{数字} : 大括号中的数字表示regex出现的次数
{n,} : 至少出现n次
{n,m} : 出现的次数为n到m次,最少n次,最多m次
{n}: 正好出现n次
代码
package com.zgjy.pattern;
public class RegexDemo {
public static void main(String[] args) {
//regexMethod();
//regexMethod2();
QQmatch();
}
// 正则表达式的字符匹配
public static void regexMethod() {
String regex = "[abc]";
String regex1 = "[^abc]";
String s = "1";
if(s.matches(regex)) {
System.out.println("匹配");
}else {
System.out.println("不匹配");
}
System.out.println(s.matches(regex1));// true
}
public static void regexMethod2() {
String regex = ".";
String s = "a";
System.out.println(s.matches(regex));// true
// \d表示0-9中的任意一个数字,\ 单独出现就表示转义的含义
// 转义就表示 将\后面的数据,以正常数据显示
System.out.println(s.matches("\\d"));//false
}
public static void QQmatch() {
// 要求: 全数字,第一位数字不能为0,长度5-15位
String regex = "[1-9][0-9]{4,14}";
String qq ="1234534";
System.out.println(qq.matches(regex));
}
}