String
equals() | == |
---|---|
重写后比较的是数据内容 | 引用类型比较地址,基本类型比较本身值 |
虚拟机的内存划分为栈、堆、方法区。
方法区内又为String开辟了一块字符串常量池。
String str = "测试";
先检查字符串常量池中有没有对应的字符串,有则直接调用,没有则创建。变量地址 str 指向 String 所在的字符串常量池。
String str = new String("测试");
先检查字符串常量池中有没有对应的字符串,有则直接调用,没则有则创建,并且在堆内存中开辟一块空间,将字符串常量池中的复制一份给堆内存,返回堆内存地址。
注意
public static void changed(String str) {
if ("测试".equals(str)) {
}
}
一般在开发中用常量调用equals()去比较,
因为用变量如果传入Null,会报NullPointerException。
StringBuffer
1.字符串是常量,它们的值在创建之后不能更改。
2..字符串的内容不适宜频繁修改,因为字符串的内容一旦发生变化,就会创建一个新的对象,若要频繁修改字符串的内容,建议使用字符串缓冲类。
StringBuffer 其实就是一个存储字符的容器,底层是依赖一个字符数组做存储,默认构造方法16个字符,如果不够使用,自动增长一倍。
StringBuffer 和 StringBuilder 的区别
StringBuffer 可以保证线程安全,但是相应速度慢,而StringBuilder则相反。
实际开发中一般用StringBuilder,因为很少在线程中频繁操作字符串。
正则
正则表达式就是操作字符串的一个规则。
预定义字符
任何预定义字符,在没有加上数量之前都只能匹配一个字符。
预定义字符 | 作用 |
---|---|
. | 任何字符 |
\d | 数字:[0-9] |
\D | 非数字字符(除了0-9):[^0-9] |
\s | 空白字符:[\t\n\x08\f\r] |
\s | 空白字符:[\t\n\x08\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符[a-zA-Z_0-9] |
\W | 非单词字符[^\w] |
public static void main(String[] args) {
/**
* 预定义字符
*/
System.out.println("任意字符:" + ("%".matches(".")));
System.out.println("数字字符:" + ("12".matches("\\d\\d")));
System.out.println("非数字字符:" + ("a".matches("\\D")));
System.out.println("空白字符:" + ("\r".matches("\\s")));
System.out.println("非空白字符:" + ("a".matches("\\S")));
System.out.println("单词字符:" + ("a".matches("\\w")));
System.out.println("非单词字符:" + (".".matches("\\W")));
}
数量词
数量词 | 作用 |
---|---|
? | 一次或一次也没有 |
* | 零次或多次 |
+ | 一次或多次 |
{n} | 恰好n次 |
{n,} | 至少n次 |
{n,m} | 至少n次,但是不超过m次 |
public static void main(String[] args) {
/**
* 数量词
*/
System.out.println("?一次或一次也没有:" + ("1".matches("\\d?")));
System.out.println("*零次或多次:" + ("11".matches("\\d*")));
System.out.println("+至少出现一次:" + ("11".matches("\\d+")));
// 只能出现十一位
System.out.println("{次数}恰好出现n次:" + ("11".matches("\\d{11}")));
// 至少要出现三次,没有上限
System.out.println("{次数,}至少要出现指定的次数:" + ("111".matches("\\d{3,}")));
// 指定出现次数为3-4次
System.out.println("{次数1,次数2指定次数出现的范围}" + "11144".matches("\\d{3,4}"));
}
字符类(范围词)
范围词里面不管内容有多长,没有数量词的配合都只能匹配一个字符而已
范围词 | 作用 |
---|---|
[abc] | 只包含a,b,c |
[^abc] | 任何字符,除了a、b或c |
[a-zA-Z] | a到z或A到Z,两头的字母包括在内 |
[a-d[m-p]] | a到d或m到p |
[a-z&&[def]] | d、e或f(交集) |
public static void main(String[] args) {
/**
* 范围词
*/
System.out.println("[abc]:" + "abc".matches("[abc]{3}"));
//除了abc以外
System.out.println("[abc]:" + "@ss".matches("[^abc]{3}"));
//字符可以出现a-z,A-Z,$#
System.out.println("[abc]:" + "ass".matches("[a-zA-Z$#]{3}"));
}
匹配,分割
public class Run {
public static void main(String[] args) {
matchesPhone("13390580000");
mathcesTel("020-12345678");
spiltTest1();
spiltTest2();
}
// 匹配手机号,第一位 1开头,第二位3,5,4,7,8,共11位
public static void matchesPhone(String phone) {
String reg = "1[34578]\\d{9}";
System.out.println(phone.matches(reg) ? "合法" : "非法");
}
// 匹配固定号码,区号-主机号 区号:首位0,长度3-4位 主机号:首位不能为0,长度7-8
public static void mathcesTel(String tel) {
String tell = "0\\d{2,3}-[1-9]\\d{6,7}";
System.out.println(tel.matches(tell) ? "合法" : "非法");
}
// 切割空格
public static void spiltTest1() {
String str = "测 试 切 割";
String[] arr = str.split(" +");
System.out.println(Arrays.toString(arr));
}
//根据重叠词切割
public static void spiltTest2(){
String str = "红火火火白恍恍恍蓝忽忽";
//如果正则的内容需要被复用,那么需要对正则的内容进行分组,分组的目的就是为了提高正则的复用性
//组号不能指定,组号是从1开始,\\1代表引用第一组锁匹配的内容
String[] arr = str.split("(.)\\1+");
System.out.println(Arrays.toString(arr));
}
}
网友评论