String 类的概念及特点
最终类,没有子类
所有字符串常量都是String类的对象
String类底层是根据不可变字符数组来实现数据的存储,String类创建对象后无法改变对象的内容
所有的常量都是放在方法区的运行时常量池中
如果常量池中定义了字符串对象的引用,后面的字符串对象的内容和前面一致,共同用一个
String s1 = “ab”;
String s2 = new String(“ab”)
解释:
- String s1 = “ab”;
- String s2 = new String(“ab”)
- s1 指向方法区运行时常量池
- s2 指向堆
- 如果运行时常量池已经定义String类对象的内容,后面的对象内容如果和前面内容一致,就共同用一个
String s1 = “ab”
String s2 = “a”
s2 += “b”
解释:
- String s3 = “a”+“b” //如果参与运算的都是常量,在编译期间就会进行优化,直接计算结果赋给给左边
- s2 += “b” 底层执行 StringBuilder操作,创建对象
- s2指向堆里
StringBuilder 和 + 做拼接效率对比
String s = "";
long start = System.currentTimeMillis();
for(int i=0;i<100000;i++){
s+="a"; //每次产生3个对象
}
long end = System.currentTimeMillis();
System.out.println(end - start);
StringBuilder sb = new StringBuilder();
long start1 = System.currentTimeMillis();
for(int i=0;i<100000;i++){
sb.append("i"); 每次产生一个对象
}
long end1= System.currentTimeMillis();
System.out.println(end1-start1);
综上,如果拼接大量数据使用StringBuilder拼接效率更高
StringBuilder从JDK1.5出现,线程不安全,但是效率高
StringBuffer 从JDK1.0出现,线城安全,但是效率低
String API方法
1、charAt()
给定下标值,返回对应的字符
2、length()
返回字符串长度
3、toCharArray()
把字符串转为字符数组
通过new String(char[] cs,int offset,int count,“编码”) 将数组内容转为字符串返回
String s = "sfadsfdsaf";
//给定下标值返回对应的字符
System.out.println(s.charAt(1));
//返回字符串长度
System.out.println(s.length());
//将字符串转为数组
char[] chars = s.toCharArray();
String newStr = new String(chars,0,chars.length);
System.out.println(newStr);
4、compareTo()
针对两个字符串对象进行字典比较
底层执行:
- 将两个字符串对象的内容复制给两个字符数组
- 针对两个字符数组进行求差值
- 如果差值不为0,就返回差值
- 如果差值为0,就继续往后移动下一个坐标求差值
- 如果所有对应字符都为0,就把两个数组长度的差值返回
通过CompareTo方法可以堆字符串对象进行字典排序
如果方法的返回值是负数,那么前面对象小于后面对象
如果方法的返回值是正数,那么前面对象大于后面对象
如果方法返回值是0,那么前后对象内容一致
String str1 = "abc";
String str2 = "ABC";
System.out.println(str1.equalsIgnoreCase(str2));
System.out.println(str1.compareTo(str2));
System.out.println(str1.compareToIgnoreCase(str2));
5、concat()
把新串拼接到原串的尾部
6、contains()
判断给定字符串是否是原字符串的子串
7、startsWith()/endsWith()
判断是否以字串开头或结尾
8、equals()
不仅仅比较对象的地址值还比较两个对象的内容是否完全一致(重写了Object类的方法)
9、getBytes()
按照指定码表将字符串转为字节数组进行返回
new String(byte[] bs,int offset,int length,charSet charset)
10、hashCode()
重写Object类里的方法,重新定义计算哈希码的值的算法,只和字符串对象的内容以及顺序有关
重写后的方法只和对象的内容及顺序有关系
11、indexOf()
返回子串第一次出现的下标值
12、intern()
可以把地址值的指向改变成指向方法区
String str7 = "abc";
String str6 = new String("abc");
//false
System.out.println(str7 == str6);
str6 = str6.intern();
//true
System.out.println(str7 == str6);
13、isEmpty()
判断字符串对象是否是空串
String str = "1";
//false
System.out.println(str.isEmpty());
String str1 = new String("");
//true
System.out.println(str1.isEmpty());
String str2 = null;
//报错 java.lang.NullPointerException
System.out.println(str2.isEmpty());
14、matchers()
填入正则表达式语法,根据语法匹配字符串
String string = "9";
System.out.println(string.matches("abc"));
System.out.println(string.matches("[0-9]"));
System.out.println(string.matches("[a-z0-9]"));
System.out.println(string.matches("."));
15、replaceAll()
根据正则表达式,匹配对应信息,把匹配到的信息替换为新的信息
16、split()
根据填入的表达式语法把匹配的信息变成切割符切分字符串,放进字符串数组中,进行返回
String[] split = string.split("\\d");
17、replace()
根据匹配到的信息进行替换
String replace = string.replace("1", "+");
18、subString()
根据匹配到的信息进行替换
//截取10以后的(包含10)
System.out.println(string.substring(10));
//包左不包右
System.out.println(string.substring(1,3));
19、trim()
删除前面和后面的空格
20、valueOf()
可以把其他所有类型转成字符串形式
int a = 10;
String stra = String.valueOf(a);
System.out.println(stra);
int[] arr = {1,5,2,8};
char[] cs = {'a','有','6'};
//底层没有传入string.valueOf()方法,直接拼接地址值进行输出内容
System.out.println(arr);
//底层被传入String.valueOf()方法,之后调用Object类的toString()方法拼接地址值
System.out.println(cs);
编码
文字字符转换为底层数字
文字转换成数字的规则–码表
ISO8859-1 西欧码表
GBK 国际码表
Unicode(utf-8 utf-16)