zoukankan      html  css  js  c++  java
  • 有关String的那点事

    (1)String str1 = "abc";
      System.out.println(str1 == "abc");

      步骤:
      1) 栈中开辟一块空间存放引用str1;
      2) String池中开辟一块空间,存放String常量"abc";
      3) 引用str1指向池中String常量"abc";
      4) str1所指代的地址即常量"abc"所在地址,输出为true;

    (2)String str2 = new String("abc");
      System.out.println(str2 == "abc");

      步骤:
      1) 栈中开辟一块空间存放引用str2,
      2) 堆中开辟一块空间存放一个新建的String对象"abc",
      3) 引用str2指向堆中的新建的String对象"abc",
      4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false

    (3)String str3 = new String("abc");
      System.out.println(str3 == str2);

      步骤:
      1) 栈中开辟一块空间存放引用str3;
      2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象;
      3) 引用str3指向另外新建的那个String对象;
      4) str3和str2指向堆中不同的String对象,地址也不相同,输出为false;

    (4)String str4 = "a" + "b";
      System.out.println(str4 == "ab");

      步骤:
      1) 栈中开辟一块空间存放引用str4;
      2) 根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"ab";
      3) 引用str4指向池中常量"ab";
      4) str4所指即池中常量"ab",输出为true;

    (5)final String s = "a";   //final修饰的String字符串会自动存放在常量池中,s变量在栈中创建
      String str5 = s + "b";
      System.out.println(str5 == "ab");

      步骤:
      同4 true
      注释:如果去掉final 返回false,如6解释

    (6)String s1 = "a";
      String s2 = "b";
      String str6 = s1 + s2;   //变量相加底层会自动 new StringBuilder() 创建新的对象,栈中str6变量指向着堆中该对象的地址;
      System.out.println(str6 == "ab");

      步骤:
      1) 栈中开辟一块中间存放引用s1,s1指向池中String常量"a";
      2) 栈中开辟一块中间存放引用s2,s2指向池中String常量"b";
      3) 栈中开辟一块中间存放引用str6;
      4) s1 + s2 通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象;
      5) 引用str6指向堆中(s1 + s2)所还原的新String对象;
      6) str6指向的对象在堆中,而常量"ab"在池中,输出为false;

    (7)String str7 = "abc".substring(0, 2);

      步骤:
      1) 栈中开辟一块空间存放引用str7;
      2) substring()方法还原一个新的String对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象;
      3) 引用str7指向堆中的新String对象;

    (8)String str8 = "abc".toUpperCase();

      步骤:
      1) 栈中开辟一块空间存放引用str6;
      2) toUpperCase()方法还原一个新的String对象"ABC",池中并未开辟新的空间存放String常量"ABC";
      3) 引用str8指向堆中的新String对象;

    综上所述:String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的;

      一般情况下遇到字符串多次修改的情况下,尽可能的使用StringBuilder() 或者 StringBuffer()进行处理;

  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/blogtech/p/11989206.html
Copyright © 2011-2022 走看看