zoukankan      html  css  js  c++  java
  • 你真的了解JAVA里的String么

    Java中String类细节问题 (考察点Java内存分配问题)

    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"; 
      String str5 = s + "b"; 
      System.out.println(str5 == "ab");

    步骤: 
    同4


    6. String s1 = "a"; 
      String s2 = "b"; 
      String str6 = s1 + s2; 
      System.out.println(str6 == "ab");

    步骤: 
    1) 栈中开辟一块中间存放引用s1,s1指向池中String常量"a", 
    2) 栈中开辟一块中间存放引用s2,s2指向池中String常量"b", 
    3) 栈中开辟一块中间存放引用str5, 
    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对象

  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/564085446java/p/3597899.html
Copyright © 2011-2022 走看看