1 String 类的构造方法
——String()
初始化新创建的 String对象,使其表示空字符序列。
例如:
String s = new String();
// s = null;
——String(char[] value)
分配一个新的 String ,以便它表示当前包含在字符数组参数中的字符序列。
例如:
char value[] = {'a','b','c','d'};
String s = new String(value);
// s = "abcd";
—— String(StringBuilder builder)
分配一个新的字符串,其中包含当前包含在字符串构建器参数中的字符序列。
——String(StringBuffer buffer)
分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
2 字符串的编码与解码
编码:数据在传输的过程中,要转为二进制。(即 字符串 - > byte数组)
例如:
String s = "你好";
byte bytes[] = s.getBytes("UTF-8"); //不写时使用平台默认编码
解码:数据在接受的过程中,将二进制转为需要的格式
例如:
String s = "你好";
byte bytes[] = s.getBytes("UTF-8");
String s2 = new String(bytes,"UTF-8");//在解码时,必须和编码使用一致的编码
3 String类对象创建过程中的内存分配
例1:
String name = "张三";
String names = new String("张三");
System.out.println(name == names);
// 输出结果为false;即name 的地址指向与 names的地址指向不一致
如上图所示,name在创建的过程中,地址直接指向字符串常量池的"张三"; names在创建的过程中,在堆中创建一个对象,names的地址指向对象,对象的地址指向字符串常量池的"张三"。
例2:
String s1 = "a" + "bc";
String s2 = s1 + "张三";
String s3 = "张三" + "abc";
System.out.println(s2 == s3);
// 输出结果为false;
因为s3创建时,地址指向字符串常量池的 "张三abc" ; s3创建时,因为含有变量s2,因此会在堆中创建一个指向 "张三abc" 的对象,s3再指向这个创建的对象。因此s2与s3不相等;
总结
String 类的对象改变值时,不能直接改变字符串常量池中的常量,而是通过创建一个常量,然后地址指向这个常量,同时对String对象的值进行改变时,堆中会创建一个新的对象,极其占据内存。