public void test2(){
String s="fefe";
System.out.println("wahhahhhhha");
for (int i = 0; i < 3; i++) {
s+="fefefe;";
}
System.out.println(s);
}
编译出来的字节码
public void test2();
Code:
0: ldc #24 // String fefe
2: astore_1
3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
6: ldc #25 // String wahhahhhhha
8: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
11: iconst_0
12: istore_2
13: iload_2
14: iconst_3
15: if_icmpge 44
18: new #4 // class java/lang/StringBuilder
21: dup
22: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
25: aload_1
26: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
29: ldc #26 // String fefefe;
31: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
34: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
37: astore_1
38: iinc 2, 1
41: goto 13
44: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
47: aload_1
48: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
51: return
每一次循环都会在18 的位置在new 一个对象。所以 在循环的时候最好不要使用+号,应该先new StringBuilder 使用append()。做添加。
java不支持对符号的重载,java中string的+事一种语法糖,如果是两个常量相加例如:“q”+"p"那么是直接将两个合成一个字符串,如果是常量加上变量 就是使用StringBuilder的append方法将字符创拼接。
switch对字符串的支持,是底层调用字符串的hashcode的方法。
String 字符创类 是final修饰的,不能做修改,string的所有方法都是新建了一个string对象。
String.valueOf()都是调用的,基础数据类型的包装类的toString方法
String s="test";
String s1 ="test";
System.out.println(s==s1);
这里输出的true 这里表明s 和 s2的栈地址是一样的。 是因为java编译器 会将这种将字符串的值变成一个常量存储到内存中。两个字符串的值相同就不会产生新的对象,这样节约了内存。
在检查内存中是否有相同的值时,String的intern()方法会查找在常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。