String

String

一、String概述

java.lang.String类代表字符串,Java程序中的所有字符串文字都为此类的对象

String的注意点

字符串的内容是不会发生改变的,它的对象在创建后不能被更改。

注:字符串拼接产生一个新的字符串

二、创建String对象的两种方式

  • 直接赋值:String name = “xxx”;

  • new

public class Test{
	public static void main(String[] args)
	{
		//1.使用直接赋值的方式获取一个字符串对象
		String s1 = "abc";
		System.out.println(s1);
		
		//2.使用new的方式来获取一个字符串对象
		//空参构造:可以获取一个空白的字符串对象
		String s2 = new String();
		System.out.println("@" + s2 + "!");//@!
		
		//传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
		String s3 = new String("abc");
		System.out.println(s3);//abc
        
        //传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
        //需求:我要修改字符串的内容。
        //abc--> {'a','b','c'} --> {'Q','b','c'} --> "Qbc"
        char[] chs = {'a','b','c','d'};
        String s4 = new String(chs);
        System.out.println(s4);//abcd
        
        //传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
        //应用场景:以后在网络当中传输的数据其实都是字节信息
        //我们一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了。
        byte[] bytes = {97,98,99,100};
        String s5 = new String(bytes);
        System.out.println(s5);//abcd
        
	}
}

三、Java的常用比较(==)

==号比的到底是什么?

  • 基本数据类型:比的是数据值
  • 引用数据类型:比的是地址值
字符串的比较
  • boolean equals方法(要比的字符串) 完全一样结果才说true,否则为false
  • boolean equalslgnoreCase(要比的字符串) 忽略大小写的比较

例如:

public class test{
	public static void main(String[] args)
	{
		String s1 = new String("abc");
		String s2 = "abc";
		
		boolean result1 = s1.equals(s2);
		System.out.println(result1);
	}
}

//运行结果:
//true

四、StringBuilder概述

StringBuilder可以看成是一个容器,创建之后里面的内容是可变的

  • **作用:**提高字符串的操作效率
1.StringBuilder构造方法
方法名说明
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象
2.StringBuilder常用方法
方法名说明
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()反转容器中的内容
public int length()返回长度(字符出现的个数)
public String toString()通过toString()就可以实现把StringBuilder转换为String

拓展:链式编程

当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法

**注: ** StringBuilder是一个对象,不是String,所以需要toString方法将StringBuilder里的内容变成String类。

例:拼接字符串

定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回。

调用该方法,并在控制台输出结果

例如:数组为[1,2,3];执行方法后的输出结果为

public class StringBuilderDemo{
	public static void main(String[] args)
	{
		int[] arr = {1,2,3};
		
		String str = arrToString(arr);
		
		System.out.println(str);
	}
	public static String arrToString(int[] arr){
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		
		for(int i = 0 ; i < arr.length ; i++ )
		{
			if(i == arr.length - 1){
				sb.append(arr[i]);
			}else{
				sb.append(arr[i]).append(",");
			}
		}
		sb.append("]");
		
		return sb.toString();
	}
}

五、StringJoiner概述

  • StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
  • 作用:提高字符串的操作效率,而且代码编写特别简洁。
  • JDK8出现的
