1. String的两种创建方式
public class StringDemo1 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("world");
String str4 = new String("world");
System.out.println(str1 == str2);//true
System.out.println(str1.equals(str2));//true
System.out.println(str3 == str4);//false
System.out.println(str3.equals(str4));//true
}
}
- str1:系统会在常量池里面创建一个hello的字符串对象。
- str2:str1和str2指向的是同一块内存区域
- str3::系统会在常量池里面创建一个world字符串对象,然后在堆内存里面再创建一个world字符串对象,即创建两个对象。
- str4:在常量池的对象和str3一样,但在堆区中创建了一个和str3地址不一样的world字符串对象。
2. String的一些特性
- 1>.String类是final修饰的,这说明String类不能被继承。
- 2>.字符串的底层是用一个final修饰的字符数组,所以字符串一旦创建好之后,
里面的内容是不能被修改的。
/** The value is used for character storage. */
private final char value[];
- 3>.尽量不要做字符串频繁的拼接操作。因为字符串一旦创建不可改变,如果频繁拼接,就会在字符串常量池中创建大量的字符串对象,给垃圾回收带来问题。
3. String类常用方法
- 1> char charAt(int index);获取index位置的字符
- 2> boolean contains(CharSequence s);判断字符串中是否包含某个字符串
- 3> boolean endsWith(String endStr);判断是否是以某个字符串结尾
- 4> boolean equalsIgnoreCase(String anotherString);忽略大小写比较两个字符串是否相等
- 5> byte[] getBytes();转换成byte数组
- 6> int indexOf(String str);取得指定字符在字符串的位置
- 7> int indexOf(String str, int fromIndex);从指定的下标开始取得指定字符在字符串的位置
- 8> int lastIndexOf(String str);从后面开始取得指定字符在字符串最后出现的的位置
- 9> int lastIndexOf(String str, int fromIndex);从后面开始指定的下标开始取得指定字符在字符串的位置
- 10> int length();获取字符串的长度
- 11> String replaceAll(String s1,String s2);替换字符串中的内容
- 12> String[] split(String s);根据指定的表达式拆分字符串
- 13> boolean startsWith(String s);判断是否是以某个字符串开始
- 14> String substring(int begin);根据传入的索引位置截子串
- 15> String substring(int beginIndex, int endIndex);根据传入的起始和结束位置截子串
- 16> char[] toCharArray();将字符串转换为char数组
- 17> void toUpperCase();转换为大写
- 18> void toLowerCase();转换为小写
- 19> String trim();去除首尾空格
- 20> String valueOf(Object obj);将其他类型转换为字符串类型
4. String,StringBuffer 和 StringBuilder
- 1>. StringBuilder是非线程安全的,String和StringBuffer是线程安全,单线程优先用StringBuilder,效率高。
- 2>.如果有大量的字符串拼接,如果能预知大小的话最好在new StringBuffer 或者StringBuilder 的时候设置好capacity,避免多次扩容的开销。扩容要抛弃原有数组,还要进行数组拷贝创建新的数组。
- 3>. 如果是少量的字符串拼接,用String就可以了。
String源码分析:
https://blog.csdn.net/u012317510/article/details/83552104
StringBuffer源码分析:
https://blog.csdn.net/u012317510/article/details/83722399
StringBuilder源码分析:
https://blog.csdn.net/u012317510/article/details/83721250