tip:以下是正文部分
一、String类
1、String 对象用于保存字符串,也就是一组字符序列
2、字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)都是占两个字节
3、String 类实现了接口Serializable[String 可以串行化:可以在网络传输]
实现 接口 Comparable[String 对象可以比较大小]
4、String 是final 类,不能被其他的类继承
5、String有属性private final char value[];用于存放字符串内容
6.value为final,所以不可以被修改,但是这个修改是指不能让value指向一个新的地址,但是value中单个字符内容是可以变换的
7. str.intern( ) 方法 : 如果常量池中存在str则返回str的值,如果不存在则返回指向的地址
//String类较常用构造方法
String s1 = new String();
String s2 = new String(String original):
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startlndex,int count)
二、String类新建及类型的细节
1、方式一 : 先从常量池查看是否有 " abc " 数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是 常量池 的空间地址
2、方式二 : 先在堆中创建空间,里面维护了value属性,指向常量池的 abc 空间如果常量池没有"abc",重新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。
三、String初始化之对象创建的数量
String s1 = "hello";
s1="haha";
该代码中创建了两个对象,因为String的值更改时,在常量池中旧值不会消失,而是直接指向新值。
String num = "abc" + "def";
该代码中创建了一个对象,因为编译器会将"abc" + “def” 优化为 ”abcdef“
String num1 = "abc";
String num2 = "def";
String num3 = num1 + num2;
该代码中创建了三个对象,但是需要注意的是,num3在底层是先创建了一个StringBuilder对象,使用append将两个变量加入,再返回String
四、小测试
因为char数组中的值是基本数据类型,存储在堆中,所以直接被改变了
public class Main {
public static void main(String[] args) {
Test1 ex = new Test1();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.println(ex.ch);
// hsp and hava
}
}
class Test1 {
String str = new String("hsp");
final char[] ch = {'j', 'a', 'v', 'a'};
public void change(String str, char ch[]) {
str = "java";
ch[0] = 'h';
}
}
五、format
String num = String.format("我的名字是%s,性别为%c",name,sex);