1.StringJoiner的构造方法
方法名说明
public StringJoiner(间隔符号)创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号
StringJoiner sj = new StringJoiner("---");//1---2---3
StringJoiner sj = new StringJoiner(",","[","]");//[1,2,3]
2.StringJoiner的成员方法
方法名说明
public StringJoiner add(添加的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public String toString()返回一个字符串(该字符串就是拼接之后的结果)

六、字符串原理小结

  1. 扩展底层原理1:字符串存储的内存原理
    • 直接赋值会复用字符串常量池中的
    • new出来的不会复用,而是开辟一个新的空间
  2. 扩展底层原理2:==号比较的到底是什么?
    • 基本数据类型比较数据值
    • 引用数据类型比较地址值
  3. 扩展底层原理3:字符串拼接的底层原理
    • 如果没有变量参与,都是字符串拼接,编译之后就是拼接之后的结果,会复用串池中的字符串
    • 如果有变量参与,会创建新的字符串,浪费内存。
  4. 扩展底层原理4:StringBuilder提高效率原理
    • 所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存。
  5. 扩展底层原理5:StringBuilder源码分析
    • 默认创建一个长度为16的字节数组
    • 添加的内容长度小于16,直接存
    • 添加的内容大于16会扩容(原来的容量*2+2)
    • 如果扩容之后还不够,以实际长度为准。

七、正则表达式

本质来说就是一个字符串,可以指定一些规则,来校验其他字符串。

1.字符类

[abc] 只能是a,b或c

[^abc] 除了a,b,c之外的任何字符

[a-zA-Z] a到z,A到Z,包括(范围)

[a-d[m-p]] a到d,或m到p,([a-dm-p]联合)

[a-z&&[def]] d,e,或f(交集)

[a-z&&[bc]] a到z,除了b和c:([ad-z]减法)

[a-z&&[ ^m-p]] a到z,除了m到p:([a-lq-z]减法)


2.预定义字符

. 任何字符

\d 一个数字:[0-9]

\D 非数字:[ ^0-9]

\s 一个空白字符:[ \t\n\x0B\f\r]

\S 非空白字符:[ ^\s]

\w [a-zA-Z_0-9] 英文、数字、下划线

\W [ ^\w] 一个非单词字符

\:转义字符


3.数量

X? X,一次或0次

X* X,零次或多次(任意次数)

X+ X,一次或多次

X{n} X,正好n次

X{n, } X,至少n次

X{n,m} X,至少n但不超过m次


例子:

  1. QQ号正则:

    ​ 不能以0开头

    ​ 全部都是数字

    ​ 5~12位

    String qqRegex = "[1-9]\\d{4,11}";
    
  2. 手机号正则:

    ​ 必须是1开头

    ​ 第二位: 3 4 5 6 7 8 9

    ​ 全都是数字,必须是11位

    String phoneRegex = "[1][3-9]\\d{9}"
    
  3. 邮箱正则

    ​ zhangsan@itcast.cn

    ​ zhangsan@163.com

    ​ 123456@qq.com

    ​ zhangsan@sina.com

    ​ zhangsan@itcast.qq.com

    ​ zhangsan@xxx.edu

    ​ zhangsan@xxx.org

    String emailRegex = "\\w+[@][\\w&&[^_]]+(\\.[a-z]{2,3})+"
    

String类中与正则有关的常见方法

方法名说明
public String replaceAll(String regex , String newStr)按照正则表达式匹配的内容进行替换
public String[] split(String regex)按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
4.正则表达式应用

使用正则表达式爬取信息

需求:请把下面文本中的电话,邮箱,座机号码,热线都爬取出来

public static void mian(String[] args)
{
	String data = "来黑马程序员学习Java," +
				  "电话:18666668888,18699997777或者联系" +
				  "邮箱:boniu@itcast.cn 邮箱:bozai@itcast.cn 邮箱2:dlei0009@163.com" +
				  "座机电话:01036517895,010-98951256" + 
				  "热线电话:400-618-9090 , 400-618-4000 , 4006184000 , 4006189090";
				  
	//定义爬取正则
	String regex = "1[3-9\\d{9}|\\w+@[\\w&&[^_]]+(\\.[a-z]{2,3})+|0\\d{2,3}-?								\\d{7,8}|400-?\\d{3}-?\\d{4}"
	//将正则表达式封装为一个Pattern对象
	Pattern pattern = Pattern.compile(regex);
	//获取匹配器对象
	Matcher matcher =pattern.matcher(data);
	//通过匹配器,从内容中爬取信息
	while(matcher.find()){
		System.out.println(matcher.group());
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>