引用类型之==字符串==
字符串类的体系结构
不可变字符序列
字符串的特点
- 程序中只要是双引号引起来的字符串都是String类的对象,就算没有new也照样是
- 字符串一旦创建,内容就不可改变,所以可以共享使用
- 效果上相当于是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)
:传入要查找的子串,返回第一次出现的位置,没找到返回-1int lastIndexOf(String str)
:传入要查找的子串,倒着找,返回第一次出现的位置,没找到返回-1boolean startsWith(String prefix)
:传入前缀,检查字符串是否有该前缀,是返回true,反之返回falseboolean startsWith(String prefix, int toffset)
:传入前缀和前缀偏移量,检查是否在偏移处有该前缀,有返回true,反之返回falseboolean 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爬虫
- 使用Pattern类的静态方法compile()进行编译正则,获得Pattern对象
- 使用Pattern的对象的matcher()方法获取匹配器
- 使用匹配器对匹配内容进行相应的操作
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://清理掉
}
Comments NOTHING