String类与char数组的区别
String类: 数据 + 相关操作(char[] + 操作方法)
char[]:只是数据,没有相关操作
首先引入几个名词:
字面量:字符串的“字面量”(也叫“直接量”),也是String类型,它表示了String类型里面的具体内容。
字符串静态常量:需要使用关键字static、final进行修饰
例如:static final String NAME = “张三”;NAME属于常量 而NAME的值“张三”就是NAME的字面量。
其实String底层的实现就是一个char[]
String类能不能被继承?
首先复习一下final关键字:
被fianl修饰变量称之为常量,常量不能被修改
final修饰方法,该方法被它所在的类的子类重写
final修饰的类,称之为“终极类”,不能被继承,換而言之它不能有子类。
而String正是被final关键字所修饰的类(查看java源代码可知)。不能被继承,也不能有子类。
String的一个原则:对象内容永远不变(堆内存中)**
使用String类型可以和基本类型基本一致。
String字面量相同时,会被替换成一个对象的引用。
验证案例:
String str1 = "土豪我们做朋友吧";
String str2 = "土豪我们做朋友吧";
System.out.println(str1==str2);
输出为true
String str3 = new String("土豪我们做朋友吧");
System.out.println(str1==str3);
输出false
注:new String(…)会在堆内存中强制开辟新的空间
String内容比较使用 equals()方法
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
输出均为true
String API常用方法
String类覆写了toString、hashCode、equals等方法
String字符串中的字符是有序号的,从0开始。
API方法:
char charAt( int index):返回索引处char的值。
int length(): 返回字符串的长度。
String trim(): 返回字符串的副本,忽略前导空白和尾部空白。
String toLowerCase(): 将String字符中所有字符都转换为小写。
String toUpperCase(): 将String字符中所有字符都转换为大写。
int indexOf( int ch): 返回指定字符在此字符串第一次出现的索引。
int indexOf( int ch , int fromIndex): 返回指定字符在此字符串第一次出现指定字符串处的索引,
从指定索引处(当前位置)开始搜索。
int lastIndexOf( int ch): 返回指定字符在字符串中最后一次出现处的索引。
boolean endsWith(String suffix): 测试此字符串是否以指定的后缀结束。
boolean startsWith(String prefix): 测试此字符串是否以指定的后缀开始.
String substring( int beginIndex): 返回一个新字符串,它是此字符串的一个子字符串。
String substring( int beginIndex , int endIndex):返回一个新字符串,它是此字符串的一个子字符串。
char[] toCharArray(): 将此字符串转换为一个新的字符数组。
String[] split(): 根据指定的正则表达式拆分此数组。
凡是字面量和常量、字面量和字面量的运算,都会先在编译期运算出结果
运行期:当字符串池中已经有了String的“字面量”时,java程序会直接使用,如果没有则创建。
正则表达式
字符集
[1234] 表示1,2,3,4其中之一
[^12] 表示除了1,2之外的
[1-8] 表示1~8之间的一个数字
[a-e] 表示a,b,c,d,e其中之一
[A-Z] 表示A-Z之间的一个大写字母
[a-zA-Z] 表示一个大写或小写的字母
[0-9a-fA-F] 表示一个16进制字符
0[xX][0-9a-fA-F]{1,8}表示整数的16进制的表达式
预定义字符集
\d 表示[0-9]
\D 表示非数字(不常用)
. 表示任意字符
\w 表示单词字符[0-9a-zA-Z_] PS:包含下划线
\W 表示非单词字符
\s 表示空白: \t \n \r
\S 表示非空白
{m,n} 表示数词m到n个(n>m>=0)
{n} 表示数词n个
{n,} 表示n个以上
? 表示能出现0次或1次
* 表示能出现0或多次 {0,}
+ 表示能出现1或多次 {1,}
正则表达式以”^”开头,以“$”结尾
常用的正则表达式:
邮政编码: ^[0-9]{6}$ 或 ^\d{6}$ 0-9的任意数字出现6次
用户名: ^\w{6,12}$ 6-12位的单词字符
手机号码: ^(\+86|0086)?\s?\d{11}$ "+"特殊字符需要对之转义
身份证号: ^\d{15}(\d{2}[0-9]xX)?$
日期: ^\d{4}-\d{2}-\d{2}$ yyyy-MM- dd 2015-01-29
或 ^\d{4}(-\d{2}){2}$
IP地址: ^\d{1,3}\.(\d{1.3}){3}$ 或 ^(\d{1,3}\.){3}\d{1,3}$
邮箱 ^\w{6,12}@(\w)+(\.(\w)+)*$
^\w{6,12}@(\w)+(\.(\w)+)*(\. com|\. cn|\.net)+$
String字符串对正则表达式的支持
boolean matches(String regex) 匹配正则表达式
String[] split(String regex) 根据正则表达式拆分
String replaceAll(String regex,String replacement)
使用给定的replacement替换此字符串所有匹配给定正则表达式的子字符串
StringBuilderh和StringBuffer
String = char[] + 操作(复制创建新对象) char[]内容不可变
StringBuilder = char[] + 操作(处理当前数组中的内容) char[]内容可变
StringBuffer = char[] + 操作(处理当前数组中的内容) char[]内容可变
StringBulider:
常用方法:
append() 表示“追加”内容,该方法反复操作结果只有一个对象。
insert() 表示在指定的位置“插入”指定的内容。
delete() 表示删除多个字符。
deletCharAt() 表示删除单个字符。
- 长度可变的
- CRUD操作的方法都返回当前的StringBulider对象本身
- String str = s1 + s2; java 代码如下执行
String str = new StringBulider(s1).append(s2).toString(); - s += “b”; 会产生两个对象
StringBulider和StringBuffer的区别:
StringBuffer 在java早期的版本(JDK1.0),速度稍慢,线程安全。
StringBulider在java5(JDK1.5)以后提供,计算速度较快,非线程安全。