java基础——String相关遗漏

   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相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值