06-引用类型之==字符串==

nobility 发布于 2021-02-28 2372 次阅读


引用类型之==字符串==

字符串类的体系结构

字符串类体系结构

不可变字符序列

字符串的特点

  1. 程序中只要是双引号引起来的字符串都是String类的对象,就算没有new也照样是
  2. 字符串一旦创建,内容就不可改变,所以可以共享使用
  3. 效果上相当于是char[]字符数组,底层实现是被final修饰的byte[]字节数组
    • 双引号创建的字符串:在字符串常量池中创建String对象,指向底层实现的byte[]字节数组,重复一样的字符串可以共享字符串常量池中的对象
    • new关键字创建的字符串:在对内存中创建String对象,指向底层实现的byte[]字节数组,重复一样的字符串不会共享

字符串的创建

String str1 = new String();	//"",堆中
String str2 = new String("abc");	//abc,堆中
char[] chars = {'a','b','c'};
String str3 = new String(chars);	//abc,堆中
byte[] bytes = {97,98,99};
String str4 = new String(bytes);	//abc,堆中,使用平台默认字符编码进行解码
String str5 = new String(bytes,1,2);	//bc.堆中,将字节数组部分转为字符串
String str6 = new String(bytes,"UTF-8");	//堆中,使用指定字符编码进行解码
String str7 = "abc";	//abc,堆中的字符串常量池中

字符串的比较

等号地址比较
String str1 = "abc";	//abc,堆中的字符串常量池中
String str2 = "ab"+"c";	//abc,编译器会优化成"abc"
String str3 = new String("abc");	//abc,堆中
System.out.println(str1==str2);	//true,常量池中共享对象
System.out.println(str1==str3);	//false,常量池和堆是不同对象

String c = "c";
String str1 = "abc";
String str2 = "ab"+c;	//abc,由于是变量,编译器不会优化
System.out.println(str1==str2);	//false,常量池和堆中是不同对象
equals方法内容比较
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1.equals(str2));	//true,只要内容相同就是true

System.out.println(str1.equals("abc"));	//true,不建议这样写
System.out.println("abc".equals(str1));	//true,建议这样写,避免空指针异常

System.out.println("abc".equalsIgnoreCase("Abc"));	//true,忽略字母大小写内容比较

字符串常用方法

查询方法
  • int length():获取字符串长度
  • char charAt(int index):传入索引,返回指定位置的字符
  • int indexOf(String str):传入要查找的子串,返回第一次出现的位置,没找到返回-1
  • int lastIndexOf(String str):传入要查找的子串,倒着找,返回第一次出现的位置,没找到返回-1
  • boolean startsWith(String prefix):传入前缀,检查字符串是否有该前缀,是返回true,反之返回false
  • boolean startsWith(String prefix, int toffset):传入前缀和前缀偏移量,检查是否在偏移处有该前缀,有返回true,反之返回false
  • boolean endsWith(String suffix):传入后缀,检查字符串是否有该后缀,是返回true,反之返回false
截取方法
  • String substring(int index):传入索引,返回从索引处到末尾的新字符串
  • String substring(int begin,int end):传入截取范围[begin,end),返回截取范围的新字符串
转换方法
  • String concat(String str):返回当前字符串拼接参数的新字符串,和+效果相同
  • char[] toCharArray():返回字符串转换为字符的数组
  • byte[] getBytes():使用平台默认字符集,返回字符串转换为的字节数组
  • byte[] getBytes(String charsetName):指定字符编码,返回字符串转换为的字节数组
  • String replace(charSequence target,charSequence replacement):将原字符串中全部target子串,替换为replacement串的新字符串返回
  • String trim():将字符串去除左右空格,返回这个新字符串
  • String toLowerCase():将字符串大写字母转为小写字母,返回这个新字符串
  • String toUpperCase():将字符串小写字母转为大写字母,返回这个新字符串
