Java中的String类
前言
String在java中表示字符串类型,属于引用数据类型。
我们在学习过程中要重点掌握以下几点:
String类的常用方法;
常量池的概念
正则表达式
String对象的不可变性
String、StringBuffer、StringBuilder之间的区别
提示:以下是本篇文章正文内容,下面案例可供参考
一、String介绍!!!(了解即可)
String类实现了序列化接口Serializable
支持序列化和反序列化开发(序列化后面详细讲解)
String类实现了比较器接口Comparable 支持自然比较
String类实现了字符序列化接口CharSequence
底层采用字符序列存储数据
String是一个final类,代表不可以有子类;而底层采取final char[] 存储字符串。由此可以推断出String类代表的是一个不可变字符序列
二、String类的基本使用
1.String类的构造方法
-public String(String original):初始化新创建的String对象,指定对应的字符串。
-public String(char[] value):通过当前参数的中的字符串数组来构造新的String.-public String(char[] bytes):通过使用平台的默认字符集解码当前参数中的字节数组来构造新的String
2.String类对象的创建
代码如下(示例):
//通过构造来构造字符串
String str1 = new String("abc");
//通过字符数组来构造字符串
char chars[] = {'a','b','c'};
String str2 = new String(chars);
//通过字节数组来构造字符串
char bytes[] = {97,98,99};
String str3 = new String(bytes);
//通过字面量的方式来构造字符串
String str4 = "abc";
3.从底层看String类对象的创建
4.String类的常用方法
判断类的:
boolean equals ( Object anobject) 将该字符串与指定字符串进行比较(内容上的比较)
boolean contains(CharSequence s) 判断当前字符串中是否包含s
boolean endsWith(String suffix) 判断当前字符串是否以suffix结尾
boolean startsWith(String prefix) 判断当前字符串是否以prefix开始
equals()方法代码演示
String str1 = new String("abc");
char bytes[] = {97,97,97};
String str2 = new String(bytes);
String str3 = "abc";
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
获取类的:
转换类的:
分割类的:
比较类的:
三、字符串常量池
1.什么是字符串常量池
- 存放字符串常量的池子-字符串常量声明的位置
2.说明
- 用字面值去声明字符串时
- 即String s1 = "abc" 存在常量池的特点
- 采用String s1 = "abc";去构造字符串时
- 会在堆内存中创建常量池空间
- 如果再采用同样的方式去声明相同的字符串时,就不会在常量池开辟新的空间了。
- 而是去常量池中去找,看是否存在相同的字符串内容
- 有的话直接指向常量池中的该内存空间地址,如果没有在常量池中会开辟新的空间地址
代码演示:(验证:字面值声明字符串时,只要字符串内容相等,地址就一定相等)
String s1 = "hello";
String s2 = "hello";
System.out.println( s1 == s2 );//运行结果为true
3.字符串字面量与字符串对象的区别
先上代码:(观察与上面有何区别)
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2);//执行结果为false
结果之所以是false,是因为字面量存储在常量池,对象存储在堆内存;内存结构如下:
4.结论
当字符串内容相同时,字符串地址不一定相同;
那么要如何准确判断呢,掌握以下四点结论即可:
1)常量 + 常量:
结果仍然存储在字符串常量池中,返回此字面量的地址。注:此时的常量可能是字面量,也可能是final修饰的常量
2)常量 + 变量 或 变量 + 变量 :
都会通过new的方式创建一个新的字符串,返回堆空间中此字符串对象的地址
3)调用字符串的intern():
返回的是字符串常量池中字面量的地址
4)concat(xxx):
不管是常量调用此方法,还是变量调用,同样不管参数是常量还是变量,总之,调用完concat()方法都返回一个新new的对象。
最后练习巩固:
四、正则表达式
1.介绍:
正则表达式就是一个模式串,验证字符串是否匹配指定的模式。
2.正则表达式的构成:
[abc] 匹配a或者b或者c中的一个 . 任意字符 \d 数字 \w 英文单词字符[a-zA-Z0-9_] X{n} 匹配X正好n次 X{n,} 匹配X至少n次 X{n,m} 匹配X至少n次, 最多m次
3.String类中与正则表达式相关的方法
1、boolean matches(String regex)//判断字符串是否匹配指定的regex正则表达式 2、String replaceAll(String regex, String replacement)//把当前字符串中符合Regex正则表达式的字符串使用replacement替换,返回替换后的字符串 3、String[] split(String regex)//把当前字符串使用符合regex正则表达式的字符串拆分 ,返回拆分 后的字符串组成 的数组
案例:从键盘上输入手机号,判断格式是否正确
public static void main(String[] args) {
//1)从键盘上输入手机号, 判断格式是否正确
Scanner sc = new Scanner(System.in);
System.out.println("请输入手机号");
String phone = sc.next();
//定义手机号模式串, 第一位是1, 第二位可以是[3456789]中的一位, 其他9位数字
String pattern = "1[3-9]\\d{9}";
System.out.println(phone.matches(pattern));
}
4.终极定义
正则表达式(英语:Regular Expression,在代码中常简写为regex)。正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。
5.总结
这部分内容做到能看懂一个正则表达式且能根据业务需求修改正则表达式即可。互联网的正则表达式已经很成熟需要使用时直接查找即可。更加详细的匹配规则可以查看W3Cschool或者菜鸟教程即可。
五、String类的不可变性
当对字符变量重新赋值时,需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置修改。
当对现有的字符串进行拼接操作时,需要重新开辟空间保存拼接以后的字符串,不能在原有的位置修改。
六、StringBuffer以及StringBuilder
1.StringBuffer介绍
可变的字符序列;线程安全的,效率相对String高很多
2.StringBuffer的常用方法
StringBuffer() 构造一个没有字符的字符串缓冲区,并构造了16个字符的初始容量。
StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区,并构造指定的初始容量。
- append()连接
- delete()删除
- insert()插入
- replace()替换
- reverse()逆序
3.StringBuilder介绍
- 是可变字符串, 即它的字符序列可以修改。
- StringBuilder不是线程安全的.
4..StringBuilder的常用方法
- append()连接
- delete()删除
- insert()插入
- replace()替换
- reverse()逆序
七、String、StringBuffer、StringBuilder的区别
1.相同点:
- String、StringBuffer、StringBuilder 三者都实现了字符序列接口,都满足了字符序列规范。
2.都被final修饰的类,禁止这三个类的方法被重写。
2.不同点:
1.String 底层采用的是final char[] 进行存储字符串,是不可变的字符序列,每次拼接字符串都会开辟新的内存空间。拼接字符串效率非常低下。
2.StringBuffer 底层采用char[] 进行存储字符串,数组的长度默认16。是可变的字符序列 StringBuffer对象会根据使用情况扩充字符缓冲(原来的2倍+2这种算法扩充)。拼接字符串效率较String来说提高很多。方法都是被synchronized修饰的,都是线程安全的。
3.StringBuilder和StringBuffer功能一样,只是底层方法没有被synchronized修饰,是线程不安全的,执行效率高于StringBuffer ;
4。所以开发一般对字符串的增加、删除、插入操作一般用StringBuffer效率更高,其他操作用String更为便。
八、总结
重点掌握String对象的不同的构造方式所对应的存储模式