Object: toString equals hashCode
String: 字符串
不可变的(赋一个新的值
final char[] //是一个final的字符数组
实现了一个接口: CharSequence 字符序列
int length() 字符长度
char charAt(int)
public void test01() {
//1.调用String方法 API
//常见String对象
String str = "hello";
String s1 = new String(); //空白的字符串 ""
String s2 = new String("hello"); // "hello"
String s3 = new String("hello");
String str1 = "hello";
System.out.println(s1==s2);//比较地址
System.out.println(str==s2);
System.out.println(s2 == s3);
//直接调用,证明String类 将equals 重写过了
System.out.println(s3.equals(s2));
System.out.println(s3.equals(str));
//JDK提供了一个字符串 (String 的常量池
//直接赋值的字符串都在常量池里面,所以能用 == 比较
System.out.println(str == str1);
}
输出结果:false
false
false
true
true
true
String直接赋值,在常量池中进行,不用new 对象,因此地址相同 可用 == 比较
public void test02() {
String str = "hello"; // 常量池
//字符串的字面量(字面的意思)的直接拼接 -> 常量池
String s1 = "he"+"llo"; //常量池
String s2 = "he";
//变量 + 字面量 ——> new 对象
String s3 = s2 + "llo"; //new 对象
System.out.println(str == s1);
System.out.println(str == s3);
//结论 : 字符串在特定场合下面 可以使用 == 比较
// 但是 不建议使用 == 还是建议使用 equals 方法
输出结果:true
false
正则表达式
常用 API
(用来作匹配 -就是一个字符串 就是 写法不一样
boolean matches(String regex)
String replaceAll(String regex,String newStr)
String[] split(String regex)
用途:格式的校验或匹配
只能出现0-9 a-z A-Z _ $ 一共最多16个字符 最少6个字符
输入正确身份证号
11位电话号码
IP地址 xx.xxx.xxx.xx
xxx@xx.com.cn
La-z (2–4) -> L a-z{2,4} []单独一个字符 ()小括号表示整体
一个163的邮箱
[a-zA-Z]\w{5,17}@163.com
public void test3() {
//concat()
//字符串拼接
String s1 = "hello";
s1 = s1.concat("hi"); //字符串本身是不可变的, 所以要覆盖
System.out.println(s1);
// 获得输入的邮箱对应的用户名 wrerwer@163.com
String email = "wrEW@erwer@163.com";
//字符串截取 - 从指定下标开始,截取到结束
String user = email.substring(5);
System.out.println(user);
//字符串截取 - 从指定下标开始,到指定下标结束
user = email.substring(0,7); //前包含 后不包含
System.out.println(user);
//获得@第一次出现所在的下标位置
int index = email.indexOf('@');
user = email.substring(0,index);
System.out.println(user);
//获得 @ 最后一次出现的下标位置
index = email.lastIndexOf('@');
user = email.substring(0,index);
System.out.println(user);
}
正则表达式中 需要\转义字符
验证邮箱格式是否正确
public void test05() {
String email = "sadasd@163.com";
//[a-zA-Z]\w{5,17}@163\.com
//^[a-zA-Z]\w{5,17}@163\.com$ ^表示开始 $表示结束 没影响
String regex = "[a-zA-Z]\\w{5,17}@163\\.com";
System.out.println(regex);
boolean ismatches = email.matches(regex); //在字符串里面 如果想要使用\w 必须再加一个 \
System.out.println(ismatches);
输出结果:[a-zA-Z]\w{5,17}@163.com
true
屏蔽不当言论
public void test06() {
String str = "qnmlgb,你真是个大沙雕,真是nc";
//(qn)?(mlgb|sb|nc)*
String regex = "(qn)?(mlgb|sb|nc)+";
str = str.replaceAll(regex, "**"); //replace 只能屏蔽一个
System.out.println(str);
输出结果: ** ,你真是个大沙雕,真是**
切割字符串
public void test07() {
String ip = "192.168.6.66";
//获得 每一段的 数字
String regex = "\\.";
String[] ss = ip.split(regex);
System.out.println(Arrays.toString(ss));
String word = "hello hi, how are you. Im fine";
// regex = "(\\.|,|!| |\\. )";
regex = "[ ,\\?!\\.]+";
String[] kk = word.split(regex);
System.out.println(kk.length);
输出结果:[192, 168, 6, 66]
7
字符串:由字符数组组成 ,Unicode编码集 \u
1字符=2字节
操作系统中,文件存储都是字节单位
GBK编码和UTF-8编码
public void test08() throws UnsupportedEncodingException {
char c = 'c';
c = (char) 97;
c = '\u4e2d'; // Unicode编码 -Java -JVM
System.out.println(c);
// btye -128~127
//char 0~2^16-1 = 65535
// \u0000~\uffff
String str = "中";
//将字符串转变成字符数组 - 系统级别码(GBK / UTF-8)
byte[] bs = str.getBytes(); // 系统默认编码 // 因为字符串由字符组成 字符由字节组成
System.out.println(Arrays.toString(bs));
bs = str.getBytes("GBK"); // 根据指定的gbk编码来拆解字符串
System.out.println(Arrays.toString(bs));
输出结果:中
[-28, -72, -83]
[-42, -48]
GBK编码下,一个字符占 2个字节
UTF-8,一个字符占3个字节
撰写:2019/5/14