字符串的比较操作
- 使用“==”运算符 :只能比较引用的内存地址是否相同。
- 使用equals()方法 : 在Object类中和“==”运算符相同。但是建议子类覆盖equals()方法去比较自己的内容。
String类覆盖了equals()方法,比较的是字符内容。
使用equals()方法注意事项:
错误用法:str.equals("abc");
正确用法:"abc".equals(str);
String内存分析
下列两行代码分别创建了几个String对象?
String str1 = "ABCD";
String str2 = new String("ABCD");
String str1 = "ABCD";
: 最多创建一个String对象,最少不创建String对象。如果常量池中已经存在“ABCD”,那么str1直接引用,此时不创建String对象。否则,先在常量池中创建“ABCD”的内存空间,再引用。
String str2 = new String("ABCD");
:最多创建两个String对象,最少创建一个String对象。new关键字绝对会在堆空间创建内存区域,所以至少创建一个String对象。
String类中的常用方法
- 把 char数组 或 byte数组 转换为String。
String str = new String(byte[] bytes) ;
String str = new String(char[] value) ;
- 获取字符串信息
str.lenth();//返回字符串的长度。 return: int
str.charAt(int index);//返回指定索引处的char值。 return: char
str.indexOf(String str);//返回指定子字符串第一次出现的字符串内的索引。 return: int
str.lastIndexOf(String str);//返回指定子字符串最后一次出现的字符串中的索引。return: int
str.toLowerCase();//将所有在此字符小写。return: String
str.toUpperCase();//将所有在此字符大写。return: String
str.trim();//删除首位空格。 return: String
str.equalsIgnoreCase(String anotherString);//比较字符串,忽略大小写。return: boolean
str.isEmpty();//判断字符串是否为空。 return: boolean
分别使用String/StringBuilder/StringBuffer来拼接30000次字符串,对比各自损耗时间。
经过测试:
String做字符串拼接的时候性能极低(耗时),原因是String是不可变的,每次内容改变都会在内存中创建新的对象。
String耗时:1946ms
StringBuffer耗时:3ms
StringBuilder耗时:1ms
结论:拼接字符串,统统使用StringBuilder/StringBuffer,不要使用String。
String和StringBuilder以及StringBuffer的区别
StringBuilder和StringBuffer都表示可变的字符串,功能方法都是相同的。
StringBuffer中的方法都使用了synchronized修饰符,是线程安全的,但是性能会相比StringBuilder较低。
StringBuilder中的方法没有使用synchronized修饰符,线程不安全,但性能会相比StringBuffer较高。
建议使用StringBuilder。
StringBuilder的常用操作
- 构造方法
使用StringBuilder无参数构造器,在底层创建了一个长度为16的char数组。
StringBuilder sb = new StringBuilder(); //等价于 new StringBuilder(16);
指定长度超过16个字节时,底层会进行 自动扩容(创建长度更大的数组,再把之前的数组拷贝到新数组)。自动扩容的方式:原长度 * 2+2 。扩容性能极低,
一般的,我们如果大概知道需要存储多少字符,在构造器中就应该设置明确的长度。 - append(Object obj);
StringBuilder sb = new StringBuilder();
sb.append("a").append(666);
System.out.println(sb);
-------------------------
a666
- capacity(); //返回当前容量。
- delete(int start, int end); //删除指定索引区间的全部字符。
- deleteCharAt(int index); //删除指定位置的字符。
- reverse() ;//将该字符串反转(“abc”—>“cba”)。