目录
1相等性规则
1==比较基本数据类型,判断的是值是否相等(基本数据类型只能用==比较)
2==比较引用类型,判断的是内存地址是否相等
equals方法 Object类继承下来的
1默认的equals方法与==一样,比较的是内存地址
2按照自己的相等性规则进行比较,需要自定义equals方法(String类的equals方法比较的是值)
2String类型
Srting类型是一个引用类型,即栈中存放对象名和对象的引用,堆中存放String对象
String类型的对象,底层实际是一个final修饰的char类型的数组
String类也加final关键字修饰
2.1常用方法
方法 | 返回值 | 作用 | 示例 |
equals(); | boolean | 判断字符串是否相等,区分大小写 | String a = "hi"; String b = "hello"; boolean tar = a.equals(b); |
length() | int | 返回字符串的长度 | int len = a.length(); |
trim() | String | 去除字符串两端的空格 | String b = a.trim(); |
replace() | String | 将字符串中的 oldChar 替换为 newChar 把能匹配的全部替换 | replace(char oldChar, char newChar): |
concat() | String | 拼接字符串 | a.concat("123") |
toLowerCase(): | String | 将字符串转换为小写 | a.toLowerCase |
toUpperCase(): | String | 将字符串转换为大写 | a.toUpperCase |
split() | String[] | 将字符串按照 regex 分割为字符串数组 | split(String regex) |
contains | boolean | 判断字符串是否包含指定字符串 | a.contains("a") |
substring() | String | 返回从 beginIndex 到 endIndex-1 的子字符串 | substring(int beginIndex, int endIndex): |
indexOf() | int | 返回字符串中第一次出现 str 的位置,若无则返回 -1 | indexOf(String str); |
lastindexOf() | int | 返回字符串中最后一次出现 str 的位置,若无则返回 -1 | lastIndexOf(String str); |
charAt() | char | 获取字符串中指定下标的字符 | char c = a.charAt(2); |
isEmpty | boolean | 判断字符串是否为空,等同于 length() == 0 | isEmpty() |
toCharArray() | char[] | 将字符串转成字符数组 | char[] d = a.toCharArray(); |
String.valueOf() | String | 将变量转化为String类型 | int a=1; String b = null; b = String.valueOf(a); |
3 字符串常量池
3.1 字符串常量池的设计思想
字符串的分配·,和其他对象分配一样,耗费高昂的时间与空间代价,作为最基础的数据类型,大量频繁的创建字符串,极大程度地影响程序的性能。
3.2 常量池工作原理
JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化
为字符串开辟一个字符串常量池,类似于缓存区
创建字符串常量时,首先检查字符传常量池是否存在该字符串
存在该字符串,返回引用实例,不存在,实例化该字符串并放入池中
String l="abc";
//在字符串常量池中 放上abc 把地址给l
String m = "abc";
//看看常量池里面有没有abc,有把原来的abc的地址返回给m
System.out.println(l==m);
结果为true
3.3 实现的基础
实现该优化的基础是因为字符串是不可变的(final+private),可以不用担心数据冲突进行共享运行时实例创建的全局字符串常量池中有一个表,总是以池中每个唯一的字符串对象维护一个引用,这就意味着它们一直引用着常量池中的对象,所以,在常量池中的这些字符串不会被垃圾收集器回收。
4 StringBuffer与StringBuilder
String和StringBuffer StringBuilder他们都可以储存和操作字符串,即包含多种字符串的字符串数据。String类是字符串常量,是不可改变的常量。而StringBuffer/StringBuilder是字符串变量,他的对象是可以扩充和修改的。
StringBuilder d = new StringBuilder();
d.append("a");
d.append("b");
d.append("c");
System.out.println(d);
输出结果为abc。
特点
1 修改String对象的值,内存地址会发生改变
2StringBuffer和StringBuilder类的对象能够被多次修改,并且不产生新的对象,即内存地址不变
3StringBuffer是线程安全的 StringBuilder是xaioxaio线程不安全的
4StringBuilder的执行速度比StringBuffer快
方法 | 返回值 | 作用 | 示例 |
append() | StringBuffer | 拼接字符串到末尾 | StringBuffer a; a.append("abc"); |
revewrse() | StringBuffer | 将字符串中的字符顺序反转 | |
delete() | StringBuffer | 删除字符串中指定下标范围的字符串 | a.delete(1,2); |
insert() | 在字符串指定下标位置插入字符串 | a.insert(1,"abc"); | |
replace() | 替换指定索引区间内的字符串 | a.replace(1,3,"abc"); | |
length() | int | 字符串长度 | a.length(); |
toString() | 转成String字符串 | a.toString(); |
intern()方法
因为不是所有的字符串创建方式都会在常量池中生成对应的字符串,而intern方法用于根据所给的字符串在常量池中创建对应的字符串。jdk1.7以后,调用intern方法时,如果该字符串已经存在于常量池中,则将常量池中的引用直接返回;如果不存在,则在常量池中生成一个对原字符串的引用。
5 String和Stringbuffer的转换
String类有一些Stringbuffer类没有的方法,比如:ValueOf(),getBytes()等,可以将StringBuffer转换成String,就可以使用String的功能。反之依然。
String>>>StringBuffer
1,通过构造方法StringBuffer s=new StringBuffer(String s)
2,通过append()方法 String str=new String(buffer)
StringBuffer>>>String
1,通过构造方法String str= new String(StringBuffer buffer)
2,通过toString方法
public static void main(String[] args) {
//String>>>StringBuffer
String s="hello";
//方法一:通过构造方法
StringBuffer sb1=new StringBuffer(s);
//方法二 通过append()方法
StringBuffer sb2=new StringBuffer();
sb2.append(s);
System.out.println(sb1);
System.out.println(sb2);
//StringBuffer>>>String
StringBuffer sb3=new StringBuffer("你好");
//方法一 通过构造方法
String s2=new String(sb3);
//方法二 通过toString方法
String s3= sb3.toString();
System.out.println(s2);
System.out.println(s3);
}