Java基础Day13

day13

  1. StringBuilder字符生成器(缓冲区)
    1.1 StringBuilder类的概述
    StringBuilder 类,来自java.lang 包
    StringBuilder : 表示一个可变的字符序列,对比String字符串,String表示一个不可变的字符序列,在进行大量的字符串拼接时,可以节省时间和空间

String : 底层,就是一个字符数组,使用final修饰了,字符串常量
StringBuilder : 底层,也是一个字符数组, 但是字符数组,没有使用final修饰,可以将StringBuilder理解成一个容器,容器中可以装字符,如果容器装满了,StringBuilder底层默认给你分配一个更大的容器,继续承装字符

1.2 StringBuilder构造方法

  1. StringBuilder() : 创建一个StringBuilder对象, 默认开辟一个16大小的字符数组空间
  2. StringBuilder(int capacity) : 创建一个StringBuilder对象,开辟一个capacity大小的字符数组空间
  3. StringBuilder(String s) : 创建一个StringBuilder对象,开辟s字符串+16大小的字符数组空间
  4. 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缓冲区中

  1. append(Object obj): 将参数以字符串的形式,在末尾追加到StringBuilder所表示的字符串缓冲区中,返回值类型StringBuilder类型
    注意 : append方法因为返回值类型为StringBuilder,因此方法可以进行链式调用(可以连续调用多个append方法)
  2. insert(int index , Object obj): 将参数obj添加到StringBuilder所表示的字符序列的index索引位置上
  3. 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删除功能

  1. delete(int begin,int end) : 将StringBuilder所表示的字符序列中从begin索引开始,到end-1索引结束,中间的所有字符,全部删除,返回值类型是StringBuilder对象本身
  2. 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替换和反转功能

  1. replace(int start ,int end ,String str): 将StringBuilder所表示的字符序列,从strart索引开始,到end-1索引结束,之间的字符使用str字符串进行替换,返回值类型StringBuilder对象
  2. 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的区别

  1. String是一个不可变字符序列
  2. StringBuilder 是一个可变的字符序列

使用场景上 : 如果开发中,遇到需要做比较多的字符串的拼接的需求,请你使用StringBuilder
举例 : 提供一个数组 int[] arr = {1,2,45,67,8,-9,13,10}; ,将数组中的所有内容拼接成一个字符串进行返回

  1. String字符串进行拼接
    String s = “[‘’
    for( int i = 0 ; i < arr.length ; i ++){
    int count = arr[i];
    s = s + count +”,”; // 整个过程,在常量池中频繁的创建字符串常量空间
    }
  2. 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 : 也是一个字符序列的缓冲区

区别:

  1. StringBuffer 类,开始与JDK1.0版本,线程安全的类
  2. StringBuilder 类,开始与JDK1.5版本,线程不安全类
  3. 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作为参数传递内存图:

在这里插入图片描述

  1. 基本数据类型包装类
    2.1 基本数据类型包装类的概述
    4类8种基本数据类型,只能表示一些比较简单直接的数据
    需要对这些基本数据类型的数据,进行一些操作,于是将基本数据类型封装起来,封装到一个类中,将这个类称为基本数据类型的包装类

  2. 开发场景下:
    前端(做数据的输入)-----> 后台系统(接收前台传递的数据,进行数据的处理)
    前端界面 : 输入项 ,用户注册界面
    用户名 —> Sring
    密码—>String
    年龄—> int类型
    出身年月----> 日期类型
    但是 : 数据在系统之间进行传递的时候,全部都是以String类型字符串传递
    问题 : 需要将String类型,转换成int类型和对应的日期类型
    解决 : 创建了一个int类型的对应的引用数据类型,可以作为String和int之间的桥梁

  3. 集合
    集合中存储的所有数据,必须是引用数据类型

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构造方法

  1. Integer(int value) : 将一个int类型数据value,转换成一个Integer类型的对象
  2. 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转换方法

  1. 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
}

}

  1. 正则表达式
    3.1 正则表达式的概念
    正则表达式本身就是一个字符串,能表示一些规则
    正则表达式的作用 : 进行数据的合法性验证

正则表达式 : 好处, 验证数据比较简单. 弊端 : 写对正则比较困难

3.2 正则表达式的写作方式
从API中,搜索pattern,里面就有正则表达式的写作规则
介绍正则表达式的匹配方法:
来自于String类中, matches(String regex) : 表示字符串是否符合regex的正则表达式规则,如果符合规则,返回值为true,不符合规则,返回false

  1. 字符类,表示匹配一个字符
    [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
			
}

}

  1. 预定义字符类
    . : 表示匹配任意一个字符
    \d : 匹配0-9任意的一个数字
    \D : 匹配不是0-9中的任意一个字符
    \s : 匹配一个空格
    \S : 非空格
    \w: 匹配一个字符[a-zA-Z0-9_]
    \W : 匹配一个与\w相反的字符

  2. 数量词
    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));
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值