Wrapper类(以Integer类为例)与String类之间的相互转换:
// Integer -> String: Integer i = 10; // 方法一:拼接字符串 String str1 = i + ""; // 方法二:Integer中的toString方法: String str2 = i.toString(); // 方法三:String中的valueOf方法: String str3 = String.valueOf(i); // String -> Integer: String str = "123"; // 方法一:直接构造器new Integer i1 = new Integer(str); // 方法二:Integer中的parseInt方法 Integer i2 = Integer.parseInt(str);
注意:任何的包装类都存在toString方法
StringBuffer、StringBuilder与String:
String:属性private final char value[];value[] 通过final修饰,因此其指向的字符串内容在常量池中是不会改变的。
StringBuffer、StringBuilder:父类都是AbstractStringBuilder,继承父类的char[] value,没有final修饰,因此其表示的字符串可变。
String:表示字符串常量,对象一旦被创建都不可修改。如果常量池中没有所需对象,则直接创建新的String对象。
StringBuffer、StringBuilder:表示字符串变量,可以改变,字符串对象可以被多次修改而不产生新的字符串对象。
String str = "abc"; 对于String对象来说,如果改变变量str的内容,则改变的是变量指向的地址(创建新的字符串对象后,指向新的字符串引用地址)
StringBuffer str = new StringBuffer(); 对于StringBuffer对象来说,其相当于一个缓冲空间(容器),改变str的内容,调用其方法在原来的字符串后追加,改变原来的字符串。
因此:String的更新实际上更新的是地址,效率低。
StringBuffer、StringBuilder的更新实际上更新的是内容、效率高。
使用StringBuffer(StringBuilder)创建字符串对象:
使用类中的构造器:
// StringBuffer的构造器: // StringBuffer():构造一个不带字符的字符串缓冲区,其初始容量(char[]的大小)为16 StringBuffer stringBuffer = new StringBuffer(); // StringBuffer(CharSequence seq):构造一个字符串缓冲区,包含与CharSequence相同的字符 // StringBuffer(int capacity):构造一个不带字符的字符串缓冲区,指定初始容量(char[]的大小)为capacity StringBuffer stringBuffer_ = new StringBuffer(100); // StringBuffer(String str):构造一个字符串缓冲区,指定内容为str,此时该char[]的长度为(str.length + 16) StringBuffer hello = new StringBuffer("hello");
String与StringBuffer(StringBuilder)之间的相互转换:
// String -> StringBuffer: String str = "hello"; // 方法一:使用构造器 StringBuffer str1 = new StringBuffer(str); // 方法二:使用append方法: StringBuffer str2 = new StringBuffer(); str2 = str2.append(str); // StringBuffer -> String: StringBuffer str = new StringBuffer(); // 方法一:使用构造器 String str1 = new String(str); // 方法二:使用toString方法 String str2 = str.toString();
StringBuffer(StringBuilder)的常用方法:可以改变字符串中的内容
StringBuffer str = new StringBuffer("hello"); // append:增 str.append(","); str.append("张三丰"); str.append(true).append(10.25); // 将true、10.25转为String类型添加到str后 str.append("你好"); // hello,张三丰true10.25你好 // delete:删 // delete(start, end):删除start<=索引StringBuilder VS StringBuffer:
都表示一个可变的字符序列,结构相同,两者的API兼容
StringBuilder没有做线程同步,存在线程安全问题,其中的方法没有关键字synchronized修饰,效率更高
StringBuffer解决了线程互斥问题,方法通过关键字synchronized修饰处理。
String VS StringBuffer VS StringBuilder的使用情况:
需要对字符串对象进行大量的修改,使用String操作会将大量的字符串对象留存在内存,造成空间的浪费,降低效率。
因此,对字符串进行少量的修改时,并被多个对象引用,使用String
需要对字符串进行大量的修改,并且在单线程情况下,使用StringBuilder,效率高
需要对字符串进行大量的修改,并且在多线程情况下,使用StringBuilder,保证线程安全。