分隔方法
  • String[] split(String regex):按照参数正则规则,将字符串分隔成若干个字符串,封装成字符串数组返回

可变字符序列

可变字符串特点

也叫字符串缓冲区

  • StringBuilder:线程不安全,效率高
  • StringBuffer:线程安全,效率低

可变字符串的创建

StringBuilder str1 = new StringBuilder();	//创建空字符缓冲区,先开辟16字节容量
StringBuilder str1 = new StringBuilder("abc");	//"abc",创建有内容的字符缓冲区
StringBuilder str1 = new StringBuilder(10);	//创建空字符缓冲区,指定容量是10字节

可变字符串常用方法

  • StringBuilder和StringBuffer方法都类似,只列举StringBuilder的
  • 返回值类型是StringBuilder的都是返回对象本身,所以可以链式调用
  • 参数Str可以是任何基本数据类型和字符串,都会转化为字符串
  • 同时拥有String类的charAt()、indexOf()、length()、substring()、
  • StringBuilder append(String str):再最后追加内容
  • StringBuilder delete(int start,int end):删除[start,end)范围的内容
  • StringBuilder insert(int offset,String str):索引前插入内容
  • StringBuilder replace(int start,int end,String str):替换[start,end)范围的内容为指定字符串
  • StringBuilder revese():将字符缓冲区反转
  • String toString():将字符缓冲区转换对象为字符串对象返回

正则表达式

转义字符

由于正则表达式也是字符串,再匹配正则中已经占用的符号时要进行转移,通常要使用两个反斜线,因为两个反斜线转移成一个反斜线,然后这个被转义后的反斜线再将后面要转义的符号转义

符号 匹配的字符
\\ \
\t \t
\n \n

特殊符号

[]中除拉&&、-、^其他就失去意义,无需转义,其中的关系是或的关系

符号 描述
. 任意一个字符,除拉\r\n
^ 以开头,在[]中是取反
$ 以结尾
[] 单个符号范围
&& 只作用于[]中,关系与取交
- 只作用于[]中,表取值范围
{} 数量词量词范围
() 提升优先级和分组
` ` 关系或

数量词符号

贪婪模式(默认):重复次数多个满足条件情况下,尽可能的多匹配

非贪婪模式(数量词后跟一个?):重复次数多个满足情况下,尽可能的少匹配

符号 描述
* 闭包,零次或多次
+ 正闭包,一次或多次
? 占位,零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

简化表达式

预定义类 描述
\d [0-9]
\D [^0-9]
\w [0-9a-zA-Z_]
\W [^0-9a-zA-Z_]
\s 匹配空格(包括换行,制表空格)[\t\r\n\v\f]
\S [^\t\r\n\v\f]

字符串中的正则方法

方法名 描述
boolean matches(String regex) 正则校验
String replaceAll(String regex, String replacement) 正则全部替换
String replaceFirst(String regex, String replacement) 正则首个替换
String[] split(String regex) 正则全部拆分
String[] split(String regex, int limit) 正则部分拆分

java爬虫

  1. 使用Pattern类的静态方法compile()进行编译正则,获得Pattern对象
  2. 使用Pattern的对象的matcher()方法获取匹配器
  3. 使用匹配器对匹配内容进行相应的操作
String str = "<a href=\"http://www.baidu.com\">百度</a>";  //要分析的html
Pattern pattern = Pattern.compile("<a\\shref=\"(.*)\".*>.*</a>");  //编译正则
Matcher matcher = pattern.matcher(str); //解析要分析的字符串
while(matcher.find()){  //若下一个有匹配的返回true
  System.out.println(matcher.group(0));
  //0组是全匹配,<a href="http://www.baidu.com">百度</a>
  System.out.println(matcher.group(1));
  //1组是第一个括号的分组内容,http://www.baidu.com
  System.out.println(matcher.group(1).replaceAll("http://",""));
  //将http://清理掉
}
此作者没有提供个人介绍
最后更新于 2021-02-28