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:字符串存储的内存原理
- 直接赋值会复用字符串常量池中的
- new出来的不会复用,而是开辟一个新的空间
- 扩展底层原理2:==号比较的到底是什么?
- 基本数据类型比较数据值
- 引用数据类型比较地址值
- 扩展底层原理3:字符串拼接的底层原理
- 如果没有变量参与,都是字符串拼接,编译之后就是拼接之后的结果,会复用串池中的字符串
- 如果有变量参与,会创建新的字符串,浪费内存。
- 扩展底层原理4:StringBuilder提高效率原理
- 所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存。
- 扩展底层原理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次
例子:
-
QQ号正则:
不能以0开头
全部都是数字
5~12位
String qqRegex = "[1-9]\\d{4,11}";
-
手机号正则:
必须是1开头
第二位: 3 4 5 6 7 8 9
全都是数字,必须是11位
String phoneRegex = "[1][3-9]\\d{9}"
-
邮箱正则
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());
}
}