字符串API 及 正则表达式 及 编码

本文详细解析了Java中String类的内部结构、常量池的使用、字符串拼接及正则表达式的应用。通过实例演示了字符串比较、拼接、截取、格式校验等操作,展示了String类的高级特性和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值