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范围内,如果该数已经存在,则不再开辟新空间。