package com.secheng.javaBase;
import org.junit.Test;
public class TestStringBuilder {
//测试StringBuilder封装的是可变对象
public void testStringBuilder(){
//手动修改StringBuilder对象的值,看是否创建新的对象
StringBuilder buf = new StringBuilder("1234");
//借助append方法修改StringBuilder对象的值
System.out.println(buf.hashCode());
/*
* Object的hashcode方法默认返回内存地址,但是hashCode是可以重写的
* 所以不能说hashCode代表内存地址
* 改变StringBuilder对象的值之后,内存地址并改变,证明,StringBuilder对象封装的是可变对象
* */
buf.append("567");
}
public void testInsert(){
StringBuilder buf = new StringBuilder("Programming Language");
buf.insert(9, "php");
//system语句会默认调用toString方法.
System.out.println(buf);
}
public void testDelete(){
StringBuilder buf1 = new StringBuilder("Programming Language");
buf1.delete(4, 4+6);
//含头不含尾
System.out.println(buf1);
//StringBuilder的方法返回的依旧是StringBuider类型,所有StringBuilder的方法可以连缀使用
}
public void testMethod(){
StringBuilder buf = new StringBuilder("Programming Language");
buf.append("java").insert(3, "oracle").replace(9, 13, "JAVA");
System.out.println(String.valueOf(buf));
}
@Test
//思考:字符串拼接是否会创建新的对象
public void testStringAndStringBuilder(){
String a = "ABC";
System.out.println(a.hashCode());
// System.out.println((a+ "456").hashCode());
StringBuilder str = new StringBuilder(a);
System.out.println((str+"de"+"ab").hashCode());
/*小结:
* 1.字符串拼接会创建新的字符串对象,内存地址发生改变
* 2.StringBuilder和字符串拼接,StringBuilder会先转换成String对象在进行拼接,
* 会创建新的String对象,地址发生改变
* StringBuilder是可变字符串,按字符串的内存计算,建议采用StringBuilder实现,这样性能会更好一些
*
* */
Java的字符串拼接过程本质是利用StringBuildr而实现的.
String s = "AB";
String s1 = s+"DE";
s1 = new StringBuilder(s).append("DE").toString();
}
}
StringBuilder 和 StringBuffer
两者功能一样,可以对字符串进行操作
StringBuilder是非线程安全的,同步处理的,性能稍kuai.
StringBuffer线程安全的,并发处理的,性能稍慢.
正则表达式:
简介:
实际开发中,经常需要对字符串数据进行一些复杂的匹配,查找,替换等操作.
通过"正则表示式",可以方便的实现字符串的复杂操作
正则表达式是一串特定的字符,组成一个"规则字符串",这个"规则字符串"是描述文本规则的工具,
正则表达式就是记录文本规则的代码
例如:o
正则表示式:"[a-z]+" 表示一个a到的任意一个或多个字符
正则表示式:"[a-z]" 表示一个a到的任意一个字符
[abc]:a,b,c中任意一个字符
[^abc]:除了a,b,c的任意一个字符
[a-zA-Z0-9]:表示a-z,A-Z,0-9中的任意一个字符
[a-z&&[^bc]]:a-z除了bc以外的任意一个字符
预定义符集
. 任意一个字符(不建议使用)
\d 任意一个数字字符
\w 单词字符,相当于[a-zA-Z0-9_]数字也可以成为单词字符
\s 空白字符
\D 非数字字符
\W 非单词字符
\S 非空白字符
数量词
X?:表示0个或1个X
x*:表示0个或任意多个*
X+:表示1个到任意多个X(大于等于1个X)
X{n}:表示n个X
X{n.m} 表示n个到m个X
练习:
检索邮政编码 6位纯数字
写出3种匹配方法:
最复杂的一种:[0-9][0-9][0-9][0-9][0-9][0-9]
稍微简单的一种:\d\d\d\d\d\d\d
简单一种:\d{6}
分组:()圆括号表示分组,可将一系列正则表达式看成一个整体,分组是可以使用"|"表示"或"的关系
检索电话号码 +0086 15807936346
(\+86|\+0086)?\s*\d{11}
(\\+86|\\+0086)?\\s*\\d{11}
"^"和"$"
.边界匹配
.^代表字符串开始
.$代表字符串结束
匹配用户名规则从头到尾练习8-10个单词字符
//匹配用户名规则从头到尾练习8-10个单词字符
String reges ="\\w{8,10}";
String reges ="^\\w{8,10}$";
String a ="123_baba";
System.out.print(a.matches(reges));
^和&这两个符号加在正则表达式上表示对该表达式从头到尾的整体限定,使得正则表达式更加精准,
但对于大部分工具而言,已经失效.
.matches(regex):将一个字符串与正则表达式进行匹配
匹配成功返回true,否则放回false.
正则表达式
1623883548@qq.com
\d{10}\@qq.com
.split方法
.String的split方法可以将字符串按照特定的分隔符拆分成字符串数组
语法:String[] split[String regex]
参数regex为正则表达式,以regex所表示的字符串分隔符,将字符串拆分成字符串数组
String str = "3,sicheng,4, huawei";
String[] strArr = str.split(",\\s*");
// System.out.println(Arrays.toString(strArr));
String line = "1000+200-150";
String[] strArr2 =line.split("\\-|\\+");//[\\-\\+=]
System.out.println(Arrays.toString(strArr2));
replaceAll方法
提供了用于字符串替换的方法
String replaceAll(String regex,String replacement)
将字符串中匹配正则表达式regex字符串替换replacement
String str1 = "12312321fsdfs123";
//将上述字符串中的数字替换成中文"数字"
str1 = str1.replaceAll("\\d", "数字");
System.out.println(str1);
//数字数字数字数字数字数字数字数字fsdfs数字数字数字
Object
.在Java类结果中,Java.lang.Object类位于顶端
(一切类的父类)
Object a = 任意对象
如果定义一个Java是没用使用extend关键字声明其父类,则其父类默认为java.lang.Object类
Object类型的引用变量可以指向任意的对象
Object a = new String
重写toString()方法
Object类中重要的方法,用于返回对象值的字符串表示
原则建议重写该方法:格式大多数遵循"类的名字[域值]";
任何对象都有toString()方法
String如何重写toString()方法
String已经重写过toString()方法
将自身返回
public String toString(){
return this;
}
equals方法
ps:Object默认的equals方法的比较规则等同与==.