1、String类
(1)构造字符串
String类是一个预定义的类,用来存放字符串。String对象一旦创建,内容不能再改变,但是String变量可以指向另外的字符串。
String s1="Java";//字符串直接量看作String对象
String s2="Java";// Java虚拟机为了提高效率并节约内存,如果发现该字符串直接量已经存在于常量池,就不会再开辟空间,s1==s2,true
String s3=new String("Java");//s1==s3,false
从控制台读取字符串Scanner对象的next()方法,以空白字符结束,nextLine()读取一整行文本,回车为结束标志。
(2)获取
对实例方法,s2也可以直接替换为字符串直接量。
方法 | 功能 | 备注 |
s2.length() | 字符数,即字符串长度 | 带(),数组的length是属性 |
s2.charAt(index) | 指定位置的字符 | 第一个下标值是0 |
s2.substring(beginIndex, <endIndex>) | 从beginIndex到结尾或 endIndex-1的子字符串 |
|
s2.split(regex) | 将字符串分段 | 返回字符串数组 |
s2.concat(s1) | 将s2和s1连接, | 返回新字符串。等价于s2+s1,+连接至少有一个变量是字符串,+=也可以连接字符串 |
s2.indexOf(ch) | 第一个ch字符的下标 | 在ch或s后加,fromIndex,表示在fromIndex之后或之前出现的第一个或最后一个下标。 如果没有匹配的,返回-1。 |
s2.indexOf(s) | 第一个s字符串的下标 | |
s2.lastIndexOf(ch) | 最后一个ch字符的下标 | |
s2.lastIndexOf(s) | 最后一个s字符串的下标 |
(3)判断和比较
方法 | 功能 | 备注 |
s2.equals(s1) | 相等则返回true | ==判断二者是否指向同一对象 |
s2.equalsIgnoreCase(s1) | 相等则返回true,不区分大小写 | |
s2.compareTo(s1) | s2是否大于、等于或小于s1,返回整数 | 依据s1和s2第一个不同的字符之差得出的 |
s2.compareToIgnoreCase(s1) | ||
s2.startsWith(prefix) | 以特定前缀开始,返回true |
|
s2.endsWith(suffix) | 以特定后缀结束,返回true |
|
s2.contains(s1) | s2包含s1,返回true | IndexOf也可用于判断 |
(4)转换
功能 | 方法 | 备注 |
字符数组-> 字符串 | new String(char[]) new String(char[],offset,count) | 构造函数 |
String.copyValueOf(char[]) String.copyValueOf(char[],offset,count) | 静态方法 | |
String.valueOf(char[]) | 静态方法 | |
字符串-> 字符数组 | s2.toCharArray() |
|
s2.getChar(begin,end,s1,s1begin) | 将s2子串复制到s1 | |
数值-> 字符串 | String.valueOf(char/boolean/int/long /float/double) | 重载,静态方法 |
数值+”” |
| |
字符串-> 数值 | Integer.parseInt(s2) Integer.parseDouble(s2) | 如果不是数值型字符串, 将导致运行时错误。 |
方法 | 描述 | 注意 |
s2.toUpperCase() | 将其中所有字母大写 |
|
s2.toLowerCase() | 将其中所有字母小写 |
|
s2.trim() | 去掉两边的空白字符 | 空白字符包括 ‘ ’、\t、\f、\r、\n |
注:均返回新字符串
(5)替换
方法 | 功能 |
s2.replace(tar,rep) | 将字符串中匹配的所有字符(串)替换为新字符(串) |
s2.replaceFirst(regex,rep) | 将字符串中满足正则表达式要求的第一个或每个字符串替换为rep |
s2.replaceAll(regex,rep) |
注:均返回新字符串
2、正则表达式
正则表达式用特定符号组成的字符串表示代码操作,是用来处理字符串的强大工具。简化对字符串的复杂操作,但符号定义越多,正则越长,阅读性越差。
分类 | 正则表达式 | 匹配 |
字符 | x | 单个字符,包括转义字符 |
. | 任意单个字符 | |
字符类 | [abc] | a、b或c |
[a-z] | a到z | |
(ab|cd) | ab或cd | |
[a-z[m-p]] | a到e或m-p(并集) | |
[a-e&&[c-p]] | a-e与c-p的交集 | |
[^abc] | 除a、b、c以外的任意字符 | |
预定义字符类 一般\\ | \d | [0-9] |
\D | [^0-9] | |
\s、\S | 空白字符[\t\n\x0B\f\r] | |
\w、\W | 单词字符[a-zA-Z_0-9] | |
贪婪量词 | X? | 一次或一次也没有 |
X* | 零次或多次 | |
X+ | 一次或多次 | |
X{n} | 恰好n次 | |
X{n,} | 至少n次 | |
X{n,m} | 至少n次,不超过m次 |
(1)正则表达式举例
"[1-9][0-9]{4,14}" "1[358]\\d{9}" “[a-zA-Z_$][\\w$]*”
多个空格 " +" 反斜杠 "\\\\" 叠词 "(.)\\1+"
{}:某规则出现的次数;
[]:一个[]对应一个字符;
():为了可以让规则的结果被重用,将规则封装成组()。组有编号,从1开始,想要使用已有组,通过\<组编号>获取。((())())按左括号看编号。
(2)匹配:String类中的booleanmatches(regex)
用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
(3)切割:String[]split(regex)
(4)替换:StringreplaceAll(regex,replacement)
$:用于组替换,如str.replaceAll(“(.)\\1+”,”$1”); 把重叠的字符替换成单个字符,$1即拿前面规则的第一个组。
(5)获取:将字符串中符合规则的子串取出。
java.util.regex包中有两个类,Pattern和Matcher。Pattern类可以描述正则表达式,一个正则表达式是字符串形式,须首先将它创建为Pattern类对象,然后该对象可以用于创建Matcher对象,Matcher类通过解释Pattern对字符串执行匹配操作。
String类中的matches、replaceAll等方法用Pattern和Matcher对象来完成,只不过被String方法封装后,用起来相对简单,功能却单一。想要用到复杂功能得回来调用Mathcher中的方法,还有更多方法String没有封装过。
应用:网页爬虫(蜘蛛)。
import java.util.regex.*;
public class RegexDemo
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str="ming tian jiu yao fang jia le ,da jia";
String reg="\\b[a-z]{4}\\b";//仅有三个字母的单词,\b单词边界
//1、将正则表达式封装成对象
//static Pattern compile(String regex)
//没有对象中特有数据,所以声明为静态方法,返回本类对象
Pattern p=Pattern.compile(reg);
//2、让正则对象和要作用的字符串相关联,获取匹配器对象
//Matcher matcher(CharSequence input)
Matcher m=p.matcher(str);
//3、关联后,获取正则匹配引擎
//4、通过引擎对符合规则的子串进行操作,比如取出
while(m.find()){//将Pattern规则作用于字符串,查找匹配的下一个子序列
System.out.println(m.group());//获取匹配后得到的子序列
System.out.println(m.start()+"..."+m.end());
//int start() 返回第一个匹配字符的下标
//int end() 返回最后匹配字符之后的偏移量
}
System.out.println(m.matches());//false,因为下标已经增加到最后
}
}
3、StringBuilder和StringBuffer类
StringBuffer是字符串缓冲区,是一个容器,容器的操作包括Ccreate、U update、R read、D delete。与String类和数组相比,长度可变。
StringBuilder是一种可变字符序列,提供与StringBuffer兼容的API,但不保证同步,用于字符串缓冲区被单线程使用时。建议使用StringBuilder,因为它效率更高。
二者的构造方法和其它方法几乎完全一样。
(1)添加
StringBuilder append(数据):将指定数据添加至已有数据结尾处,返回原缓冲区对象。
StringBuilderinsert(index,数据):将数据添加至指定位置,原有数据顺延。
(2)删除
StringBuilderdelete(start,end):删除缓冲区数据,包含头,不包含尾。
//sb.delete(0,sb.length()):清空缓冲区
StringBuilderdeleteCharAt(index):删除指定位置字符
(3)获取:与String类似
int length()
char charAt(index)
Stringsubstring(start,end):注意返回String类型
int indexOf(String str) int lastIndexOf(String str)
(4)修改
StringBuilderreplace(start,end,str)
voidsetCharAt(index,ch)
(5)反转
StringBuilderreverse()
(6)其它方法
String toString():从字符串缓冲区返回一个字符串对象。
void getChars(srcBegin,srcEnd,char[] dst,dstBegin):将缓冲区中指定数据存储至数组中。
int capacity():字符串缓冲区的容量。
void setLength(newLength):设置字符串缓冲区的长度,如果比之前的长度长,添加空字符’\u0000’。
void trimToSize():将容量降到实际大小。
4、基本数据类型对象包装类
通过使用包装类(java.lang包),将基本数据类型作为对象处理。大多数基本数据类型名称与其包装类名称相同,Integer和Character例外。
(1)构造包装类newInteger(5); 或new Integer(“5”);或Integer.valueOf(“5”);
(2)MAX_VALUE、MIN_VALUE:类变量,获取最大值或最小(正)值。
(3)基本数据类型和字符串转换
Integer.toString(66);//等于66+””,将基本数据类型转换为字符串
inta=Integer.parseInt(“123”,<radix>);//将字符串转换为基本数据类型,Character没有该方法;可以指定该字符串的进制,实现其它进制转十进制。
Integer i=new Integer(“123”);
intnum=i.intValue();//与parse的区别仅有非静态、静态之分
(4)十进制转换其它进制
Integer.toBinaryString(10);
Integer.toHexString(10);
Integer.toOctalString(10);
(5)compareTo//比较两个数值大小,返回1、0、-1
(6)Integerx=4;//自动装箱
x=x+2;//自动拆箱,x.intValue(),新特性健壮性稍差,需要先检查x!=null
(7)Integera=128; Integer b=128; //a==b,false
Integer m=127; Integer n=127; //m==n,true
当数值在byte范围内,如果该数已经存在,则不再开辟新空间。